/media/sda-magnetic/david/Dok-15-2023-11-27/informatik/newC2023-10-23/c2023-10-23/reg7786.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define     X                             2048
#define     MAX_LINES                     2048
#define     END                           -1
#define     REALEND                       -2
#define     CONTROLSTATE                  -3
#define     OPERATIONSTATESUBSTITUTE      -14
#define     OPERATIONSTATESUBSTITUTEWITH  -15
#define     OPERATIONSTATEFIND            -16
#define     OPERATIONSTATEEND             -17
#define     ASCIIMIN                      0
#define     ASCIIMAX                      255
#define     LEX_ROUND_BRACKET_OPEN        -4
#define     LEX_ROUND_BRACKET_CLOSE       -5
#define     LEX_SQUARE_BRACKET_OPEN       -6
#define     LEX_SQUARE_BRACKET_CLOSE      -7
#define     LEX_COMMA                     -8
#define     LEX_STAR                      -9
#define     LEX_DOT                       -10
#define     LEX_END                       -11
#define     LEX_EMPTY                     -12
#define     LEX_SLASH                     -13
#define     LEX_A                         '\a'
#define     LEX_B                         '\b'
#define     LEX_F                         '\f'
#define     LEX_N                         '\n'
#define     LEX_R                         '\r'
#define     LEX_T                         '\t'
#define     LEX_V                         '\v'
#define     C_STRING_END                  0
#define     C_ROUND_BRACKET_OPEN          '('
#define     C_ROUND_BRACKET_CLOSE         ')'
#define     C_SQUARE_BRACKET_OPEN         '['
#define     C_SQUARE_BRACKET_CLOSE        ']'
#define     C_STAR                        '*'
#define     C_COMMA                       ','
#define     C_BACKSLASH                   '\\'
#define     C_SLASH                       '/'
#define     C_DOT                         '.'
#define     C_A                           'a'
#define     C_B                           'b'
#define     C_F                           'f'
#define     C_N                           'n'
#define     C_R                           'r'
#define     C_T                           't'
#define     C_V                           'v'
#define     BUF_INPUT_SIZE                2048
#define     ERR_NO_ERR_NORMAL             0
#define     ERR_USAGE                     1
#define     ERR_PARSE                     2
#define     ERR_SYS                       3
#define     ERR_NO_ERROR_USER             4
#define     ERR_PARSE_FORGOT_COMMA_IN_OR_INDEX                0
#define     ERR_PARSE_FORGOT_SQUARE_BRACKET_CLOSE_IN_OR_INDEX 1
#define     ERR_PARSE_FORGOT_ROUND_BRACKET_CLOSE_INDEX        2
#define     ERR_PROG_USAGE_WRONG_ARGS_INDEX                   3
#define     ERR_SYS_NOT_ENOUGH_MEMORY_INDEX                   4
#define     ERR_PARSE_FORGOT_COMMA_IN_OR_MSG                "%s Sie haben das Komma bei Alternative vergessen\n"
#define     ERR_PARSE_FORGOT_SQUARE_BRACKET_CLOSE_IN_OR_MSG "%s Sie haben vergessen bei der Alternative die Klammer zu schliessen\n"
#define     ERR_PARSE_FORGOT_ROUND_BRACKET_CLOSE_MSG        "%s fehler klammer vergessen %c %i\n"
#define     ERR_PROG_USAGE_WRONG_ARGS_MSG                       "%s Sie haben die falsche Anzahl an Parametern eingegeben oder sie haben Parameter fehlerhaft eingegeben\n"
#define     ERR_SYS_NOT_ENOUGH_MEMORY_MSG                   "Nicht genug Arbeitsspeicher vorhanden"
#define     ERR_TOP_NO_ERROR_NORMAL_MSG                     "Das Programm läuft korrekt"
#define     ERR_TOP_USAGE_ERROR_MSG                         "Fehler bei der Verwendung des Programms: "
#define     ERR_TOP_PARSER_ERROR_MSG                        "Parser Error: "
#define     ERR_TOP_SYS_ERROR_MSG                           "System Error: "
#define     ERR_TOP_NO_ERROR_USER_MSG                       "User Message: "
#define     HLP_MSG_0_MSG                                   "%s %s: Zeigt diese hilfe an\n"
#define     HLP_MSG_SEARCH_MSG                              "%s <PATTERN> Sucht nach dem Muster <PATTERN> im Text\n"
#define     USER_MSG_FOUND                                  "%s Das Suchmuster wurde gefunden\n"
#define     USER_MSG_NOT_FOUND                              "%s Das Suchmuster wurde nicht gefunden\n"
#define     USER_MSG_LINE                                   "%s Zeile: %i, Spalte: %i\n" 
#define     PARAMETER_0_HELP_STR            "--help"      
#define     PARAMETER_SEARCH_STR            "--search"      

#define     MIN_ARGC                2
#define     MAX_ARGC                3
#define     HLP_MSG_0_INDEX         0
#define     HLP_MSG_SEARCH_INDEX    1
#define     HLP_MSG_MAX_INDEX       1
#define     PARAMETER_0_HELP_INDEX  0
#define     PARAMETER_SEARCH_INDEX  1
#define     PARAMETER_MAX_INDEX     1
#define     USER_MSG_FOUND_INDEX      0
#define     USER_MSG_NOT_FOUND_INDEX  1
#define     USER_MSG_LINE_INDEX       2

#define     CODE_FOUND              1
#define     CODE_NOT_FOUND          0


const char errtopmsg [][128] = {ERR_TOP_NO_ERROR_NORMAL_MSG, ERR_TOP_USAGE_ERROR_MSG , ERR_TOP_PARSER_ERROR_MSG, ERR_TOP_SYS_ERROR_MSG, ERR_TOP_NO_ERROR_USER_MSG};

const char errmsg [][256] = {ERR_PARSE_FORGOT_COMMA_IN_OR_MSG, \
                    ERR_PARSE_FORGOT_SQUARE_BRACKET_CLOSE_IN_OR_MSG, \
                    ERR_PARSE_FORGOT_ROUND_BRACKET_CLOSE_MSG, \
                    ERR_PROG_USAGE_WRONG_ARGS_MSG, \
                    ERR_SYS_NOT_ENOUGH_MEMORY_MSG };
const char helpmsg [][256] = {HLP_MSG_0_MSG, HLP_MSG_SEARCH_MSG};
const char parameterstr [][32] = {PARAMETER_0_HELP_STR, PARAMETER_SEARCH_STR};

const char usermsg [][256] = {USER_MSG_FOUND, \
                              USER_MSG_NOT_FOUND, \
                              USER_MSG_LINE};

int *state1 = NULL;
int *state2 = NULL;
int *v = NULL;
char *text;
int i = 0;
int x = 0;
int statexn = 0;
char *expr = NULL;

int initstates () {
    int l;

    for (l = 0;  l < X;  l++) {
        v [l] = CONTROLSTATE;
        state1 [l] = state2 [l] = 0;
    }
}

void allocstates () {
  int k;
  if (x == 0) {
    if ((void *)state2 == NULL) {
      if ((state1 = (int *) malloc (sizeof (int) * X)) == NULL) {
        fprintf (stderr, errmsg[ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
        exit (ERR_SYS);
      }
      if ((state2 = (int *) malloc (sizeof (int) * X)) == NULL) {
        fprintf (stderr, errmsg[ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
        exit (ERR_SYS);
      }
      if ((v = (int *) malloc (sizeof (int) * X)) == NULL) {
        fprintf (stderr, errmsg[ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
        exit (ERR_SYS);
      }
      for (k = 0;  k < X;  k++)
        v [k] = CONTROLSTATE;
      statexn = X;
      return;
    }
    else {
      if ((state1 = (int *) realloc (state1, sizeof (int) * (X + statexn))) == NULL) {
        fprintf (stderr, errmsg[ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
        exit (ERR_SYS);      
      }
      if ((state2 = (int *) realloc (state2, sizeof (int) * (X + statexn))) == NULL) {
        fprintf (stderr, errmsg[ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
        exit (ERR_SYS);      
      }
      if ((v = (int *) realloc (v, sizeof (int) * (X + statexn))) == NULL) {
        fprintf (stderr, errmsg[ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
        exit (ERR_SYS);      
      }
      for (k = statexn;  k < (statexn + X);  k++)
        v [k] = CONTROLSTATE;

      statexn += X;

      return;
    }
  }
  return;
}


int gettoken () {
    if ((expr [i] == C_STRING_END))
      return LEX_END;
    else if (expr [i] == C_ROUND_BRACKET_OPEN) {
      i++;
      return LEX_ROUND_BRACKET_OPEN;
    }
    else if (expr [i] == C_ROUND_BRACKET_CLOSE) {
      i++;
      return LEX_ROUND_BRACKET_CLOSE;
    }
    else if (expr [i] == C_SQUARE_BRACKET_OPEN) {
      i++;
      return LEX_SQUARE_BRACKET_OPEN;
    }
    else if (expr [i] == C_SQUARE_BRACKET_CLOSE) {
      i++;
      return LEX_SQUARE_BRACKET_CLOSE;
    }
    else if (expr [i] == C_STAR) {
      i++;
      return LEX_STAR;
    }
    else if (expr [i] == C_COMMA) {
      i++;
      return LEX_COMMA;
    }
    else if (expr [i] == C_DOT) {
      i++;
      return LEX_DOT;
    }
    else if (expr [i] == C_SLASH) {
      i++;
      return LEX_SLASH;
    }
    else if (expr [i] == C_BACKSLASH) {
       i++;
       if (expr [i] == C_A) {
          i++;
          return LEX_A;
       }
       else if (expr [i] == C_B) {
          i++;
          return LEX_B;
       }
       else if (expr [i] == C_F) {
          i++;
          return LEX_F;
       }
       else if (expr [i] == C_N) {
          i++;
          return LEX_N;
       }
       else if (expr [i] == C_R) {
          i++;
          return LEX_R;
       }
       else if (expr [i] == C_T) {
          i++;
          return LEX_T;
        }
        else if (expr [i] == C_V) {
          i++;
          return LEX_V;
        }
        
       return expr [i++];
    }
    else if ((expr [i] >= ASCIIMIN) && (expr [i] <= ASCIIMAX)) {
      return expr [i++];
    }
}
int tokenback_rec_mask1(int);
int tokenback_rec_mask2(int);

int tokenback_rec_mask1 (int j) {
  if (expr [j] == '\\') 
    return tokenback_rec_mask2 (j-1);
  else
    return 1;
}
int tokenback_rec_mask2 (int j) {
  if (expr [j] == '\\') 
    return tokenback_rec_mask1 (j-1);
  else
    return 0;
}

void tokenback () {
  i-=(2-tokenback_rec_mask1(i-2));
}
struct fracture {
    int begin;
    int mid;
    int end;
    int tail;
    int d1_begin;
    int d2_begin; 
    int d3_begin;
    int d1_end;
    int d2_end;
    int d3_end;
    int exists;
};

struct fracture stream ();
struct fracture followed ();
struct fracture compound ();
struct fracture or_operator ();
struct fracture repeat_operator ();
struct fracture fracinit ();
void operations ();

void debug (char fname [], struct fracture ret) {
  int k;
  /*
  printf ("=====================================\n");
  printf ("function name:\t\t%s\n", fname);
  printf ("y.begin:\t\t %3i\n", ret.begin);
  printf ("y.end:\t\t %3i\n", ret.end);
  printf ("y.d1_begin:\t\t %3i\n", ret.d1_begin);
  printf ("y.d1_end:\t\t %3i\n", ret.d1_end);
  printf ("y.d2_begin:\t\t %3i\n", ret.d2_begin);
  printf ("y.d2_end:\t\t %3i\n", ret.d2_end);
  printf ("y.exists:\t\t %2i\n", ret.exists);
  printf ("x:\t\t\t (%3i, (%i, %i))\n", x, state1 [x], state2 [x]);
  printf ("=====================================\n");
  for (k = 0;  k <= x;  k++) {
      if ((v[k] >= 'a') && (v[k] <= 'z'))
        printf ("(%i, (%c, %i, %i))\n", k, v[k], state1 [k], state2 [k]);
      else
        printf ("(%i, (%i, %i))\n", k, state1 [k], state2 [k]);
  }
  printf ("=====================================\n");*/
  //getchar ();
}

struct fracture fracinit () {
  struct fracture x;
  x.begin = 0;
  x.mid = 0;
  x.end = 0;
  x.tail = 0;
  x.d1_begin = 0;
  x.d1_end = 0;
  x.d2_begin = 0;
  x.d2_end = 0;
  x.d3_begin = 0;
  x.d3_end = 0;
  x.exists = 0;
  return x;
}

void string () {
  int ch;
  while (((ch = gettoken ()) != END) && ((ch >= ASCIIMIN) && (ch <= ASCIIMAX))) {
    allocstates ();
    state1 [x] = x+1;
    state2 [x] = x+1;
    v [x] = ch;
    x++;
  }
  allocstates ();
  state1 [x] = 0;
  state2 [x] = 0;
  v [x] = CONTROLSTATE;
  allocstates ();
  x++;
  tokenback ();
}

void operations () {
  int ch;
  if ((ch = gettoken ()) == LEX_SLASH) {
    if ((ch = gettoken ()) == 's') {
      allocstates ();
      state1 [x] = x+1;
      state2 [x] = x+1;
      v [x] = OPERATIONSTATESUBSTITUTE;
      x++;
      if ((ch = gettoken ()) != LEX_SLASH) {
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);
      }
      or_operator ();
      if ((ch = gettoken ()) != LEX_SLASH) {
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);        
      }
      x++;
      allocstates ();
      state1 [x] = x+1;
      state2 [x] = x+1;
      v [x] = OPERATIONSTATESUBSTITUTEWITH;
      x++;
      string ();
      
      if ((ch = gettoken ()) != LEX_SLASH) {
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);        
      }
      allocstates ();
      state1 [x] = x+1;
      state2 [x] = x+1;
      v [x] = OPERATIONSTATEEND;
      x++;
      operations ();
    }
    else if (ch == 'f') {
      if ((ch = gettoken ()) != LEX_SLASH) {
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);      
      }
      or_operator ();
      if ((ch = gettoken ()) != LEX_SLASH) {
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);
      }
    }
    else {
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);    
    }
  }
  else if (ch != LEX_END){
        fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
        exit (ERR_USAGE);    
  }
}

struct fracture or_operator () {
    int ch;
    struct fracture x1 = fracinit ();
    struct fracture x2 = fracinit ();
    struct fracture x3 = fracinit ();
    struct fracture y = fracinit ();
    
    if ((ch = gettoken ()) == LEX_SQUARE_BRACKET_OPEN) {
        allocstates ();
        y.begin = x;
        x++;
        x1 = or_operator ();

        if ((ch = gettoken ()) != LEX_COMMA) {
            fprintf (stderr, errmsg [ERR_PARSE_FORGOT_COMMA_IN_OR_INDEX], errtopmsg [ERR_PARSE]);
            exit (1);
        }
        y.d1_begin = x1.begin;
        y.d1_end = x1.end;
        
        x2 = or_operator ();
        y.d2_begin = x2.begin;
        y.d2_end = x2.end;
        if ((ch = gettoken ()) != LEX_SQUARE_BRACKET_CLOSE) {
            fprintf (stderr, errmsg [ERR_PARSE_FORGOT_SQUARE_BRACKET_CLOSE_IN_OR_INDEX], errtopmsg [ERR_PARSE]);
            exit (1);
        }
        allocstates ();
        y.end = x;
        x++;
        
        
        state1 [y.begin] = x1.begin;
        state2 [y.begin] = x2.begin;
        state1 [x1.end] = y.end;
        state2 [x1.end] = y.end;
        state1 [x2.end] = y.end;
        state2 [x2.end] = y.end;
        x3 = or_operator ();
        if (x3.begin != 0) {
          allocstates ();
          state1 [y.end] = x+1;
          state2 [y.end] = x+1;
          x++;
          y.end = x;
          y.tail = x3.begin;
          state1 [y.end] = y.tail;
          state2 [y.end] = y.tail;
        }
        debug ("or_operator", y);
        return y;
    }
    else if (ch == LEX_END)
      return fracinit ();
    else {
        tokenback ();
        y = repeat_operator ();
        if (y.exists != 0)
          or_operator ();
        debug ("or_operator", y);
        return y;
    }
}


struct fracture repeat_operator () {
    int ch;
    struct fracture y = fracinit ();
    struct fracture x1 = fracinit ();

    if ((ch = gettoken ()) == LEX_STAR) {
        allocstates ();
        x1 = compound ();
        y.begin = x1.begin;
        y.mid = x;
        x++;
        allocstates ();
        y.end = x;
        x++;
        state1 [x1.end] = y.mid;
        state2 [x1.end] = y.mid;
        
        state1 [y.end] = y.end+1;
        state2 [y.end] = y.end+1;
        state1 [x1.end] = x1.end+1;
        state2 [x1.end] = x1.end+1;
        state1 [y.mid] = x1.begin;
        state2 [y.mid] = y.end;
        // Den zweiten Zustand der muss auf das naechste zeigen
        stream ();
        debug ("repeat_operator", y);
        y.exists = 1;
        return y;
    }
    else if (ch == LEX_END) 
      return fracinit ();
    else {
        tokenback ();
        y = stream ();
        debug ("repeat_operator", y);
        return y;
    }
}
struct fracture stream () {
    struct fracture x1 = fracinit ();
    struct fracture x2 = fracinit ();
    struct fracture x3 = fracinit ();
    struct fracture y = fracinit ();
  
    x1 = compound ();
    x2 = followed ();
    
    //state1 [x1.end] = x2.begin;
   
    //stream ();
    if (x1.exists || x2.exists)  {
      or_operator ();/*
      x3 = or_operator ();
      if (x2.exists) {
        state1 [x2.end] = x3.begin;
      }
      else {
        state1 [x1.end] = x3.begin;
      }*/
    }
    
    debug ("stream", y);
    y = x2;
    return y;
}

struct fracture followed () {
    struct fracture x1 = fracinit ();
    struct fracture y = fracinit ();
    
    int ch = gettoken ();
    
    if ((ch >= ASCIIMIN) && (ch <= ASCIIMAX)) {
        allocstates ();
        v [x] = ch;
        y.begin = x;
        x = x+1;
        
        x1 = or_operator ();
        if (x1.end == 0) {
          y.end = y.begin;
          y.exists = 1;
        }
        else {
          y.d1_begin = x1.begin;
          y.end = x1.end;
          y.exists = 1;
        }
        state1 [y.begin] = x1.begin;
        state2 [y.begin] = x1.begin;
        state1 [y.end] = y.end+1;
        state2 [y.end] = y.end+1;
        
        debug ("followed", y);
        return y;
    }
    else if (ch == LEX_END)
      return fracinit ();
    else {
        y.exists = 0;
        tokenback ();
        y = fracinit ();
        debug ("followed", y);
        return y;
    }
}

struct fracture compound () {
    struct fracture x1 = fracinit ();
    int ch;
    if (gettoken () == LEX_ROUND_BRACKET_OPEN) {
        x1 = or_operator ();
        if ((ch = gettoken ()) != LEX_ROUND_BRACKET_CLOSE) {
            fprintf (stderr, errmsg[ERR_PARSE_FORGOT_ROUND_BRACKET_CLOSE_INDEX], errtopmsg [ERR_PARSE], expr [i], i);
            exit (1);
        }
        x1.exists = 1;
        
        debug ("compound", x1);
        return x1;
    }
    else if (ch == LEX_END)
      return fracinit ();
    else {
        x1.exists = 0;
        tokenback ();
        debug ("compound", x1);
        return x1;
    }
}



int automat (int, int);
int to;

int outerautomat (int xtext) {
  int fromto;
  int xy;
  
  for (xy = 0, fromto = 1; xtext < strlen (text); xtext += fromto) {
    if (xy < x) {
      while ((v [xy] == CONTROLSTATE) && (state1 [xy] == 0) && (state2 [xy] == 0))
        xy++;
      if (v [xy] == OPERATIONSTATESUBSTITUTE) {
        xy++;
        if (automat (xy, xtext) == 0) {
          while (v [xy] != OPERATIONSTATEEND) xy++;
          xy++;
          while (v [xy] == CONTROLSTATE) xy++;
          fromto = 0;
        }
        else {
          while (v [xy] != OPERATIONSTATESUBSTITUTEWITH)
            xy++;
          xy++;
          while ((state1 [xy] != 0) && (state2 [xy] != 0)) {
            printf ("%c", v[xy]);
            xy = state1 [xy];
          }
          xy = 0;
          fromto = (to - xtext)+1;
        }
      }
    }
    else if (xy >= x) {
      printf ("%c", text [xtext]);
      fromto = 1;
      xy = 0;
    }
  }
}

int automat (int xreal, int xtext) {
    int exists = 0;
    
    if ((strlen (text) <= xtext) || (state1 [xreal] == 0)) {
      to = xtext;
      return 1;
    }
    if (v [xreal] == CONTROLSTATE) {
      if (state1 [xreal] == state2 [xreal]) 
        exists = automat (state1 [xreal], xtext);
      else
        exists = automat (state1 [xreal], xtext) || automat (state2 [xreal], xtext);
    }
    else if ((v [xreal] >= ASCIIMIN) && (v [xreal] <= ASCIIMAX))  {
      if (v [xreal] == text [xtext]) {
        exists = 1;
      }
      else if (v [xreal] != text [xtext]) 
        return 0;
      if (state1 [xreal] == state2 [xreal]) 
        exists &= automat (state1 [xreal], xtext+1);
      else
        exists &= (automat (state1 [xreal], xtext+1) || automat (state2 [xreal], xtext+1));
    }
    return exists;
}
    
      

void main (int argc, char *argv[]) {
    int h;
    int k, l;
    int ch;
    char textbuf [BUF_INPUT_SIZE];
    char *p;
    int t1, t2;
    int line = 0;
    int *lines;
    int lineindicator = 0;
    int columnindicator = 0;
    int lineindicatorindex = 0;
    
    if (!((argc >= MIN_ARGC) && (argc <= MAX_ARGC))) {
      fprintf (stderr, errmsg [ERR_PROG_USAGE_WRONG_ARGS_INDEX], errtopmsg [ERR_USAGE]);
      fprintf (stderr, helpmsg [HLP_MSG_0_INDEX], argv [0], parameterstr [PARAMETER_0_HELP_INDEX] );
      exit (ERR_USAGE);
    }
    if (argc == 2) {
      if (strcmp (argv [1], parameterstr [PARAMETER_0_HELP_INDEX]) == 0) {
                  fprintf (stderr, helpmsg [HLP_MSG_0_INDEX], argv [0], parameterstr [PARAMETER_0_HELP_INDEX] );
      for (h = 1;  h <= PARAMETER_MAX_INDEX; h++) 
            fprintf (stderr, helpmsg [h], parameterstr [h]);
      }
    }
    else if (argc == 3) {
      if (strcmp (argv [1], parameterstr [PARAMETER_SEARCH_INDEX]) == 0) {
        if ((expr = (char *)malloc (sizeof (char) * strlen(argv [2]))) == NULL) {
          fprintf (stderr, errmsg [ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
          exit (ERR_SYS);
        }
        strcpy (expr, argv [2]);
      }
    }
    
    //initstates ();
    //or_operator ();
    operations ();
    //printf ("success\n");
    
    if ((text = (char *)malloc (sizeof(char)*BUF_INPUT_SIZE)) == NULL) {
      fprintf (stderr, errmsg [ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
      exit (ERR_SYS);
    }
    if ((lines = (int *) malloc (sizeof (int) * BUF_INPUT_SIZE)) == NULL) {
      fprintf (stderr, errmsg [ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
      exit (ERR_SYS);        
    }
    t1 = 0;
    text [0] = 0;
    do {
      //if (fgets (textbuf, BUF_INPUT_SIZE, stdin) == NULL)
        //break;
      p = textbuf;
      t2 = 0;
      while (((ch = fgetc (stdin)) != EOF) && (t2 < BUF_INPUT_SIZE)) {
        *p = ch;
        if (ch == '\n') {
          lines[line] = t1+t2;
          line++;
        }
        p++;
        t2++;
        if (((line % BUF_INPUT_SIZE) == 0) && (line != 0)) {
          if ((lines = realloc (lines, (line+BUF_INPUT_SIZE) * sizeof (int))) == NULL) {
            fprintf (stderr, errmsg [ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
           exit (ERR_SYS);                
          }
        }
      }
      *p = 0;
      t2++;
      t1 = t1 + t2;
      strcat (text, textbuf);
      if (t2 >= BUF_INPUT_SIZE) {
        if ((text = realloc (text, t1+BUF_INPUT_SIZE)) == NULL) {
          fprintf (stderr, errmsg [ERR_SYS_NOT_ENOUGH_MEMORY_INDEX], errtopmsg [ERR_SYS]);
          exit (ERR_SYS);        
        }
      }      
    } while (strlen(textbuf) > 0);
    //printf (text);
    
    for (k = 0;  k <= x;  k++) {
      if ((v[k] >= 'a') && (v[k] <= 'z'))
        printf ("(%i, (%c, %i, %i))\n", k, v[k], state1 [k], state2 [k]);
      else
        printf ("(%i, (%i, %i, %i))\n", k, v[k], state1 [k], state2 [k]);
    } 
    /*for (k = 0, lineindicator = 0, lineindicatorindex = 0;  k < strlen (text);  k++) {
      if (k == lines[lineindicatorindex+1]) {
        lineindicator = lines [lineindicatorindex];
        columnindicator = 0;
        lineindicatorindex++;
      }
      if (automat(0,k) == CODE_FOUND) {
        fprintf (stdout, usermsg [USER_MSG_FOUND_INDEX], errtopmsg [ERR_NO_ERROR_USER] );
        fprintf (stdout, usermsg [USER_MSG_LINE_INDEX], errtopmsg [ERR_NO_ERROR_USER], lineindicatorindex, columnindicator);
      }
      columnindicator++;
    }*/
    outerautomat (0);
exit (ERR_NO_ERR_NORMAL); 
}