char read_char (void) { int car; for (;;) { car = getchar(); if ( (car > 0x1F) && (car < 0x7F) ) return car; switch (car) { case 0x7F: /* Backspace */ case 0x08: /* Backspace */ return 8; /* Backspace */ case 0x10: /* Ctrl P */ return 5; /* Pg up */ case 0x0E: /* Ctrl N */ return 6; /* Pg down */ case 0x09: /* Tab */ return 9; /* Tab */ case 0x0D: /* Return */ return 13; /* Return */ case 0x1B: /* Esc */ while (1) { car = escape_sequence(); if (car == 0x00) break; else if (car != 0x1B) return car; } } } }
char *FParser::GetTokens(char *s) { char *tokn = NULL; Rover = s; NumTokens = 1; Tokens[0][0] = 0; TokenType[NumTokens-1] = name_; Section = NULL; // default to no section found NextToken(); LineStart = Rover; // save the start if(*Rover) { while(1) { tokn = Tokens[NumTokens-1]; if(Section) { // a { or } section brace has been found break; // stop parsing now } else if(TokenType[NumTokens-1] != string_) { if(*Rover == ';') break; // check for end of command ';' } switch(TokenType[NumTokens-1]) { case unset: case string_: while(*Rover != '\"') // dedicated loop for speed { if(*Rover == '\\') // escape sequences { Rover++; if (*Rover>='0' && *Rover<='9') { add_char(tokn, TEXTCOLOR_ESCAPE); add_char(tokn, *Rover+'A'-'0'); } else add_char(tokn, escape_sequence(*Rover)); } else add_char(tokn, *Rover); Rover++; } Rover++; NextToken(); // end of this token continue; case operator_: // all 2-character operators either end in '=' or // are 2 of the same character // do not allow 2-characters for brackets '(' ')' // which are still being considered as operators // operators are only 2-char max, do not need // a seperate loop if((*tokn && *Rover != '=' && *Rover!=*tokn) || *tokn == '(' || *tokn == ')') { // end of operator NextToken(); continue; } add_char(tokn, *Rover); break; case number: // haleyjd: 8-17 // add while number chars are read while(isnum(*Rover)) // dedicated loop add_char(tokn, *Rover++); NextToken(); continue; case name_: // add the chars while(!isop(*Rover)) // dedicated loop add_char(tokn, *Rover++); NextToken(); continue; default: break; } Rover++; } } // check for empty last token if(!tokn || !tokn[0]) { NumTokens = NumTokens - 1; } Rover++; return Rover; }
void get_tokens(char *s) { rover = s; num_tokens = 1; tokens[0][0] = 0; tt = name_; current_section = NULL; // default to no section found next_token(); linestart = rover; // save the start if(*rover) while(1) { if(killscript) return; if(current_section) { // a { or } section brace has been found break; // stop parsing now } else if(tt != string_) { if(*rover == ';') break; // check for end of command ';' } switch(tt) { case unset: case string_: while(*rover != '\"') // dedicated loop for speed { if(*rover == '\\') // escape sequences { rover++; if (*rover>='0' && *rover<='9') { add_char(TEXTCOLOR_ESCAPE); add_char(*rover+'A'-'0'); } else add_char(escape_sequence(*rover)); } else add_char(*rover); rover++; } rover++; next_token(); // end of this token continue; case operator_: // all 2-character operators either end in '=' or // are 2 of the same character // do not allow 2-characters for brackets '(' ')' // which are still being considered as operators // operators are only 2-char max, do not need // a seperate loop if((*tok && *rover != '=' && *rover!=*tok) || *tok == '(' || *tok == ')') { // end of operator next_token(); continue; } add_char(*rover); break; case number: // haleyjd: 8-17 // add while number chars are read while(isnum(*rover)) // dedicated loop add_char(*rover++); next_token(); continue; case name_: // add the chars while(!isop(*rover)) // dedicated loop add_char(*rover++); next_token(); continue; default: break; } rover++; } // check for empty last token if(!tok[0]) { num_tokens = num_tokens - 1; } rover++; }