accept_t lexer_read_command(struct lexer_book *bk) { if(lexer_next_peek(bk) != '\t') return NO; int count = 0; lexer_discard_white_space(bk); struct token *t; do { t = lexer_read_command_argument(bk); if(!t) break; if(t->type == NEWLINE && count == 0) { lexer_report_error(bk, "Missing command line.\n"); } else if(t->type != NEWLINE && count == 0) { /* Add command start marker */ lexer_push_token(bk, lexer_pack_token(bk, COMMAND)); } lexer_push_token(bk, t); count++; } while(t->type != NEWLINE); if(count > 1) return YES; else { return NO; } }
struct list *lexer_read_command_aux(struct lexer *lx) { int spaces_deleted = lexer_discard_white_space(lx); struct list *tokens = list_create(); //Preserve space in substitutions. if(spaces_deleted && lx->depth > 0) { list_push_tail(tokens, lexer_pack_token(lx, TOKEN_SPACE)); } /* Read all command tokens. Note that we read from lx, but put in lx_c. */ while(1) { struct token *t = lexer_read_command_argument(lx); if(!t) break; if(t->type == TOKEN_SUBSTITUTION) { tokens = list_splice(tokens, lexer_expand_substitution(lx, t, lexer_read_command_aux)); lexer_free_token(t); continue; } else { list_push_tail(tokens, t); if(t->type==TOKEN_NEWLINE) break; } } return tokens; }
void lexer_append_all_tokens(struct lexer_book *bk, struct lexer_book *bk_s) { struct token *head_s; bk_s->substitution_mode = bk->substitution_mode; while( !bk_s->eof ) { if(lexer_next_peek(bk_s) == CHAR_EOF) { /* Found end of string while completing command */ bk_s->lexeme_end++; bk_s->eof = 1; } else { switch(bk_s->substitution_mode) { case CHAR_EOF: case COMMAND: head_s = lexer_read_command_argument(bk_s); break; case FILES: head_s = lexer_read_file(bk_s); break; case SYNTAX: lexer_read_expandable(bk_s, CHAR_EOF); head_s = lexer_pack_token(bk_s, LITERAL); break; default: lexer_read_line(bk_s); continue; break; } if(head_s) lexer_push_token(bk_s, head_s); } } while( (head_s = list_pop_tail(bk_s->token_queue)) != NULL ) list_push_head(bk->token_queue, head_s); }