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

Diff of /code/trunk/pcre_dfa_exec.c

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

revision 473 by ph10, Sat Jan 2 12:40:07 2010 UTC revision 517 by ph10, Wed May 5 10:44:20 2010 UTC
# Line 106  never stored, so we push them well clear Line 106  never stored, so we push them well clear
106    
107    
108  /* This table identifies those opcodes that are followed immediately by a  /* This table identifies those opcodes that are followed immediately by a
109  character that is to be tested in some way. This makes is possible to  character that is to be tested in some way. This makes it possible to
110  centralize the loading of these characters. In the case of Type * etc, the  centralize the loading of these characters. In the case of Type * etc, the
111  "character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a  "character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a
112  small value. Non-zero values in the table are the offsets from the opcode where  small value. Non-zero values in the table are the offsets from the opcode where
# Line 118  static const uschar coptable[] = { Line 118  static const uschar coptable[] = {
118    0, 0, 0, 0, 0,                 /* \A, \G, \K, \B, \b                     */    0, 0, 0, 0, 0,                 /* \A, \G, \K, \B, \b                     */
119    0, 0, 0, 0, 0, 0,              /* \D, \d, \S, \s, \W, \w                 */    0, 0, 0, 0, 0, 0,              /* \D, \d, \S, \s, \W, \w                 */
120    0, 0, 0,                       /* Any, AllAny, Anybyte                   */    0, 0, 0,                       /* Any, AllAny, Anybyte                   */
121    0, 0, 0,                       /* NOTPROP, PROP, EXTUNI                  */    0, 0,                          /* \P, \p                                 */
122    0, 0, 0, 0, 0,                 /* \R, \H, \h, \V, \v                     */    0, 0, 0, 0, 0,                 /* \R, \H, \h, \V, \v                     */
123      0,                             /* \X                                     */
124    0, 0, 0, 0, 0,                 /* \Z, \z, Opt, ^, $                      */    0, 0, 0, 0, 0,                 /* \Z, \z, Opt, ^, $                      */
125    1,                             /* Char                                   */    1,                             /* Char                                   */
126    1,                             /* Charnc                                 */    1,                             /* Charnc                                 */
# Line 156  static const uschar coptable[] = { Line 157  static const uschar coptable[] = {
157    0,                             /* Reverse                                */    0,                             /* Reverse                                */
158    0, 0, 0, 0,                    /* ONCE, BRA, CBRA, COND                  */    0, 0, 0, 0,                    /* ONCE, BRA, CBRA, COND                  */
159    0, 0, 0,                       /* SBRA, SCBRA, SCOND                     */    0, 0, 0,                       /* SBRA, SCBRA, SCOND                     */
160    0,                             /* CREF                                   */    0, 0,                          /* CREF, NCREF                            */
161    0,                             /* RREF                                   */    0, 0,                          /* RREF, NRREF                            */
162    0,                             /* DEF                                    */    0,                             /* DEF                                    */
163    0, 0,                          /* BRAZERO, BRAMINZERO                    */    0, 0,                          /* BRAZERO, BRAMINZERO                    */
164    0, 0, 0, 0,                    /* PRUNE, SKIP, THEN, COMMIT              */    0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG,                */
165    0, 0, 0, 0                     /* FAIL, ACCEPT, CLOSE, SKIPZERO          */    0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG,        */
166      0, 0, 0, 0, 0                  /* COMMIT, FAIL, ACCEPT, CLOSE, SKIPZERO  */
167  };  };
168    
169  /* This table identifies those opcodes that inspect a character. It is used to  /* This table identifies those opcodes that inspect a character. It is used to
# Line 174  static const uschar poptable[] = { Line 176  static const uschar poptable[] = {
176    0, 0, 0, 1, 1,                 /* \A, \G, \K, \B, \b                     */    0, 0, 0, 1, 1,                 /* \A, \G, \K, \B, \b                     */
177    1, 1, 1, 1, 1, 1,              /* \D, \d, \S, \s, \W, \w                 */    1, 1, 1, 1, 1, 1,              /* \D, \d, \S, \s, \W, \w                 */
178    1, 1, 1,                       /* Any, AllAny, Anybyte                   */    1, 1, 1,                       /* Any, AllAny, Anybyte                   */
179    1, 1, 1,                       /* NOTPROP, PROP, EXTUNI                  */    1, 1,                          /* \P, \p                                 */
180    1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */    1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */
181      1,                             /* \X                                     */
182    0, 0, 0, 0, 0,                 /* \Z, \z, Opt, ^, $                      */    0, 0, 0, 0, 0,                 /* \Z, \z, Opt, ^, $                      */
183    1,                             /* Char                                   */    1,                             /* Char                                   */
184    1,                             /* Charnc                                 */    1,                             /* Charnc                                 */
# Line 212  static const uschar poptable[] = { Line 215  static const uschar poptable[] = {
215    0,                             /* Reverse                                */    0,                             /* Reverse                                */
216    0, 0, 0, 0,                    /* ONCE, BRA, CBRA, COND                  */    0, 0, 0, 0,                    /* ONCE, BRA, CBRA, COND                  */
217    0, 0, 0,                       /* SBRA, SCBRA, SCOND                     */    0, 0, 0,                       /* SBRA, SCBRA, SCOND                     */
218    0,                             /* CREF                                   */    0, 0,                          /* CREF, NCREF                            */
219    0,                             /* RREF                                   */    0, 0,                          /* RREF, NRREF                            */
220    0,                             /* DEF                                    */    0,                             /* DEF                                    */
221    0, 0,                          /* BRAZERO, BRAMINZERO                    */    0, 0,                          /* BRAZERO, BRAMINZERO                    */
222    0, 0, 0, 0,                    /* PRUNE, SKIP, THEN, COMMIT              */    0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG,                */
223    0, 0, 0, 0                     /* FAIL, ACCEPT, CLOSE, SKIPZERO          */    0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG,        */
224      0, 0, 0, 0, 0                  /* COMMIT, FAIL, ACCEPT, CLOSE, SKIPZERO  */
225  };  };
226    
227  /* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,  /* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,
# Line 255  typedef struct stateblock { Line 259  typedef struct stateblock {
259  #define INTS_PER_STATEBLOCK  (sizeof(stateblock)/sizeof(int))  #define INTS_PER_STATEBLOCK  (sizeof(stateblock)/sizeof(int))
260    
261    
262  #ifdef DEBUG  #ifdef PCRE_DEBUG
263  /*************************************************  /*************************************************
264  *             Print character string             *  *             Print character string             *
265  *************************************************/  *************************************************/
# Line 559  for (;;) Line 563  for (;;)
563    workspace[0] ^= 1;              /* Remember for the restarting feature */    workspace[0] ^= 1;              /* Remember for the restarting feature */
564    workspace[1] = active_count;    workspace[1] = active_count;
565    
566  #ifdef DEBUG  #ifdef PCRE_DEBUG
567    printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP);    printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP);
568    pchars((uschar *)ptr, strlen((char *)ptr), stdout);    pchars((uschar *)ptr, strlen((char *)ptr), stdout);
569    printf("\"\n");    printf("\"\n");
# Line 605  for (;;) Line 609  for (;;)
609      int state_offset = current_state->offset;      int state_offset = current_state->offset;
610      int count, codevalue, rrc;      int count, codevalue, rrc;
611    
612  #ifdef DEBUG  #ifdef PCRE_DEBUG
613      printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);      printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);
614      if (clen == 0) printf("EOL\n");      if (clen == 0) printf("EOL\n");
615        else if (c > 32 && c < 127) printf("'%c'\n", c);        else if (c > 32 && c < 127) printf("'%c'\n", c);
# Line 706  for (;;) Line 710  for (;;)
710    
711      switch (codevalue)      switch (codevalue)
712        {        {
713    /* ========================================================================== */
714          /* These cases are never obeyed. This is a fudge that causes a compile-
715          time error if the vectors coptable or poptable, which are indexed by
716          opcode, are not the correct length. It seems to be the only way to do
717          such a check at compile time, as the sizeof() operator does not work
718          in the C preprocessor. */
719    
720          case OP_TABLE_LENGTH:
721          case OP_TABLE_LENGTH +
722            ((sizeof(coptable) == OP_TABLE_LENGTH) &&
723             (sizeof(poptable) == OP_TABLE_LENGTH)):
724          break;
725    
726  /* ========================================================================== */  /* ========================================================================== */
727        /* Reached a closing bracket. If not at the end of the pattern, carry        /* Reached a closing bracket. If not at the end of the pattern, carry
# Line 939  for (;;) Line 955  for (;;)
955            break;            break;
956    
957            case PT_LAMP:            case PT_LAMP:
958            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
959                   prop->chartype == ucp_Lt;
960            break;            break;
961    
962            case PT_GC:            case PT_GC:
# Line 953  for (;;) Line 970  for (;;)
970            case PT_SC:            case PT_SC:
971            OK = prop->script == code[2];            OK = prop->script == code[2];
972            break;            break;
973    
974              /* These are specials for combination cases. */
975    
976              case PT_ALNUM:
977              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
978                   _pcre_ucp_gentype[prop->chartype] == ucp_N;
979              break;
980    
981              case PT_SPACE:    /* Perl space */
982              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
983                   c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
984              break;
985    
986              case PT_PXSPACE:  /* POSIX space */
987              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
988                   c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
989                   c == CHAR_FF || c == CHAR_CR;
990              break;
991    
992              case PT_WORD:
993              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
994                   _pcre_ucp_gentype[prop->chartype] == ucp_N ||
995                   c == CHAR_UNDERSCORE;
996              break;
997    
998            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
999    
# Line 1108  for (;;) Line 1149  for (;;)
1149            break;            break;
1150    
1151            case PT_LAMP:            case PT_LAMP:
1152            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
1153                prop->chartype == ucp_Lt;
1154            break;            break;
1155    
1156            case PT_GC:            case PT_GC:
# Line 1123  for (;;) Line 1165  for (;;)
1165            OK = prop->script == code[3];            OK = prop->script == code[3];
1166            break;            break;
1167    
1168              /* These are specials for combination cases. */
1169    
1170              case PT_ALNUM:
1171              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
1172                   _pcre_ucp_gentype[prop->chartype] == ucp_N;
1173              break;
1174    
1175              case PT_SPACE:    /* Perl space */
1176              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
1177                   c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
1178              break;
1179    
1180              case PT_PXSPACE:  /* POSIX space */
1181              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
1182                   c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
1183                   c == CHAR_FF || c == CHAR_CR;
1184              break;
1185    
1186              case PT_WORD:
1187              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
1188                   _pcre_ucp_gentype[prop->chartype] == ucp_N ||
1189                   c == CHAR_UNDERSCORE;
1190              break;
1191    
1192            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1193    
1194            default:            default:
# Line 1330  for (;;) Line 1396  for (;;)
1396            break;            break;
1397    
1398            case PT_LAMP:            case PT_LAMP:
1399            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
1400                prop->chartype == ucp_Lt;
1401            break;            break;
1402    
1403            case PT_GC:            case PT_GC:
# Line 1344  for (;;) Line 1411  for (;;)
1411            case PT_SC:            case PT_SC:
1412            OK = prop->script == code[3];            OK = prop->script == code[3];
1413            break;            break;
1414    
1415              /* These are specials for combination cases. */
1416    
1417              case PT_ALNUM:
1418              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
1419                   _pcre_ucp_gentype[prop->chartype] == ucp_N;
1420              break;
1421    
1422              case PT_SPACE:    /* Perl space */
1423              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
1424                   c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
1425              break;
1426    
1427              case PT_PXSPACE:  /* POSIX space */
1428              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
1429                   c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
1430                   c == CHAR_FF || c == CHAR_CR;
1431              break;
1432    
1433              case PT_WORD:
1434              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
1435                   _pcre_ucp_gentype[prop->chartype] == ucp_N ||
1436                   c == CHAR_UNDERSCORE;
1437              break;
1438    
1439            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1440    
# Line 1577  for (;;) Line 1668  for (;;)
1668            break;            break;
1669    
1670            case PT_LAMP:            case PT_LAMP:
1671            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;            OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
1672                prop->chartype == ucp_Lt;
1673            break;            break;
1674    
1675            case PT_GC:            case PT_GC:
# Line 1591  for (;;) Line 1683  for (;;)
1683            case PT_SC:            case PT_SC:
1684            OK = prop->script == code[5];            OK = prop->script == code[5];
1685            break;            break;
1686    
1687              /* These are specials for combination cases. */
1688    
1689              case PT_ALNUM:
1690              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
1691                   _pcre_ucp_gentype[prop->chartype] == ucp_N;
1692              break;
1693    
1694              case PT_SPACE:    /* Perl space */
1695              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
1696                   c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
1697              break;
1698    
1699              case PT_PXSPACE:  /* POSIX space */
1700              OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
1701                   c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
1702                   c == CHAR_FF || c == CHAR_CR;
1703              break;
1704    
1705              case PT_WORD:
1706              OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
1707                   _pcre_ucp_gentype[prop->chartype] == ucp_N ||
1708                   c == CHAR_UNDERSCORE;
1709              break;
1710    
1711            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1712    
# Line 2298  for (;;) Line 2414  for (;;)
2414            ims,                                  /* the current ims flags */            ims,                                  /* the current ims flags */
2415            rlevel,                               /* function recursion level */            rlevel,                               /* function recursion level */
2416            recursing);                           /* pass on regex recursion */            recursing);                           /* pass on regex recursion */
2417    
2418          if (rc == PCRE_ERROR_DFA_UITEM) return rc;          if (rc == PCRE_ERROR_DFA_UITEM) return rc;
2419          if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))          if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))
2420              { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }              { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
# Line 2991  for (;;) Line 3107  for (;;)
3107        bytes to avoid spending too much time in this optimization. */        bytes to avoid spending too much time in this optimization. */
3108    
3109        if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&        if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&
3110            end_subject - current_subject < study->minlength)            (pcre_uint32)(end_subject - current_subject) < study->minlength)
3111          return PCRE_ERROR_NOMATCH;          return PCRE_ERROR_NOMATCH;
3112    
3113        /* If req_byte is set, we know that that character must appear in the        /* If req_byte is set, we know that that character must appear in the

Legend:
Removed from v.473  
changed lines
  Added in v.517

  ViewVC Help
Powered by ViewVC 1.1.5