source: icGREP/icgrep-devel/icgrep/icgrep.cpp @ 4324

Last change on this file since 4324 was 4324, checked in by cameron, 5 years ago

Factor out grep execution engine to do_grep.h, do_grep.cpp

File size: 3.7 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include "icgrep.h"
8#include "utf_encoding.h"
9#include "compiler.h"
10#include "pablo/pablo_compiler.h"
11#include "do_grep.h"
12
13#include <fstream>
14#include <sstream>
15#include <iostream>
16#include <string>
17#include <stdint.h>
18
19#include <stdio.h>
20#include <stdlib.h>
21#include <unistd.h>
22#include <errno.h>
23#include <sys/types.h>
24#include <sys/stat.h>
25
26int main(int argc, char *argv[])
27{
28    char * inregex, * fileregex, * infilename, * outfilename;
29    FILE *infile, *outfile, *regexfile;
30
31    int fdSrc;
32    struct stat infile_sb;
33    char * infile_buffer;
34
35    int opt_code;
36    bool count_only_option = 0;
37    bool print_version_option = 0;
38    bool regex_from_file_option = 0;
39    bool ascii_only_option = 0;
40    bool compile_time_option = 0;
41    bool enable_multiplexing = 0;
42    bool print_usage = 0;
43
44
45    long lSize = 0;
46
47    size_t result;
48
49    while ((opt_code = getopt(argc, argv, "cvftam")) != -1)
50    {
51        switch (opt_code)
52        {
53        case 'c':
54            count_only_option = 1;
55            break;
56        case 'v':
57            print_version_option = 1;
58            break;
59        case 'f':
60            regex_from_file_option = 1;
61            break;
62        case 't':
63            compile_time_option = 1;
64            break;
65        case 'a':
66            ascii_only_option = 1;
67            break;
68        case 'm':
69            enable_multiplexing = 1;
70            break;
71        case '?':
72            break;
73        default:
74            printf ("Invalid option: %c\n", opt_code);
75            print_usage = 1;
76        }
77    }
78
79    if (optind >= argc)
80    {
81        printf ("Too few arguments\n");
82        print_usage = 1;
83    }
84
85    if (print_usage) {
86        printf("Usage: %s [-a] [-c] [-f] [-m] [-t] [-v] <regex|regexfile> <inputfile> [<outputfile>]\n", argv[0]);
87        exit(-1);
88    }
89
90    inregex = argv[optind++];
91    if (inregex == 0)
92    {
93        fprintf(stderr, "Error: cannot read the regular expression.\n");
94        exit(-1);
95    }
96
97    if (regex_from_file_option)
98    {
99        regexfile = fopen(inregex, "rb");
100        if (!regexfile){
101            fprintf(stderr, "Error: cannot open %s for processing.\n", inregex);
102            exit(-1);
103        }
104
105        fseek (regexfile , 0 , SEEK_END);
106        lSize = ftell (regexfile);
107        rewind (regexfile);
108
109        fileregex = (char*) malloc (sizeof(char)*lSize);
110        if (fileregex == NULL) {fputs ("Memory error",stderr); exit (2);}
111
112        result = fread (fileregex, 1, lSize, regexfile);
113        if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
114        fclose(regexfile);
115
116        if (fileregex[lSize - 1] == '\n') fileregex[lSize - 1] = '\0';
117    }
118
119    infilename = argv[optind++];
120
121
122    if (print_version_option)
123    {
124        fprintf(outfile, "Parabix icgrep implementation: August 2014\n");
125    }
126
127    Encoding encoding(ascii_only_option ? Encoding::Type::ASCII : Encoding::Type::UTF_8, 8);
128    const auto llvm_codegen = icgrep::compile(encoding, (regex_from_file_option ? fileregex : inregex), false, enable_multiplexing);
129
130    if (llvm_codegen.process_block_fptr != 0)
131     
132    {
133        void (*FP)(const Basis_bits &basis_bits, BitBlock carry_q[], BitBlock advance_q[], Output &output) = 
134           (void (*)(const Basis_bits &basis_bits, BitBlock carry_q[], BitBlock advance_q[], Output &output))(void*)llvm_codegen.process_block_fptr;
135        GrepExecutor grepEngine = GrepExecutor(llvm_codegen.carry_q_size, llvm_codegen.advance_q_size, FP);
136        grepEngine.setCountOnlyOption(count_only_option);
137        grepEngine.doGrep(infilename);
138    }
139
140    if (regex_from_file_option) free(fileregex);
141
142    return 0;
143}
144
Note: See TracBrowser for help on using the repository browser.