/[pcre]/code/trunk/pcre_get.c
ViewVC logotype

Diff of /code/trunk/pcre_get.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 359 by ph10, Wed Jul 9 16:20:19 2008 UTC revision 836 by ph10, Wed Dec 28 17:16:11 2011 UTC
# Line 6  Line 6 
6  and semantics are as close as possible to those of the Perl 5 language.  and semantics are as close as possible to those of the Perl 5 language.
7    
8                         Written by Philip Hazel                         Written by Philip Hazel
9             Copyright (c) 1997-2008 University of Cambridge             Copyright (c) 1997-2012 University of Cambridge
10    
11  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
12  Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
# Line 65  Returns:      the number of the named pa Line 65  Returns:      the number of the named pa
65                  (PCRE_ERROR_NOSUBSTRING) if not found                  (PCRE_ERROR_NOSUBSTRING) if not found
66  */  */
67    
68    #ifdef COMPILE_PCRE8
69  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
70  pcre_get_stringnumber(const pcre *code, const char *stringname)  pcre_get_stringnumber(const pcre *code, const char *stringname)
71    #else
72    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
73    pcre16_get_stringnumber(const pcre *code, PCRE_SPTR16 stringname)
74    #endif
75  {  {
76  int rc;  int rc;
77  int entrysize;  int entrysize;
78  int top, bot;  int top, bot;
79  uschar *nametable;  pcre_uchar *nametable;
80    
81    #ifdef COMPILE_PCRE8
82  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
83    return rc;    return rc;
84  if (top <= 0) return PCRE_ERROR_NOSUBSTRING;  if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
# Line 81  if ((rc = pcre_fullinfo(code, NULL, PCRE Line 87  if ((rc = pcre_fullinfo(code, NULL, PCRE
87    return rc;    return rc;
88  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
89    return rc;    return rc;
90    #endif
91    #ifdef COMPILE_PCRE16
92    if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
93      return rc;
94    if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
95    
96    if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
97      return rc;
98    if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
99      return rc;
100    #endif
101    
102  bot = 0;  bot = 0;
103  while (top > bot)  while (top > bot)
104    {    {
105    int mid = (top + bot) / 2;    int mid = (top + bot) / 2;
106    uschar *entry = nametable + entrysize*mid;    pcre_uchar *entry = nametable + entrysize*mid;
107    int c = strcmp(stringname, (char *)(entry + 2));    int c = STRCMP_UC_UC((pcre_uchar *)stringname,
108    if (c == 0) return (entry[0] << 8) + entry[1];      (pcre_uchar *)(entry + IMM2_SIZE));
109      if (c == 0) return GET2(entry, 0);
110    if (c > 0) bot = mid + 1; else top = mid;    if (c > 0) bot = mid + 1; else top = mid;
111    }    }
112    
# Line 114  Returns:      the length of each entry, Line 132  Returns:      the length of each entry,
132                  (PCRE_ERROR_NOSUBSTRING) if not found                  (PCRE_ERROR_NOSUBSTRING) if not found
133  */  */
134    
135    #ifdef COMPILE_PCRE8
136  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
137  pcre_get_stringtable_entries(const pcre *code, const char *stringname,  pcre_get_stringtable_entries(const pcre *code, const char *stringname,
138    char **firstptr, char **lastptr)    char **firstptr, char **lastptr)
139    #else
140    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
141    pcre16_get_stringtable_entries(const pcre *code, PCRE_SPTR16 stringname,
142      PCRE_SCHAR16 **firstptr, PCRE_SCHAR16 **lastptr)
143    #endif
144  {  {
145  int rc;  int rc;
146  int entrysize;  int entrysize;
147  int top, bot;  int top, bot;
148  uschar *nametable, *lastentry;  pcre_uchar *nametable, *lastentry;
149    
150    #ifdef COMPILE_PCRE8
151  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
152    return rc;    return rc;
153  if (top <= 0) return PCRE_ERROR_NOSUBSTRING;  if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
# Line 131  if ((rc = pcre_fullinfo(code, NULL, PCRE Line 156  if ((rc = pcre_fullinfo(code, NULL, PCRE
156    return rc;    return rc;
157  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)  if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
158    return rc;    return rc;
159    #endif
160    #ifdef COMPILE_PCRE16
161    if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
162      return rc;
163    if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
164    
165    if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
166      return rc;
167    if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
168      return rc;
169    #endif
170    
171  lastentry = nametable + entrysize * (top - 1);  lastentry = nametable + entrysize * (top - 1);
172  bot = 0;  bot = 0;
173  while (top > bot)  while (top > bot)
174    {    {
175    int mid = (top + bot) / 2;    int mid = (top + bot) / 2;
176    uschar *entry = nametable + entrysize*mid;    pcre_uchar *entry = nametable + entrysize*mid;
177    int c = strcmp(stringname, (char *)(entry + 2));    int c = STRCMP_UC_UC((pcre_uchar *)stringname,
178        (pcre_uchar *)(entry + IMM2_SIZE));
179    if (c == 0)    if (c == 0)
180      {      {
181      uschar *first = entry;      pcre_uchar *first = entry;
182      uschar *last = entry;      pcre_uchar *last = entry;
183      while (first > nametable)      while (first > nametable)
184        {        {
185        if (strcmp(stringname, (char *)(first - entrysize + 2)) != 0) break;        if (STRCMP_UC_UC((pcre_uchar *)stringname,
186            (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break;
187        first -= entrysize;        first -= entrysize;
188        }        }
189      while (last < lastentry)      while (last < lastentry)
190        {        {
191        if (strcmp(stringname, (char *)(last + entrysize + 2)) != 0) break;        if (STRCMP_UC_UC((pcre_uchar *)stringname,
192            (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break;
193        last += entrysize;        last += entrysize;
194        }        }
195    #ifdef COMPILE_PCRE8
196      *firstptr = (char *)first;      *firstptr = (char *)first;
197      *lastptr = (char *)last;      *lastptr = (char *)last;
198    #else
199        *firstptr = (PCRE_SCHAR16 *)first;
200        *lastptr = (PCRE_SCHAR16 *)last;
201    #endif
202      return entrysize;      return entrysize;
203      }      }
204    if (c > 0) bot = mid + 1; else top = mid;    if (c > 0) bot = mid + 1; else top = mid;
# Line 182  Returns:       the number of the first t Line 226  Returns:       the number of the first t
226                 or a negative number on error                 or a negative number on error
227  */  */
228    
229    #ifdef COMPILE_PCRE8
230  static int  static int
231  get_first_set(const pcre *code, const char *stringname, int *ovector)  get_first_set(const pcre *code, const char *stringname, int *ovector)
232    #else
233    static int
234    get_first_set(const pcre *code, PCRE_SPTR16 stringname, int *ovector)
235    #endif
236  {  {
237  const real_pcre *re = (const real_pcre *)code;  const real_pcre *re = (const real_pcre *)code;
238  int entrysize;  int entrysize;
239  char *first, *last;  pcre_uchar *first, *last;
240  uschar *entry;  pcre_uchar *entry;
241    #ifdef COMPILE_PCRE8
242  if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)  if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
243    return pcre_get_stringnumber(code, stringname);    return pcre_get_stringnumber(code, stringname);
244  entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);  entrysize = pcre_get_stringtable_entries(code, stringname,
245      (char **)&first, (char **)&last);
246    #else
247    if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
248      return pcre16_get_stringnumber(code, stringname);
249    entrysize = pcre16_get_stringtable_entries(code, stringname,
250      (PCRE_SCHAR16 **)&first, (PCRE_SCHAR16 **)&last);
251    #endif
252  if (entrysize <= 0) return entrysize;  if (entrysize <= 0) return entrysize;
253  for (entry = (uschar *)first; entry <= (uschar *)last; entry += entrysize)  for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
254    {    {
255    int n = (entry[0] << 8) + entry[1];    int n = GET2(entry, 0);
256    if (ovector[n*2] >= 0) return n;    if (ovector[n*2] >= 0) return n;
257    }    }
258  return (first[0] << 8) + first[1];  return GET2(entry, 0);
259  }  }
260    
261    
# Line 231  Returns:         if successful: Line 288  Returns:         if successful:
288                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
289  */  */
290    
291    #ifdef COMPILE_PCRE8
292  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
293  pcre_copy_substring(const char *subject, int *ovector, int stringcount,  pcre_copy_substring(const char *subject, int *ovector, int stringcount,
294    int stringnumber, char *buffer, int size)    int stringnumber, char *buffer, int size)
295    #else
296    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
297    pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
298      int stringnumber, PCRE_SCHAR16 *buffer, int size)
299    #endif
300  {  {
301  int yield;  int yield;
302  if (stringnumber < 0 || stringnumber >= stringcount)  if (stringnumber < 0 || stringnumber >= stringcount)
# Line 241  if (stringnumber < 0 || stringnumber >= Line 304  if (stringnumber < 0 || stringnumber >=
304  stringnumber *= 2;  stringnumber *= 2;
305  yield = ovector[stringnumber+1] - ovector[stringnumber];  yield = ovector[stringnumber+1] - ovector[stringnumber];
306  if (size < yield + 1) return PCRE_ERROR_NOMEMORY;  if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
307  memcpy(buffer, subject + ovector[stringnumber], yield);  memcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield));
308  buffer[yield] = 0;  buffer[yield] = 0;
309  return yield;  return yield;
310  }  }
# Line 276  Returns:         if successful: Line 339  Returns:         if successful:
339                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
340  */  */
341    
342    #ifdef COMPILE_PCRE8
343  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
344  pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector,  pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector,
345    int stringcount, const char *stringname, char *buffer, int size)    int stringcount, const char *stringname, char *buffer, int size)
346    #else
347    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
348    pcre16_copy_named_substring(const pcre *code, PCRE_SPTR16 subject, int *ovector,
349      int stringcount, PCRE_SPTR16 stringname, PCRE_SCHAR16 *buffer, int size)
350    #endif
351  {  {
352  int n = get_first_set(code, stringname, ovector);  int n = get_first_set(code, stringname, ovector);
353  if (n <= 0) return n;  if (n <= 0) return n;
354    #ifdef COMPILE_PCRE8
355  return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);  return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
356    #else
357    return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size);
358    #endif
359  }  }
360    
361    
# Line 308  Returns:         if successful: 0 Line 381  Returns:         if successful: 0
381                     PCRE_ERROR_NOMEMORY (-6) failed to get store                     PCRE_ERROR_NOMEMORY (-6) failed to get store
382  */  */
383    
384    #ifdef COMPILE_PCRE8
385  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
386  pcre_get_substring_list(const char *subject, int *ovector, int stringcount,  pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
387    const char ***listptr)    const char ***listptr)
388    #else
389    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
390    pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount,
391      PCRE_SPTR16 **listptr)
392    #endif
393  {  {
394  int i;  int i;
395  int size = sizeof(char *);  int size = sizeof(pcre_uchar *);
396  int double_count = stringcount * 2;  int double_count = stringcount * 2;
397  char **stringlist;  pcre_uchar **stringlist;
398  char *p;  pcre_uchar *p;
399    
400  for (i = 0; i < double_count; i += 2)  for (i = 0; i < double_count; i += 2)
401    size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;    size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1);
402    
403  stringlist = (char **)(pcre_malloc)(size);  stringlist = (pcre_uchar **)(PUBL(malloc))(size);
404  if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;  if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
405    
406    #ifdef COMPILE_PCRE8
407  *listptr = (const char **)stringlist;  *listptr = (const char **)stringlist;
408  p = (char *)(stringlist + stringcount + 1);  #else
409    *listptr = (PCRE_SPTR16 *)stringlist;
410    #endif
411    p = (pcre_uchar *)(stringlist + stringcount + 1);
412    
413  for (i = 0; i < double_count; i += 2)  for (i = 0; i < double_count; i += 2)
414    {    {
415    int len = ovector[i+1] - ovector[i];    int len = ovector[i+1] - ovector[i];
416    memcpy(p, subject + ovector[i], len);    memcpy(p, subject + ovector[i], IN_UCHARS(len));
417    *stringlist++ = p;    *stringlist++ = p;
418    p += len;    p += len;
419    *p++ = 0;    *p++ = 0;
# Line 347  return 0; Line 430  return 0;
430  *************************************************/  *************************************************/
431    
432  /* This function exists for the benefit of people calling PCRE from non-C  /* This function exists for the benefit of people calling PCRE from non-C
433  programs that can call its functions, but not free() or (pcre_free)() directly.  programs that can call its functions, but not free() or (PUBL(free))()
434    directly.
435    
436  Argument:   the result of a previous pcre_get_substring_list()  Argument:   the result of a previous pcre_get_substring_list()
437  Returns:    nothing  Returns:    nothing
438  */  */
439    
440    #ifdef COMPILE_PCRE8
441  PCRE_EXP_DEFN void PCRE_CALL_CONVENTION  PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
442  pcre_free_substring_list(const char **pointer)  pcre_free_substring_list(const char **pointer)
443    #else
444    PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
445    pcre16_free_substring_list(PCRE_SPTR16 *pointer)
446    #endif
447  {  {
448  (pcre_free)((void *)pointer);  (PUBL(free))((void *)pointer);
449  }  }
450    
451    
# Line 386  Returns:         if successful: Line 475  Returns:         if successful:
475                     PCRE_ERROR_NOSUBSTRING (-7) substring not present                     PCRE_ERROR_NOSUBSTRING (-7) substring not present
476  */  */
477    
478    #ifdef COMPILE_PCRE8
479  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
480  pcre_get_substring(const char *subject, int *ovector, int stringcount,  pcre_get_substring(const char *subject, int *ovector, int stringcount,
481    int stringnumber, const char **stringptr)    int stringnumber, const char **stringptr)
482    #else
483    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
484    pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
485      int stringnumber, PCRE_SPTR16 *stringptr)
486    #endif
487  {  {
488  int yield;  int yield;
489  char *substring;  pcre_uchar *substring;
490  if (stringnumber < 0 || stringnumber >= stringcount)  if (stringnumber < 0 || stringnumber >= stringcount)
491    return PCRE_ERROR_NOSUBSTRING;    return PCRE_ERROR_NOSUBSTRING;
492  stringnumber *= 2;  stringnumber *= 2;
493  yield = ovector[stringnumber+1] - ovector[stringnumber];  yield = ovector[stringnumber+1] - ovector[stringnumber];
494  substring = (char *)(pcre_malloc)(yield + 1);  substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1));
495  if (substring == NULL) return PCRE_ERROR_NOMEMORY;  if (substring == NULL) return PCRE_ERROR_NOMEMORY;
496  memcpy(substring, subject + ovector[stringnumber], yield);  memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield));
497  substring[yield] = 0;  substring[yield] = 0;
498  *stringptr = substring;  #ifdef COMPILE_PCRE8
499    *stringptr = (const char *)substring;
500    #else
501    *stringptr = (PCRE_SPTR16)substring;
502    #endif
503  return yield;  return yield;
504  }  }
505    
# Line 433  Returns:         if successful: Line 532  Returns:         if successful:
532                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
533  */  */
534    
535    #ifdef COMPILE_PCRE8
536  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
537  pcre_get_named_substring(const pcre *code, const char *subject, int *ovector,  pcre_get_named_substring(const pcre *code, const char *subject, int *ovector,
538    int stringcount, const char *stringname, const char **stringptr)    int stringcount, const char *stringname, const char **stringptr)
539    #else
540    PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
541    pcre16_get_named_substring(const pcre *code, PCRE_SPTR16 subject, int *ovector,
542      int stringcount, PCRE_SPTR16 stringname, PCRE_SPTR16 *stringptr)
543    #endif
544  {  {
545  int n = get_first_set(code, stringname, ovector);  int n = get_first_set(code, stringname, ovector);
546  if (n <= 0) return n;  if (n <= 0) return n;
547    #ifdef COMPILE_PCRE8
548  return pcre_get_substring(subject, ovector, stringcount, n, stringptr);  return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
549    #else
550    return pcre16_get_substring(subject, ovector, stringcount, n, stringptr);
551    #endif
552  }  }
553    
554    
# Line 450  return pcre_get_substring(subject, ovect Line 559  return pcre_get_substring(subject, ovect
559  *************************************************/  *************************************************/
560    
561  /* This function exists for the benefit of people calling PCRE from non-C  /* This function exists for the benefit of people calling PCRE from non-C
562  programs that can call its functions, but not free() or (pcre_free)() directly.  programs that can call its functions, but not free() or (PUBL(free))()
563    directly.
564    
565  Argument:   the result of a previous pcre_get_substring()  Argument:   the result of a previous pcre_get_substring()
566  Returns:    nothing  Returns:    nothing
567  */  */
568    
569    #ifdef COMPILE_PCRE8
570  PCRE_EXP_DEFN void PCRE_CALL_CONVENTION  PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
571  pcre_free_substring(const char *pointer)  pcre_free_substring(const char *pointer)
572    #else
573    PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
574    pcre16_free_substring(PCRE_SPTR16 pointer)
575    #endif
576  {  {
577  (pcre_free)((void *)pointer);  (PUBL(free))((void *)pointer);
578  }  }
579    
580  /* End of pcre_get.c */  /* End of pcre_get.c */

Legend:
Removed from v.359  
changed lines
  Added in v.836

  ViewVC Help
Powered by ViewVC 1.1.5