struct token *lexer_read_command_argument(struct lexer_book *bk) { int c = lexer_next_peek(bk); switch(c) { case CHAR_EOF: /* Found end of file while completing command */ bk->lexeme_end++; bk->eof = 1; if( bk->stream ) return lexer_pack_token(bk, NEWLINE); else return NULL; break; case '\n' : lexer_next_char(bk); /* Jump \n */ lexer_add_to_lexeme(bk, c); return lexer_pack_token(bk, NEWLINE); break; case '#' : lexer_discard_comments(bk); lexer_add_to_lexeme(bk, '\n'); return lexer_pack_token(bk, NEWLINE); case ' ' : case '\t': return lexer_read_white_space(bk); break; case '$' : return lexer_read_substitution(bk); break; case '"' : return lexer_read_expandable(bk, '"'); break; case '<' : case '>' : lexer_next_char(bk); /* Jump <, > */ lexer_add_to_lexeme(bk, c); return lexer_pack_token(bk, IO_REDIRECT); break; case '\'': lexer_add_to_lexeme(bk, '\''); lexer_read_literal(bk); lexer_add_to_lexeme(bk, '\''); return lexer_pack_token(bk, LITERAL); break; default: lexer_read_literal(bk); return lexer_pack_token(bk, LITERAL); break; } }
struct token *lexer_read_command_argument(struct lexer *lx) { int c = lexer_next_peek(lx); switch (c) { case CHAR_EOF: /* Found end of file while completing command */ lx->lexeme_end++; lx->eof = 1; if(lx->depth == 0) lexer_report_error(lx, "Found end of file while completing command.\n"); return NULL; break; case '\n': lexer_next_char(lx); /* Jump \n */ lexer_add_to_lexeme(lx, c); return lexer_pack_token(lx, TOKEN_NEWLINE); break; case '#': lexer_discard_comments(lx); lexer_add_to_lexeme(lx, '\n'); return lexer_pack_token(lx, TOKEN_NEWLINE); case ' ': case '\t': return lexer_read_white_space(lx); break; case '$': return lexer_read_substitution(lx); break; case '"': return lexer_read_expandable(lx, '"'); break; case '<': case '>': lexer_next_char(lx); /* Jump <, > */ lexer_add_to_lexeme(lx, c); return lexer_pack_token(lx, TOKEN_IO_REDIRECT); break; case '\'': lexer_add_to_lexeme(lx, '\''); lexer_read_literal(lx); lexer_add_to_lexeme(lx, '\''); return lexer_pack_token(lx, TOKEN_LITERAL); break; default: lexer_read_literal(lx); return lexer_pack_token(lx, TOKEN_LITERAL); break; } }