/[pcre]/code/branches/pcre16/pcre_jit_test.c
ViewVC logotype

Diff of /code/branches/pcre16/pcre_jit_test.c

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

revision 788 by zherczeg, Tue Dec 6 11:33:41 2011 UTC revision 789 by zherczeg, Wed Dec 7 14:36:26 2011 UTC
# Line 621  pcre_jit_stack* callback(void *arg) Line 621  pcre_jit_stack* callback(void *arg)
621          return (pcre_jit_stack *)arg;          return (pcre_jit_stack *)arg;
622  }  }
623    
624  static void setstack(pcre_extra *extra, int realloc)  static void setstack(pcre_extra *extra, int alloc_again)
625  {  {
626          static pcre_jit_stack *stack;          static pcre_jit_stack *stack;
627    
628          if (realloc) {          if (alloc_again) {
629                  if (stack)                  if (stack)
630                          pcre_jit_stack_free(stack);                          pcre_jit_stack_free(stack);
631                  stack = pcre_jit_stack_alloc(1, 1024 * 1024);                  stack = pcre_jit_stack_alloc(1, 1024 * 1024);
# Line 638  static void setstack(pcre_extra *extra, Line 638  static void setstack(pcre_extra *extra,
638    
639  static int convert_utf8_to_utf16(const char *input, PCRE_SCHAR16 *output, int *offsetmap, int max_length)  static int convert_utf8_to_utf16(const char *input, PCRE_SCHAR16 *output, int *offsetmap, int max_length)
640  {  {
641          unsigned char *ptr = (unsigned char*)input;          unsigned char *iptr = (unsigned char*)input;
642          PCRE_SCHAR16 *optr = output;          unsigned short *optr = (unsigned short *)output;
643          unsigned int c;          unsigned int c;
644    
645          if (max_length == 0)          if (max_length == 0)
646                  return 0;                  return 0;
647    
648          while (*ptr && max_length > 1) {          while (*iptr && max_length > 1) {
649                  c = 0;                  c = 0;
650                  if (offsetmap)                  if (offsetmap)
651                          *offsetmap++ = (int)(ptr - (unsigned char*)input);                          *offsetmap++ = (int)(iptr - (unsigned char*)input);
652    
653                  if (!(*ptr & 0x80))                  if (!(*iptr & 0x80))
654                          c = *ptr++;                          c = *iptr++;
655                  else if (!(*ptr & 0x20)) {                  else if (!(*iptr & 0x20)) {
656                          c = ((ptr[0] & 0x1f) << 6) | (ptr[1] & 0x3f);                          c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
657                          ptr += 2;                          iptr += 2;
658                  } else if (!(*ptr & 0x10)) {                  } else if (!(*iptr & 0x10)) {
659                          c = ((ptr[0] & 0x0f) << 12) | ((ptr[1] & 0x3f) << 6) | (ptr[2] & 0x3f);                          c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
660                          ptr += 3;                          iptr += 3;
661                  } else if (!(*ptr & 0x08)) {                  } else if (!(*iptr & 0x08)) {
662                          c = ((ptr[0] & 0x07) << 18) | ((ptr[1] & 0x3f) << 12) | ((ptr[2] & 0x3f) << 6) | (ptr[3] & 0x3f);                          c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
663                          ptr += 4;                          iptr += 4;
664                  }                  }
665    
666                  if (c < 65536) {                  if (c < 65536) {
# Line 668  static int convert_utf8_to_utf16(const c Line 668  static int convert_utf8_to_utf16(const c
668                          max_length--;                          max_length--;
669                  } else if (max_length <= 2) {                  } else if (max_length <= 2) {
670                          *optr = '\0';                          *optr = '\0';
671                          return optr - output;                          return (int)(optr - (unsigned short *)output);
672                  } else {                  } else {
673                          c -= 0x10000;                          c -= 0x10000;
674                          *optr++ = 0xd800 | ((c >> 10) & 0x3ff);                          *optr++ = 0xd800 | ((c >> 10) & 0x3ff);
# Line 679  static int convert_utf8_to_utf16(const c Line 679  static int convert_utf8_to_utf16(const c
679                  }                  }
680          }          }
681          if (offsetmap)          if (offsetmap)
682                  *offsetmap = (int)(ptr - (unsigned char*)input);                  *offsetmap = (int)(iptr - (unsigned char*)input);
683          *optr = '\0';          *optr = '\0';
684          return optr - output;          return (int)(optr - (unsigned short *)output);
685  }  }
686    
687  static int copy_char8_to_char16(const char *input, PCRE_SCHAR16 *output, int max_length)  static int copy_char8_to_char16(const char *input, PCRE_SCHAR16 *output, int max_length)
688  {  {
689          PCRE_SCHAR16 *optr = output;          unsigned char *iptr = (unsigned char*)input;
690            unsigned short *optr = (unsigned short *)output;
691    
692          if (max_length == 0)          if (max_length == 0)
693                  return 0;                  return 0;
694    
695          while (*input && max_length > 1) {          while (*iptr && max_length > 1) {
696                  *optr++ = *input++;                  *optr++ = *iptr++;
697                  max_length--;                  max_length--;
698          }          }
699          *optr = '\0';          *optr = '\0';
700          return optr - output;          return (int)(optr - (unsigned short *)output);
701  }  }
702    
703  #define REGTEST_MAX_LENGTH 4096  #define REGTEST_MAX_LENGTH 4096
# Line 768  static int regression_tests(void) Line 769  static int regression_tests(void)
769                          current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | disabled_flags8),                          current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | disabled_flags8),
770                          &error, &err_offs, NULL);                          &error, &err_offs, NULL);
771    
772                    extra8 = NULL;
773                  if (re8) {                  if (re8) {
774                          error = NULL;                          error = NULL;
775                          extra8 = pcre_study(re8, PCRE_STUDY_JIT_COMPILE, &error);                          extra8 = pcre_study(re8, PCRE_STUDY_JIT_COMPILE, &error);
# Line 786  static int regression_tests(void) Line 788  static int regression_tests(void)
788                          printf("\n8 bit: Cannot compile pattern: %s\n", current->pattern);                          printf("\n8 bit: Cannot compile pattern: %s\n", current->pattern);
789  #endif  #endif
790  #ifdef SUPPORT_PCRE16  #ifdef SUPPORT_PCRE16
791                  convert_utf8_to_utf16(current->pattern, regtest_buf, NULL, REGTEST_MAX_LENGTH);                  if (current->flags & PCRE_UTF8)
792                            convert_utf8_to_utf16(current->pattern, regtest_buf, NULL, REGTEST_MAX_LENGTH);
793                    else
794                            copy_char8_to_char16(current->pattern, regtest_buf, REGTEST_MAX_LENGTH);
795                  re16 = pcre16_compile(regtest_buf,                  re16 = pcre16_compile(regtest_buf,
796                          current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | disabled_flags16),                          current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | disabled_flags16),
797                          &error, &err_offs, NULL);                          &error, &err_offs, NULL);
798    
799                    extra16 = NULL;
800                  if (re16) {                  if (re16) {
801                          error = NULL;                          error = NULL;
802                          extra16 = pcre16_study(re16, PCRE_STUDY_JIT_COMPILE, &error);                          extra16 = pcre16_study(re16, PCRE_STUDY_JIT_COMPILE, &error);
# Line 813  static int regression_tests(void) Line 820  static int regression_tests(void)
820                          setstack(NULL, 1);                          setstack(NULL, 1);
821    
822  #ifdef SUPPORT_PCRE8  #ifdef SUPPORT_PCRE8
823                    return_value8_1 = -1000;
824                    return_value8_2 = -1000;
825                  if (re8) {                  if (re8) {
826                          setstack(extra8, 0);                          setstack(extra8, 0);
827                          for (i = 0; i < 32; ++i)                          for (i = 0; i < 32; ++i)
# Line 828  static int regression_tests(void) Line 837  static int regression_tests(void)
837  #endif  #endif
838    
839  #ifdef SUPPORT_PCRE16  #ifdef SUPPORT_PCRE16
840                    return_value16_1 = -1000;
841                    return_value16_2 = -1000;
842                  if (re16) {                  if (re16) {
843                          setstack(extra16, 0);                          setstack(extra16, 0);
844                          if (current->flags & PCRE_UTF8)                          if (current->flags & PCRE_UTF8)
# Line 853  static int regression_tests(void) Line 864  static int regression_tests(void)
864                  is_succesful = 1;                  is_succesful = 1;
865                  if (!(current->flags & PCRE_BUG)) {                  if (!(current->flags & PCRE_BUG)) {
866  #if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16  #if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16
867                          if ((current->flags & PCRE_UTF8) && utf8 && utf16) {                          if (utf8 == utf16) {
868                                  /* All results must be the same. */                                  /* All results must be the same. */
869                                  if (return_value8_1 != return_value8_2 || return_value8_1 != return_value16_1 || return_value8_1 != return_value16_2) {                                  if (return_value8_1 != return_value8_2 || return_value8_1 != return_value16_1 || return_value8_1 != return_value16_2) {
870                                          printf("\n8 and 16 bit: Return value differs(%d:%d:%d:%d): [%d] '%s' @ '%s'\n",                                          printf("\n8 and 16 bit: Return value differs(%d:%d:%d:%d): [%d] '%s' @ '%s'\n",
# Line 863  static int regression_tests(void) Line 874  static int regression_tests(void)
874                                  } else if (return_value8_1 >= 0) {                                  } else if (return_value8_1 >= 0) {
875                                          return_value8_1 *= 2;                                          return_value8_1 *= 2;
876                                          /* Transform back the results. */                                          /* Transform back the results. */
877                                          for (i = 0; i < return_value8_1; ++i) {                                          if (current->flags & PCRE_UTF8) {
878                                                  if (ovector16_1[i] >= 0)                                                  for (i = 0; i < return_value8_1; ++i) {
879                                                          ovector16_1[i] = regtest_offsetmap[ovector16_1[i]];                                                          if (ovector16_1[i] >= 0)
880                                                  if (ovector16_2[i] >= 0)                                                                  ovector16_1[i] = regtest_offsetmap[ovector16_1[i]];
881                                                          ovector16_2[i] = regtest_offsetmap[ovector16_2[i]];                                                          if (ovector16_2[i] >= 0)
882                                                                    ovector16_2[i] = regtest_offsetmap[ovector16_2[i]];
883                                                    }
884                                          }                                          }
885    
886                                          for (i = 0; i < return_value8_1; ++i)                                          for (i = 0; i < return_value8_1; ++i)

Legend:
Removed from v.788  
changed lines
  Added in v.789

  ViewVC Help
Powered by ViewVC 1.1.5