/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2021-05-8/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/pascal-compiler/siac4tread-first/tcpiplang26combined.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 4026
#define RCVBUFSIZE 8192


int is_while(char *);
int is_if(char *);
int is_fi(char *);
int is_then(char *);
int is_else(char *);
int is_do(char *);
int is_od(char *);
int is_begin(char *);
int is_end(char *);
int is_set(char *);
int is_id(char *);
int is_plus(char *);
int is_mult(char *);
int is_minus(char *);
int is_div(char *);
int is_semicolon(char *);
int is_open_round_bracked(char *);
int is_closed_round_bracked(char *);
int is_cop_equal(char *);
int is_cop_less(char *);
int is_cop_greater(char *);
int is_cop_less_equal(char *);
int is_cop_greater_equal(char *);
int is_num(char *);

int is_while(char *str) {return ((str[0] == 'w') && (str[1] == 'h') && (str[2] == 'i') && (str[3] == 'l') && (str[4] == 'e') && (str[5] == 0));}
int is_if(char *str) {return ((str[0] == 'i') && (str[1] == 'f') && (str[2] == 0));}
int is_fi(char *str) {return ((str[0] == 'f') && (str[1] == 'i') && (str[2] == 0));}
int is_then(char *str) {return ((str[0] == 't') && (str[1] == 'h') && (str[2] == 'e') && (str[3] == 'n') && (str[4] == 0));}
int is_else(char *str) {return ((str[0] == 'e') && (str[1] == 'l') && (str[2] == 's') && (str[3] == 'e'));}
int is_do(char *str) {return ((str[0] == 'd') && (str[1] == 'o') && (str[2] == 0));}
int is_od(char *str) {return ((str[0] == 'o') && (str[1] == 'd') && (str[2] == 0));}
int is_begin(char *str) {return ((str[0] == 'b') && (str[1] == 'e') && (str[2] == 'g') && (str[3] == 'i') && (str[4] == 'n') && (str[5] == 0));}
int is_print(char *str) {return ((str[0] == 'p') && (str[1] == 'r') && (str[2] == 'i') && (str[3] == 'n') && (str[4] == 't') && (str[5] == 0));} 
int is_end(char *str) {return ((str[0] == 'e') && (str[1] == 'n') && (str[2] == 'd') && (str[3] == 0));}
int is_set(char *str) {return ((str[0] == ':') && (str[1] == '=') && (str[2] == 0));}
int is_id(char *str) {return ((str[0] >= 'a') && (str[0] <= 'z') && (str[1] == 0));}
int is_plus(char *str) {return ((str[0] == '+') && (str[1] == 0));}
int is_minus(char *str) {return ((str[0] == '-') && (str[1] == 0));}
int is_mult(char *str) {return ((str[0] == '*') && (str[1] == 0));}
int is_div(char *str) {return ((str[0] == '/') && (str[1] == 0));}
int is_semicolon(char *str) {return ((str[0] == ';') && (str[1] == 0));}
int is_open_round_bracked(char *str) {return ((str[0] == '(') && (str[1] == 0));}
int is_closed_round_bracked(char *str) {return ((str[0] == ')') && (str[1] == 0));}
int is_cop_equal(char *str) {return ((str[0] == '=') && (str[1] == '=') && (str[2] == 0));}
int is_cop_less(char *str) {return ((str[0] == '<') && (str[1] == 0));}
int is_cop_less_equal(char *str) {return ((str[0] == '<') && (str[1] == '=') && (str[2] == 0));}
int is_cop_greater(char *str) {return ((str[0] == '>') && (str[1] == 0));}
int is_cop_greater_equal(char *str) {return ((str[0] == '>') && (str[1] == '=') && (str[2] == 0));}
int is_num(char *str) {
    int flag = 1;
    int i;
        
    for(i = 0;  str[i] != 0;  i++)
        if(!((str[i] >= '0') && (str[i] <= '9')))
            flag = 0;
return flag;
}


char buf[1024*1024];
char tmp_str[256];
int  buf_i = 0;
int  buf_len;
int line_counter = 0;
int line_cntr = 0;

char var_name_str_array[128][128];
int var_name_str_array_stack_ptr = 0;


#define N_LINES             256
#define LINE_MAX_CH         128
#define N_VAR_ABC            26
#define N_VAR_X            1024
#define N_ATOM               20
#define ATOM_MAX_CH          16
#define N_LABELS             16

char code[N_LINES][LINE_MAX_CH];
int var_abc[N_VAR_ABC];
int var_x[N_VAR_X];

char atom[N_ATOM][ATOM_MAX_CH];
int labels[N_LABELS];

int get_atom_token(char *d, char *s) {
    char *p;
    
    p = s;
    while ((*s != ' ' ) && (*s != 0) && (*s != ',') && (*s != '\n')) {
        *d = *s;
        s++;
        d++;
    }
    *d = 0;
    while ((*s == ',') || (*s == ' ') || (*s == '\n')) s++;
return (s-p);
}

int get_atoms(int line) {
    int i;
    int length;
    int length2;
    
    length = 0;
    for (i = 0;  ; i++) {
        if((length2 = get_atom_token(atom[i], code[line] + length)) == 0)
            break;
        length += length2;
    }
    

    
return 9;
}

int get_index_of_x_var(char *s) {
    int i;
    
    s++;
    i = 0;
    
    while (*s != 0) {
        i += *s - '0';
        i *= 10;
        s++;
    }
    i /= 10;
    
return i;
}

int strint(char *s) {
    int i;
    
    i = 0;
    
    while (*s != 0) {
        i += *s - '0';
        i *= 10;
        s++;
    }
    i /= 10;
    
return i;
}


void push_var_name_str(char *str) {
    strcpy(var_name_str_array[var_name_str_array_stack_ptr], str);
    var_name_str_array_stack_ptr++;
return;
}

void pop_var_name_str(char *str) {
    var_name_str_array_stack_ptr--;
    strcpy(str, var_name_str_array[var_name_str_array_stack_ptr]);
return;
}

int expr_next_var_name_i = 1;

void expr_get_prev_var_name(char *str) {
    sprintf(str, "x%i", expr_next_var_name_i-1);
return;
}

void expr_get_next_var_name(char *str) {
    sprintf(str, "x%i", expr_next_var_name_i);
    expr_next_var_name_i++;
return;
}


char label_str_array[128][128];
int label_str_array_stack_ptr = 0;

void push_label_str(char *str) {
    strcpy(label_str_array[label_str_array_stack_ptr], str);
    label_str_array_stack_ptr++;
return;
}

void pop_label_str(char *str) {
    label_str_array_stack_ptr--;
    strcpy(str, label_str_array[label_str_array_stack_ptr]);
return;
}

int expr_next_label_i = 1;

void get_prev_label(char *str) {
    sprintf(str, "label %i", expr_next_label_i-1);
return;
}

void get_next_label(char *str) {
    sprintf(str, "label %i", expr_next_label_i);
    expr_next_label_i++;
return;
}

int lex_get_token_from_stream(char *str) {
    int i;
    int ch;
    
    if(buf_i == buf_len)
        return 0;
    
    ch = buf[buf_i];
    i = 0;

    if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i ) < buf_len)) {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        while ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i) < buf_len)) {
            str[i] = ch;
            i++;
            ch = buf[buf_i + i];
        }
        str[i] = 0;
    }
    else if ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        while ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
            str[i] = ch;
            i++;
            ch = buf[buf_i + i];
        }
        str[i] = 0;
    }
    else if(ch == '=') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '!') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '<') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '>') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == ':') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '.') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + 1];
        if(ch == '.') {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else {
        str[i] = ch;
        i++;
        str[i] = 0;
    }
    return i;
}

int lex_get_token_from_stream_ws(char *str) {
    int i;
    
    i = lex_get_token_from_stream(str);
    while (((str[0] == '\n') || (str[0] == '\t') || (str[0] == '\r') || (str[0] == ' ')) && ((buf_i + i) < buf_len)) {
        buf_i += i;
        i = lex_get_token_from_stream(str);
        if(i == 0)
            return 0;
    }
return i;
}

int statement(void);
int statement2(void);
int assignment(void);
int cond(void);
int loop(void);
int expr(void);
int boolexpr(void);
int numexpr(void);
int numexpr2(void);
int term(void);
int term2(void);
int factor (void);
int print (void);
int program (void);
int id (void);

int statement2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;

    if(assignment()) 
        retval = 1;
    else if(cond()) 
        retval = 1;
    else if(loop())
        retval = 1;
    else if(print())
        retval = 1;
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return retval;
}

int statement(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_j;
    
    if(statement2()) {
        buf_j = lex_get_token_from_stream_ws(str);
        if (is_semicolon(str)) {
            buf_i += buf_j;
            retval = statement();
        }
        else 
            retval = 1;
    }
    else {
        retval = 0;
        buf_i = buf_i_start;
    }

return retval;
}

int id (void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if (is_id(str)) {
        buf_i += buf_j;
        retval = 1;
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return retval;
}


int print (void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if (is_print(str)) {
        sprintf(code[line_cntr], "print ");
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if (is_id(str)) { 
            sprintf(code[line_cntr]+strlen("print "), "%s", str);
            line_cntr++;
            buf_i += buf_j;
            retval = 1;
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return retval;
}

int assignment(void) {
    char str[256];
    char str1[256];
    char str2[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if (is_id(str)) {
        push_var_name_str(str);
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if (is_set(str)) {
            buf_i += buf_j;
            if (numexpr()) {
                pop_var_name_str(str1);
                pop_var_name_str(str2);
                sprintf(code[line_cntr], "set %s, %s", str2, str1);
                line_cntr++;
                return 1;
            }
            else {
                retval = 0;
                buf_i = buf_i_start;
            }
        }
        else {
            retval = 0;
            buf_i = buf_i_start;
        }
    }
    else {
        retval = 0;
        buf_i = buf_i_start;
    }
    
return retval;
}

int cond(void) {
    char str[256];
    char label_str[256];
    char label_str2[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if (is_if(str)) {
        buf_i += buf_j;
        
        sprintf(code[line_cntr], "jump if not");
        line_cntr++;
        if (boolexpr()) {
            get_next_label(label_str);
            push_label_str(label_str);
            sprintf(code[line_cntr],"to %s", label_str);
            line_cntr++;
            buf_j = lex_get_token_from_stream_ws(str);
            if (is_then(str)) {
                buf_i += buf_j;
                if (statement()) {
                    buf_j = lex_get_token_from_stream_ws(str);
                    if (is_fi(str)) {
                        buf_i += buf_j;
                        retval = 1;
                        pop_label_str(label_str);
                        sprintf(code[line_cntr],"%s ", label_str);
                        line_cntr++;
                    }
                    else if (is_else(str)) {
                        get_next_label(label_str2);
                        sprintf(code[line_cntr],"jmp to %s", label_str2);
                        line_cntr++;
                        pop_label_str(label_str);
                        push_label_str(label_str2);
                        sprintf(code[line_cntr],"%s ", label_str);
                        line_cntr++;
                        buf_i += buf_j;
                        if (statement()) {
                            buf_j = lex_get_token_from_stream_ws(str);
                            if (is_fi(str)) {
                                buf_i += buf_j;
                                retval = 1;
                            }
                            else {
                                buf_i = buf_i_start;
                                retval = 0;
                            }
                        }
                        else {
                            buf_i = buf_i_start;
                            retval = 0;
                        }
                        pop_label_str(label_str);
                        sprintf(code[line_cntr],"%s ", label_str);
                        line_cntr++;
                    }
                    else {
                        buf_i = buf_i_start;
                        retval = 0;
                    }
                }
                else {
                    buf_i = buf_i_start;
                    retval = 0;
                }
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        retval = 0;
        buf_i = buf_i_start;
    }
    
return retval;
}


int loop(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char label_str[128];
    char label_str2[128];
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if (is_while(str)) {
        buf_i += buf_j;
        get_next_label(label_str2);
        sprintf(code[line_cntr], "%s", label_str2);
        line_cntr++;
        push_label_str(label_str2);
        sprintf(code[line_cntr], "jump if not");
        line_cntr++;
        if (boolexpr()) {
            get_next_label(label_str);
            push_label_str(label_str);
            sprintf(code[line_cntr], "to %s", label_str);
            line_cntr++;
            buf_j = lex_get_token_from_stream_ws(str);
            if (is_do(str)) {
                buf_i += buf_j;
                if(statement()) {
                    buf_j = lex_get_token_from_stream_ws(str);
                    if (is_od(str)) {
                        buf_i += buf_j;
                        retval = 1;
                        pop_label_str(label_str);
                        pop_label_str(label_str2);
                        sprintf(code[line_cntr], "jump to %s", label_str2);
                        line_cntr++;
                        sprintf(code[line_cntr], "%s ", label_str);
                        line_cntr++;
                    }
                    else {
                        retval = 0;
                        buf_i = buf_i_start;
                    }
                }
                else {
                    retval = 0;
                    buf_i = buf_i_start;
                }
            }
            else {
                retval = 0;
                buf_i = buf_i_start;
            }
        }
        else {
            retval = 0;
            buf_i = buf_i_start;
        }
    }
    else {
        retval = 0;
        buf_i = buf_i_start;
    }
    
return retval;
}

int expr(void) {
    int buf_i_start;
    int retval = 1;
    
    buf_i_start = buf_i;
    
    if (boolexpr())
        retval = 1;
    else if (numexpr())
        retval = 1;
    else {
        buf_i = buf_i_start;
        retval = 0;
    }
    
return retval;
}

int boolexpr(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char tmp_str2[128];
    char tmp_str3[128];
    
    buf_i_start = buf_i;
    
    if (numexpr()) {
        buf_j = lex_get_token_from_stream_ws(str);
        if (is_cop_equal(str)) {
            buf_i += buf_j;
            if (numexpr()) {
                pop_var_name_str(tmp_str2);
                pop_var_name_str(tmp_str3);
                sprintf(code[line_cntr], "equal %s, %s", tmp_str2, tmp_str3);
                line_cntr++;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else if (is_cop_greater(str)) {
            buf_i += buf_j;
            if (numexpr()) {
                pop_var_name_str(tmp_str2);
                pop_var_name_str(tmp_str3);
                sprintf(code[line_cntr], "greater %s, %s", tmp_str2, tmp_str3);
                line_cntr++;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else if (is_cop_greater_equal(str)) {
            buf_i += buf_j;
            if (numexpr()) {
                pop_var_name_str(tmp_str2);
                pop_var_name_str(tmp_str3);
                sprintf(code[line_cntr], "greaterequal %s, %s", tmp_str2, tmp_str3);
                line_cntr++;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }            
        }
        else if (is_cop_less(str)) {
            buf_i += buf_j;
            if (numexpr()) {
                pop_var_name_str(tmp_str2);
                pop_var_name_str(tmp_str3);
                sprintf(code[line_cntr], "less %s, %s", tmp_str2, tmp_str3);
                line_cntr++;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else if (is_cop_less_equal(str)) {
            buf_i += buf_j;
            if (numexpr()) {
                pop_var_name_str(tmp_str2);
                pop_var_name_str(tmp_str3);
                sprintf(code[line_cntr], "lessequal %s, %s", tmp_str2, tmp_str3);
                line_cntr++;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else {
            retval = 0;
            buf_i = buf_i_start;
        }
    }
    else {
        retval = 0;
        buf_i = buf_i_start;
    }
    
return retval;
}


int numexpr(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int retval2;
    int retval3;
    int buf_j;
    
    buf_i_start = buf_i;
    
    retval2 = term();
    if (retval2) {
        retval3 = numexpr2 ();
        if(retval3);
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval | retval2 | retval3);
}

int numexpr2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int retval2;
    int retval3;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];

    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_plus(str)) {
        buf_i += buf_j;
        retval2 = term ();
        pop_var_name_str(tmp_str2);
        pop_var_name_str(tmp_str3);
        expr_get_next_var_name(tmp_str4);
        sprintf(code[line_cntr], "add %s, %s, %s", tmp_str4, tmp_str2, tmp_str3);
        line_cntr++;
        push_var_name_str(tmp_str4);
        if(retval2) {
           retval3 = numexpr2 ();
           if(retval3);
           else {
               buf_i = buf_i_start;
               retval = 0;
           }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval | retval2 | retval3);
}


int term(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    int retval2;
    int retval3;
    
    buf_i_start = buf_i;
    
    retval2 = factor();
    if (retval2) {
        retval3 = term2 ();
        if(retval3);
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval | retval2 | retval3);
}

int term2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int retval2;
    int retval3;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];

    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_mult(str)) {
        buf_i += buf_j;
        retval2 = factor ();
        pop_var_name_str(tmp_str2);
        pop_var_name_str(tmp_str3);
        expr_get_next_var_name(tmp_str4);
        sprintf(code[line_cntr], "mul %s, %s, %s", tmp_str4, tmp_str2, tmp_str3);
        line_cntr++;
        push_var_name_str(tmp_str4);
        
        if(retval2) {
           retval3 = term2 ();
           if(retval3);
           else {
               buf_i = buf_i_start;
               retval = 0;
           }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval | retval2 | retval3);
}


int factor (void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_id(str)) {
        buf_i += buf_j;
        retval = 1;
        push_var_name_str(str);
    }
    else if (is_open_round_bracked(str)) {
        buf_i += buf_j;
        if (retval = numexpr()) {
            buf_j = lex_get_token_from_stream_ws(str);
            if (is_closed_round_bracked(str)) {
                buf_i += buf_j;
                retval = 1;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else if (is_num(str)) {
        buf_i += buf_j;
        retval = 1;
        push_var_name_str(str);
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return retval;
}

int program2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
        
    retval = statement();

return retval;
}

int program(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    
    retval = program2();
    
    if (retval) {
        buf_j = lex_get_token_from_stream_ws(str);
        if (is_end(str)) {
            buf_i += buf_j;
            retval = 1;
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
return retval;
}

static void get_buf(int client_socket)
{
    int recv_size;
    time_t zeit;

    if((recv_size = recv(client_socket, buf, RCVBUFSIZE,0)) < 0) {
        perror("Fehler bei recv()");
        ;
    }
    buf[recv_size] = '\0';
    buf_len = recv_size - 1;

return;
}

int main(int argc, char *argv[]) {
    FILE *fp;
    char str[256];
    char send_buf[8192];
    char str_send_buf[128];
    
    
    
    int i;
    int op1, op2, op3;
    int op1_num, op2_num, op3_num;
    int labelc;
    
    struct sockaddr_in server, client;

    int sock, fd;
    unsigned int len;

    strcpy(send_buf, "");
    strcpy(str_send_buf, "");
    
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock < 0) {
        perror("Fehler beim Anlegen eines Sockets");
        ;
    }
    memset( &server, 0, sizeof (server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(PORT);

    if(bind(sock,(struct sockaddr*)&server, sizeof( server)) < 0) {
        perror("Kann das Socket nicht \"binden\"");
        ;
    }

    if(listen(sock, 5) == -1 ) {
         perror("Fehler bei listen");
         ;
    }

    for (;;) {
        len = sizeof(client);
        fd = accept(sock, (struct sockaddr*)&client, &len);
        if (fd < 0) {
            perror("Fehler bei accept");
            ;
        }
        printf("Bearbeite den Client mit der Adresse: %s\n",
        inet_ntoa(client.sin_addr));
        get_buf(fd);
        printf("%s\n", buf);


    if(program())
        fprintf(stderr, "\n\n\nDer Code enthaelt keine Fehler - NO ERROR!!!\n");
    else
        fprintf(stderr, "\n\n\nDer Code enthaelt einen Fehler - ERROR!!!\n");

    line_counter = line_cntr;
    
    for(i = 0;  i < line_counter;  i++)
        printf("%s\n", code[i]);
    
    for (i = 0;  i < N_VAR_ABC;  i++)
        var_abc[i] = 0;
    for (i = 0;  i < N_VAR_X;  i++)
        var_x[i] = 0;
    
    for (i = 0;  i < N_LABELS;  i++)
        labels[i] = -1;
    
    for (i = 0;  i < line_counter; i++) {
        get_atoms(i);
        if (strcmp(atom[0], "label") == 0) {
            labelc = strint(atom[1]);
            labels[labelc] = i;
        }
        
    }
    
    for(i = 0;  i < N_LABELS;  i++)
        fprintf(stderr, "%i\n", labels[i]);
    fprintf(stderr, "\n\n");
    
    for (i = 0;  i < line_counter;  i++) {
        get_atoms(i);
        if(strcmp(atom[0], "add") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
                op1 = get_index_of_x_var(atom[1]);
                if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                    op2 = get_index_of_x_var(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_x[op1] = var_x[op2] + var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                       op3 = atom[3][0] - 'a';
                       var_x[op1] = var_x[op2] + var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_x[op1] = var_x[op2] + op3_num;
                    }
                }
                else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op2 = atom[2][0] - 'a';
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_x[op1] = var_abc[op2] + var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_x[op1] = var_abc[op2] + var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_x[op1] = var_abc[op2] + op3_num;
                    }
                }
                else if(((atom[2][0] >= '0') && (atom[2][0] <= '9'))) {
                    op2_num = strint(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_x[op1] = op2_num + var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_x[op1] = op2_num + var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_x[op1] = op2_num + op3_num;
                    }
                }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
                op1 = atom[1][0] - 'a';
                if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                    op2 = get_index_of_x_var(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_abc[op1] = var_x[op2] + var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                       op3 = atom[3][0] - 'a';
                       var_abc[op1] = var_x[op2] + var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_abc[op1] = var_x[op2] + op3_num;
                    }
                }
                else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op2 = atom[2][0] - 'a';
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_abc[op1] = var_abc[op2] + var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_abc[op1] = var_abc[op2] + var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_abc[op1] = var_abc[op2] + op3_num;
                    }
                }
                else if((atom[2][0] >= '0') && (atom[2][0] <= '9')) {
                    op2 = strint(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_abc[op1] = op2_num + var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_abc[op1] = op2_num + var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_abc[op1] = op2_num + op3_num;
                    }
                }

            }
        }
        if(strcmp(atom[0], "mul") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
                op1 = get_index_of_x_var(atom[1]);
                if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                    op2 = get_index_of_x_var(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_x[op1] = var_x[op2] * var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                       op3 = atom[3][0] - 'a';
                       var_x[op1] = var_x[op2] * var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_x[op1] = var_x[op2] * op3_num;
                    }
                }
                else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op2 = atom[2][0] - 'a';
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_x[op1] = var_abc[op2] * var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_x[op1] = var_abc[op2] * var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_x[op1] = var_abc[op2] * op3_num;
                    }
                }
                else if(((atom[2][0] >= '0') && (atom[2][0] <= '9'))) {
                    op2_num = strint(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_x[op1] = op2_num * var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_x[op1] = op2_num * var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_x[op1] = op2_num * op3_num;
                    }
                }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
                op1 = atom[1][0] - 'a';
                if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                    op2 = get_index_of_x_var(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_abc[op1] = var_x[op2] * var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                       op3 = atom[3][0] - 'a';
                       var_abc[op1] = var_x[op2] * var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_abc[op1] = var_x[op2] * op3_num;
                    }
                }
                else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op2 = atom[2][0] - 'a';
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_abc[op1] = var_abc[op2] * var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_abc[op1] = var_abc[op2] * var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_abc[op1] = var_abc[op2] * op3_num;
                    }
                }
                else if((atom[2][0] >= '0') && (atom[2][0] <= '9')) {
                    op2 = strint(atom[2]);
                    if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
                        op3 = get_index_of_x_var(atom[3]);
                        var_abc[op1] = op2_num * var_x[op3];
                    }
                    else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
                        op3 = atom[3][0] - 'a';
                        var_abc[op1] = op2_num * var_abc[op3];
                    }
                    else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
                        op3_num = strint(atom[3]);
                        var_abc[op1] = op2_num * op3_num;
                    }
                }

            }

            
        }
        if(strcmp(atom[0], "set") == 0) {
            if(!(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0))) {
                perror("Virtual Machine: Destination Operand, wrong format");
                ;
            }
            op1 = atom[1][0] - 'a';
            if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
               op2 = get_index_of_x_var(atom[2]);
               var_abc[op1] = var_x[op2];
            }
            else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
               op2 = atom[2][0] - 'a';
               var_abc[op1] = var_abc[op2];
            }
            else if((atom[2][0] >= '0') && (atom[2][0] <= '9')) {
               op2 = strint(atom[2]);
               var_abc[op1] = op2;
            }
        }
        if(strcmp(atom[0], "print") == 0) {
            op1 = atom[1][0] - 'a';
            sprintf(str_send_buf, "%i ", var_abc[op1]);
            strcat(send_buf, str_send_buf);
            
        }
        if (strcmp(atom[0], "jump") == 0) {
            if(strcmp(atom[1], "to") == 0) {
                if(strcmp(atom[2], "label") != 0) {
                    perror("Error in virual code");
                    ;
                }
                i = labels[strint(atom[3])];
            }
            
        }
        if (strcmp(atom[0], "less") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
               op2 = get_index_of_x_var(atom[1]);
               op1_num = var_x[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
               op2 = atom[1][0] - 'a';
               op1_num = var_abc[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
               op2 = strint(atom[1]);
               op1_num = op2;
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            if(op1_num < op2_num) {
              i++;
              get_atoms(i);
              if(strcmp(atom[0], "to") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              if(strcmp(atom[1], "label") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              i = labels[strint(atom[2])];
            }
        }
        
        if (strcmp(atom[0], "lessequal") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
               op2 = get_index_of_x_var(atom[1]);
               op1_num = var_x[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
               op2 = atom[1][0] - 'a';
               op1_num = var_abc[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
               op2 = strint(atom[1]);
               op1_num = op2;
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            if(op1_num <= op2_num) {
              i++;
              get_atoms(i);
              if(strcmp(atom[0], "to") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              if(strcmp(atom[1], "label") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              i = labels[strint(atom[2])];
            }
        }
        if (strcmp(atom[0], "greater") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
               op2 = get_index_of_x_var(atom[1]);
               op1_num = var_x[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
               op2 = atom[1][0] - 'a';
               op1_num = var_abc[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
               op2 = strint(atom[1]);
               op1_num = op2;
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            if(op1_num > op2_num) {
              i++;
              get_atoms(i);
              if(strcmp(atom[0], "to") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              if(strcmp(atom[1], "label") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              i = labels[strint(atom[2])];
            }
        }
        if (strcmp(atom[0], "greaterequal") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
               op2 = get_index_of_x_var(atom[1]);
               op1_num = var_x[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
               op2 = atom[1][0] - 'a';
               op1_num = var_abc[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
               op2 = strint(atom[1]);
               op1_num = op2;
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            if(op1_num >= op2_num) {
              i++;
              get_atoms(i);
              if(strcmp(atom[0], "to") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              if(strcmp(atom[1], "label") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              i = labels[strint(atom[2])];
            }
        }
        if (strcmp(atom[0], "equal") == 0) {
            if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
               op2 = get_index_of_x_var(atom[1]);
               op1_num = var_x[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
               op2 = atom[1][0] - 'a';
               op1_num = var_abc[op2];
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
               op2 = strint(atom[1]);
               op1_num = op2;
               if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
                   op3 = get_index_of_x_var(atom[2]);
                   op2_num = var_x[op3];
               }
               else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
                    op3 = atom[2][0] - 'a';
                    op2_num = var_abc[op3];
               }
               else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
                    op3 = strint(atom[2]);
                    op2_num = op3;
               }
            }
            if(op1_num == op2_num) {
              i++;
              get_atoms(i);
              if(strcmp(atom[0], "to") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              if(strcmp(atom[1], "label") != 0) {
                  perror("Error in virtual source code");
                  ;
              }
              i = labels[strint(atom[2])];
            }
        }
 
 
 
 
    }send(fd, send_buf, strlen(send_buf), 0); printf("%s\n", send_buf); strcpy(str_send_buf, ""); strcpy(send_buf, "");buf_i = 0;line_counter = 0; line_cntr = 0;var_name_str_array_stack_ptr = 0;expr_next_label_i = 1;}
    
return 0;    
}