X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=pcrs.c;h=a748a3b956ad5d4f118421a9edf5d91cf2071cb1;hb=c326c61bec790a27f5fb54674dc0004846317249;hp=aecf206456b7edc53fc920a28fc8be16dfa56227;hpb=e1fcf9e251441c56e4a81962a268feee59568dfa;p=privoxy.git diff --git a/pcrs.c b/pcrs.c index aecf2064..a748a3b9 100644 --- a/pcrs.c +++ b/pcrs.c @@ -1,43 +1,58 @@ -const char pcrs_rcs[] = "$Id: pcrs.c,v 1.11 2001/08/15 15:32:03 oes Exp $"; +const char pcrs_rcs[] = "$Id: pcrs.c,v 1.15 2001/09/20 16:11:06 steudten Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/pcrs.c,v $ * - * Purpose : pcrs is a supplement to the brilliant pcre library by Philip - * Hazel and adds Perl-style substitution. That - * is, it mimics Perl's 's' operator. + * Purpose : pcrs is a supplement to the pcre library by Philip Hazel + * and adds Perl-style substitution. That + * is, it mimics Perl's 's' operator. See pcrs(3) for details. * - * Currently, there's no documentation besides comments and the - * source itself :-( - * - * Note: In addition to perl's options, 'U' for ungreedy and 'T' - * for trivial (i.e.: ignore backrefs in the substitute) are - * supported. * * Copyright : Written and Copyright (C) 2000, 2001 by Andreas S. Oesterhelt * * * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. + * and/or modify it under the terms of the GNU Lesser + * General Public License (LGPL), version 2.1, which should + * be included in this distribution (see LICENSE.txt), with + * the exception that the permission to replace that license + * with the GNU General Public License (GPL) given in section + * 3 is restricted to version 2 of the GPL. * * This program is distributed in the hope that it will * be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. + * PARTICULAR PURPOSE. See the license for more details. * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html + * The GNU Lesser General Public License should be included + * with this file. If not, you can view it at + * http://www.gnu.org/licenses/lgpl.html * or write to the Free Software Foundation, Inc., 59 * Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Revisions : * $Log: pcrs.c,v $ + * Revision 1.15 2001/09/20 16:11:06 steudten + * + * Add casting for some string functions. + * + * Revision 1.14 2001/09/09 21:41:57 oes + * Fixing yet another silly bug + * + * Revision 1.13 2001/09/06 14:05:59 oes + * Fixed silly bug + * + * Revision 1.12 2001/08/18 11:35:00 oes + * - Introduced pcrs_strerror() + * - made some NULL arguments non-fatal + * - added support for \n \r \e \b \t \f \a \0 in substitute + * - made quoting adhere to standard rules + * - added warning for bad backrefs + * - added pcrs_execute_list() + * - fixed comments + * - bugfix & cosmetics + * * Revision 1.11 2001/08/15 15:32:03 oes * - Added support for Perl's special variables $+, $' and $` * - Improved the substitute parser @@ -103,10 +118,11 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.11 2001/08/15 15:32:03 oes Exp $"; #include #include +#include + #include "pcrs.h" -#include -const char pcrs_h_rcs[] = PCRS_H_VERSION; +const char pcrs_h_rcs[] = PCRS_H_VERSION; /********************************************************************* * @@ -150,7 +166,7 @@ const char *pcrs_strerror(const int error) default: return "Unknown error"; } } - /* error > 0: No error */ + /* error >= 0: No error */ return "(pcrs:) Everything's just fine. Thanks for asking."; } @@ -195,7 +211,7 @@ int pcrs_parse_perl_options(const char *optstring, int *flags) case 's': rc |= PCRE_DOTALL; break; case 'x': rc |= PCRE_EXTENDED; break; case 'U': rc |= PCRE_UNGREEDY; break; - case 'T': *flags |= PCRS_TRIVIAL; break; + case 'T': *flags |= PCRS_TRIVIAL; break; default: break; } } @@ -262,7 +278,7 @@ pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialfl *errptr = PCRS_ERR_NOMEM; return NULL; } - memset(r, '\0', length + 1); + memset(text, '\0', length + 1); /* @@ -335,9 +351,9 @@ pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialfl r->block_length[l] = k - r->block_offset[l]; /* Numerical backreferences */ - if (isdigit(replacement[i + 1])) + if (isdigit((int) replacement[i + 1])) { - while (i < length && isdigit(replacement[++i])) + while (i < length && isdigit((int) replacement[++i])) { r->backref[l] = r->backref[l] * 10 + replacement[i] - 48; } @@ -689,15 +705,16 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c old = subject; *result_length = subject_length; - hits = 0; + hits = total_hits = 0; for (job = joblist; job != NULL; job = job->next) { hits = pcrs_execute(job, old, *result_length, &new, result_length); + if (old != subject) free(old); + if (hits < 0) { - *result = NULL; return(hits); } else @@ -708,7 +725,8 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c } *result = new; - return(hits); + return(total_hits); + } @@ -739,7 +757,8 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length) { int offsets[3 * PCRS_MAX_SUBMATCHES], - offset, i, k, + offset, + i, k, matches_found, newsize, submatches, @@ -803,7 +822,7 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res /* Storage for matches exhausted? -> Extend! */ if (++i >= max_matches) { - max_matches *= PCRS_MAX_MATCH_GROW; + max_matches = (int) (max_matches * PCRS_MAX_MATCH_GROW); if (NULL == (dummy = (pcrs_match *)realloc(matches, max_matches * sizeof(pcrs_match)))) { free(matches); @@ -818,7 +837,10 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res /* Don't loop on empty matches */ if (offsets[1] == offset) - if (offset < subject_length) + /* FIXME: is offset an int or a size_t? Previous line compares + * against int, the next one compares against size_t. + */ + if ((size_t)offset < subject_length) offset++; else break;