static void fill (int mode) { int mark; while (c != EOF && !isspace (c) && c != '~') { if (mode == MATH && (c == '-' || c == '_' || c == '^')) return; if (c == ')' || c == '}' || c == ']') return; else if (c == '(') mark = ')'; else if (c == '{') mark = '}'; else if (c == '[') mark = ']'; else if (c == BSPAR) mark = ENDBSPAR; else if (c == BSSQB) mark = ENDBSSQB; else if (c == '$') mark = '$'; else mark = NULLTOKEN; release (c); c = next (); if (mark == ENDBSPAR || mark == ENDBSSQB || mark == '$') skip (mark); else if (mark != NULLTOKEN) { if (mode == TEXT || mark == '}') content (mark); else math (mark); checkpar (mark); release (c); c = next (); } } while (isspace (c) || c == '~') { release (c); c = next (); } }
static void math (int endmark) { int prev; while (c != EOF && c != endmark) { if (c == DOT) { release ('\\'); c = next (); command (MATH); } else if (c == '^' || c == '_') script (); else if (isalpha (c)) { prev = c; c = next (); if (isalpha (c)) { release ('\\'); release (prev); command (MATH); } else release (prev); } else if (c == '-') { release (c); c = next (); } else fill (MATH); checkpar (endmark); } }
static void content (int endmark) { while (c != EOF && c != endmark) { if (c == DOT) { release ('\\'); c = next (); command (TEXT); } else if (c == DASHPAR || c == EQPAR || c == '-' || c == '=') { formula (); if (c == '-') /* TEMPORARY BUG FIX */ { release ('-'); c = next (); } } else if (c == '*') emphas (); else fill (TEXT); checkpar (endmark); } }
static void command (int mode) { int mark; do release (c); while (isalpha (c = next ())); if (mode == TEXT) while (isspace (c) || c == '~') { release (c); c = next (); } while (c == '(' || c == '[') { if (c == '(') { c = '{'; mark = ')'; } else mark = ']'; release (c); c = next (); if (mode == TEXT) content (mark); else math (mark); checkpar (mark); if (mark == ')') mark = '}'; release (mark); c = next (); } }
char inscodeI (symbol sym, symbol ant, char chip) { LOG("inscodeI %p", sym); LOG(" %p", gsymsig(sym)); LOG(" %s", gsymlex(sym)); LOG(" %d\n", gsymval(sym)); if (gsymtype(sym) == NUMBER && gsymtype(gsymsig(sym)) == EQ) { ssymval(gsymsig(gsymsig(sym)), gsymval(sym)); /* This is a assign */ return 1; } if (gsymtype(sym) == IDEN) /* This is the case the ID of the command name */ return 1; if (!gsymsig(sym)) { checkpar(sym, ant, chip); inscode(gsymval(sym)); return 0; } if(!inscodeI(gsymsig(sym), sym, chip)) { inscode(gsymval(sym)); return 0; } return 1; }
static void script (void) { release (c); c = next (); if (c == '(') { release ('{'); c = next (); math (')'); checkpar (')'); release ('}'); c = next (); } }
void handle(int newsock){ size_t buflen = 4095; char buffer[buflen + 1]; bta_pars par; do{ ssize_t readed = recv(newsock, buffer, buflen, 0); if(readed < 1) break; // client closed or error parce_incoming_buf(buffer, readed, &par); #ifdef EBUG #define checkpar(val) if(par.val){ fprintf(stderr, "par: %s\n", val); } if(par.ALL){ fprintf(stderr, "par: ALL\n"); } checkpar(vel); checkpar(diff); checkpar(corr); checkpar(mtime); checkpar(sidtime); checkpar(meteo); checkpar(target); checkpar(p2mode); checkpar(eqcoor); checkpar(telmode); checkpar(horcoor); checkpar(valsens); checkpar(telfocus); #undef checkpar #endif // EBUG make_JSON(newsock, &par); }while(!par.ALL); close(newsock); }
/** * Parce data received from client * In case of http request we send all avaiable data * In case of request from client socket, parce it * Socket's request have structure like "par1<del>par2<del>..." * where "pars" are names of bta_pars fields * <del> is delimeter: one of symbols " &\t\n" * @param buf - incoming data * @param L - length of buf * @param par - returned parameters structure */ void parce_incoming_buf(char *buf, size_t L, bta_pars *par){ char *tok, *got; memset(par, 0, sizeof(bta_pars)); DBG("got data: %s", buf); // http request - send all if get == "bta_par" // if get == "bta_par?a&b&c...", change buf to pars if((got = stringscan(buf, "GET"))){ size_t LR = strlen(RESOURCE); if(strcmp(got, RESOURCE) == 0){ par->ALL = true; return; }else if(strncmp(got, RESOURCE, LR) == 0) buf = &got[LR+1]; else exit(-1); // wrong request } // request from socket -> check all parameters tok = strtok(buf, " &\t\n"); if(!tok) return; do{ #define checkpar(val) if(strcasecmp(tok, val) == 0){par->val = true; continue;} checkpar(vel); checkpar(diff); checkpar(corr); checkpar(mtime); checkpar(meteo); checkpar(target); checkpar(p2mode); checkpar(eqcoor); checkpar(telmode); checkpar(sidtime); checkpar(horcoor); checkpar(valsens); checkpar(telfocus); #undef checkpar }while((tok = strtok(NULL, " &\t\n"))); }