#include <stdio.h>
#include <errno.h>
#include <stdbool.h>
int main (int argc, char** argv) {
//var(перед этим была проверка на argc < 2, т.к. должен быть второй аргумент - имя файла):
FILE* fp = fopen(argv[1], "r");
char curch; // current char
char curcmd[32]; // current command
//state system для удобства расширения интерпретатора, без этих макросов будет ад(в перспективе)
// list of states (ste is abbreviation of state)
#define STE_STD 0// standard state будет
#define STE_CMD 1 // state command в этом состояний
#define STE_STRING 2 // state string для считывания строк
#define STE_QUOTE quote_state // state quote см. про переменную quote_state
#define STE_CUR cur_state // current state
// state fn
#define STE_IS(state) (cur_state == state)
/*макрос STE_IS должен по другому если в нее передан STE_QUOTE. что-то типа следующего
#define STE_IS(state) #if state == STE_QUOTE
(quote_state)
#else
(cur_state == state)
#endif
но по причинам описанным выше код не работает. Со STE_EQU та же история:
#define STE_EQU(state) #if state == STE_QUOTE
(quote_state = true)
#else
(cur_state = state)
#endif
*/
#define STE_EQU(state) (cur_state = state)
int cur_state = STE_CMD;
bool quote_state = false; // переменная quote_state показывает равен ли curch ' или " без нее не получается взять текст в кавычках/апострофах без одного из них
//code:
while (true) {
//next char and check to EOF
curch = fgetc(fp);
if(feof(fp))
break;
//check to quote/string
STE_EQU((curch == '\'' || curch == '\"')? STE_QUOTE: STE_CUR); // перевод на псевдо код: если curch равен ' или ", то текущее состояние будет переписано на STE_QUOTE, иначе оно останется прежним
if(STE_IS(STE_STRING) && !STE_IS(STE_QUOTE)) { // проверка на то, что сейчас curch за кавычками, но не на них
if(curch == '\\') { // подобие escape последовательностей
curch = fgetc(fp);
if(feof(fp))
break;
if(curch == 'n') curch = '\n';
}
putchar(curch); // для проверки правильно ли работает state system
}
STE_EQU(STE_IS(STE_QUOTE)? STE_STRING: STE_CUR); // если curch равен " или ', то состояние переписывается на STE_STRING, т.к. следующий символ будет частью строки, иначе состояние не меняется
//basic comand system
// здесь должна была быть реализация print
}
fclose(fp);
return 0; //end
}
let game = new Game(),
r = new game.Rect();
r.draw()