Пример #1
0
SceUInt8* boyer_moore (SceUInt8 *string, SceUInt32 stringlen, SceUInt8 *pat, SceUInt32 patlen) {
  int i;
  int delta1[ALPHABET_LEN];
  int *delta2 = (int *)malloc(patlen * sizeof(int));
  make_delta1(delta1, pat, patlen);
  make_delta2(delta2, pat, patlen);

  // The empty pattern must be considered specially
  if (patlen == 0) return string;

  i = patlen-1;
  while (i < stringlen) {
    int j = patlen-1;
    while (j >= 0 && (string[i] == pat[j])) {
      --i;
      --j;
    }
    if (j < 0) {
      free(delta2);
      return (string + i+1);
    }

    i += max(delta1[string[i]], delta2[j]);
  }
  free(delta2);
  return NULL;
}
Пример #2
0
Файл: utils.c Проект: 173210/VHL
char* memstr (char *string, SceUInt stringlen, char *pat, SceUInt patlen) {
        SceUInt i;
        int delta1[ALPHABET_LEN];
        int delta2 [MAX_MEMSTR_PATH_LENGTH];
        make_delta1(delta1, pat, patlen);
        make_delta2(delta2, pat, patlen);

        // The empty pattern must be considered specially
        if (patlen == 0) return string;

        i = patlen-1;
        while (i < stringlen) {
                int j = patlen-1;
                while (j >= 0 && (string[i] == pat[j])) {
                        --i;
                        --j;
                }
                if (j < 0) {
                        return (string + i+1);
                }

                i += max(delta1[((unsigned char *)string)[i]], delta2[j]);
        }
        return NULL;
}
Пример #3
0
bool BoyerMooreSearch::PreProcess(const char *pattern, int patternLen, SearchOptions options) {
  pattern_ = pattern;
  patternLen_ = patternLen;
  matchCase_ = (options & kMatchCase);
  delta2_ = (int *)malloc(patternLen * sizeof(int));
  if (delta2_ == NULL)
    return false;
  make_delta1(delta1_, kAlphabetLen, (const uint8_t*)pattern, patternLen, matchCase_);
  make_delta2(delta2_, (const uint8_t*)pattern, patternLen, matchCase_);
  return true;
}
Пример #4
0
void BoyerMooreSearch::StartSearchWorker(const char *pattern, int patternLen, SearchOptions options, SearchCreateResult& result) {
  pattern_ = pattern;
  patternLen_ = patternLen;
  matchCase_ = (options & kMatchCase);
  delta2_ = (int *)malloc(patternLen * sizeof(int));
  if (delta2_ == NULL) {
    result.SetError(E_OUTOFMEMORY, "Out of memory");
    return;
  }
  make_delta1(delta1_, kAlphabetLen, (const uint8_t*)pattern, patternLen, matchCase_);
  make_delta2(delta2_, (const uint8_t*)pattern, patternLen, matchCase_);
}
Пример #5
0
uint8_t boyer_moore (uint8_t *string, uint32_t stringlen, uint8_t *pat, uint32_t patlen) {

    uint32_t i;

    int delta1[ALPHABET_LEN];

    int *delta2 = (int *)malloc(patlen * sizeof(int));

    make_delta1(delta1, pat, patlen);

    make_delta2(delta2, pat, patlen);

    print_pre_table(delta1, delta2, pat, patlen);
 

    i = patlen-1;

    while (i < stringlen) {

        int j = patlen-1;

        while (j >= 0 && (string[i] == pat[j])) {

            --i;

            --j;
        }

        if (j < 0) {

            free(delta2);

      return i+1;       //返回T中匹配的位置
        }
 

        i += max(delta1[string[i]], delta2[j]);   //j失配( [j+1, patlen)已匹配 ),i向右移动的距离取主串T中坏字符delta1[string[i]]与模式串P中好后缀delta2[j]的大者
    }

    free(delta2);
return -1;
}
Пример #6
0
uint8_t* boyer_moore (uint8_t *string, uint32_t stringlen, uint8_t *pat, uint32_t patlen) {
    int i;
    int delta1[ALPHABET_LEN];
    int *delta2 = malloc(patlen * sizeof(int));
    make_delta1(delta1, pat, patlen);
    make_delta2(delta2, pat, patlen);
 
    i = patlen-1;
    while (i < stringlen) {
        int j = patlen-1;
        while (j >= 0 && (string[i] == pat[j])) {
            --i;
            --j;
        }
        if (j < 0) {
            free(delta2);
            return (string + i+1);
        }
 
        i += max(delta1[string[i]], delta2[j]);
    }
    free(delta2);
    return NULL;
}
Пример #7
0
int main(int argc, char *const argv[])
{
    size_t before = 16;
    size_t after = 16;
    int color = 0;
    bool hexlify = true;
    int ch;
    long ia, ib;
    while ((ch = getopt(argc, argv, "a:b:chH")) != -1)
    {
        switch(ch)
        {
            case 'a':
                ia = strtol(optarg, NULL, 10);
                if ((ia > 0) && (ia < 1024))
                {
                    after = (size_t)ia;
                }
                break;
            case 'b':
                ib = strtol(optarg, NULL, 10);
                if ((ib > 0) && (ib < 1024))
                {
                    before = (size_t)ib;
                }
                break;
            case 'c':
                color++;
                break;
            case 'H':
                hexlify = !hexlify;
                break;
            case 'h':
            default:
                usage();
                break;
        }
    }

    if (!isatty(STDOUT_FILENO) && color)
    {
        color--;
    }

    argc -= optind;
    argv += optind;

    if (argc < 2)
    {
        usage();
    }

    size_t pattern_size = 0;
    uint8_t *pattern;
    if (hexlify)
    {
        pattern = hex_decode(argv[0], &pattern_size);
    }
    else
    {
        pattern_size = strlen(argv[0]);
        pattern = (uint8_t*)strndup(argv[0], pattern_size);
    }

    if (!pattern)
    {
        fprintf(stderr, "Invalid pattern\n");
    }

    // initialize boyer-moore patterns
    int *delta1 = (int*)malloc(ALPHABET_LEN * sizeof(int));
    int *delta2 = (int*)malloc(pattern_size * sizeof(int));
    make_delta1(delta1, pattern, pattern_size);
    make_delta2(delta2, pattern, pattern_size);

    size_t count = 0;
    size_t errors = 0;
    for (int f=1; f<argc; f++)
    {
        int first = 1;
        const char *file_name = argv[f];
        int fd = open(file_name, O_RDONLY);
        if (fd < 0)
        {
            fprintf(stderr, "Open error ");
            perror(file_name);
            errors++;
            continue;
        }

        // Get the file size, to make mmap search the whole thing
        struct stat file_stat;
        if (fstat(fd, &file_stat) != 0)
        {
            fprintf(stderr, "Stat error ");
            perror(file_name);
            errors++;
            close(fd); // ignore error
            continue;
        }

        size_t file_size = (size_t)file_stat.st_size;
        if ((file_size == 0) || !S_ISREG(file_stat.st_mode))
        {
            close(fd); // ignore error
            continue;
        }

        const uint8_t *file = mmap(0, file_size, PROT_READ, MAP_SHARED, fd, 0);
        if (file == MAP_FAILED)
        {
            fprintf(stderr, "Mmap error ");
            perror(file_name);
            errors++;
            close(fd); // ignore error
            continue;
        }


        // Find all matches, don't worry about overlaps
        size_t last = 0;
        size_t next = 0;
        while ((next = bm_search(file + last,
                                 file_size - last,
                                 pattern, pattern_size,
                                 delta1, delta2)) != NOT_FOUND)
        {
            if (first)
            {
                first = 0;
                printf("---- %s ----\n", file_name);
            }

            print_match(file, last + next, pattern_size, before, after, color);
            last += next + pattern_size;
            count++;
        }

        if (munmap((void*)file, file_size) != 0)
        {
            fprintf(stderr, "Unmap error ");
            perror(file_name);
            errors++;
        }

        if (close(fd) != 0)
        {
            fprintf(stderr, "Close error ");
            perror(file_name);
            errors++;
        }
    }

    free(delta2);
    free(delta1);
    free(pattern);

    if (count > 0)
    {
        return 0;
    }
    if (errors > 0)
    {
        return 2;
    }
    return 1;
}