#include "string.h" #include "stdlib.h" #include "stdio.h" #include "types.c" #define EOS '\0' #define INT_TYPE 1 #define DOUBLE_TYPE 2 #define STRING_TYPE 3 #define SYMBOL_TYPE 4 struct token { int ttype; union data tvalue; }; char read_char(char *line, int *cur_col) { char ch = line[*cur_col]; if (ch != EOS) { (*cur_col)++; return ch; } else printf("end"); return 0; } struct token get_token(char *line, int *cur_col, int *empty) { printf("calling gt on %s\n", line); int ttype; int bracket_level = 0; int bracket_start = 0; int bracket_end = 0; int int_start = 0; int int_end = 0; int symbol_start = 0; int symbol_end = 0; char ch; while ( ch = read_char(line, cur_col) ) { switch(ch) { case '{': { if (bracket_level == 0) { bracket_start = *cur_col; } bracket_level--; } break; case '}': { bracket_level++; if (bracket_level == 0) { bracket_end = *cur_col-1; char *bracketed_string = malloc(bracket_end-bracket_start+1); int bracket_length = bracket_end-bracket_start; strncpy(bracketed_string, line+bracket_start, bracket_length); bracketed_string[bracket_length]=EOS; struct token t; t.ttype=STRING_TYPE; t.tvalue.data_string = bracketed_string; free(bracketed_string); return t; } } break; default: { if (bracket_level >= 0 ) { if (isdigit(ch)) { int_start = *cur_col-1; ch = read_char(line, cur_col); while (isdigit(ch)) ch = read_char(line, cur_col); (*cur_col)--; int_end = *cur_col; char *int_string = malloc(int_end-int_start+1); strncpy(int_string, line+int_start, int_end-int_start); int_string[int_end-int_start]=EOS; struct token t; t.ttype=INT_TYPE; t.tvalue.data_int=atoi(int_string); free(int_string); return t; } else if (ch != ' ' && line[*cur_col-2] == ' '){ symbol_start = *cur_col-1; } else if (ch !=' ' && ( line[*cur_col] == ' ' || line[*cur_col] == EOS) ) { symbol_end = *cur_col; char *symbol_string = malloc(symbol_end-symbol_start+1); strncpy(symbol_string, line+symbol_start, symbol_end-symbol_start); symbol_string[symbol_end-symbol_start]=EOS; struct token t; t.ttype=SYMBOL_TYPE; t.tvalue.data_string=symbol_string; free(symbol_string); return t; } } else { // This is inside brackets, ignore. } } } } *empty = 1; }