X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Futilities%2Ftitle.c;h=8ad6a4acb30b5723ea27e1ad0fc698f667c0b758;hb=ea34fc3d157ce3038ea8cfe8c5e0ca21944762a7;hp=9d5b8261619c0a39c3d318bf8134933c4008422c;hpb=81579d9e9f994fb2908f50af41c3eb033d216e58;p=pspp diff --git a/src/language/utilities/title.c b/src/language/utilities/title.c index 9d5b826161..8ad6a4acb3 100644 --- a/src/language/utilities/title.c +++ b/src/language/utilities/title.c @@ -19,141 +19,106 @@ #include #include +#include "data/dataset.h" #include "data/dictionary.h" -#include "data/procedure.h" #include "data/variable.h" #include "language/command.h" #include "language/lexer/lexer.h" +#include "language/lexer/token.h" #include "libpspp/message.h" #include "libpspp/start-date.h" #include "libpspp/version.h" -#include "output/text-item.h" +#include "output/driver.h" +#include "gl/c-ctype.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) -static int parse_title (struct lexer *, enum text_item_type); -static void set_title (const char *title, enum text_item_type); - -int -cmd_title (struct lexer *lexer, struct dataset *ds UNUSED) -{ - return parse_title (lexer, TEXT_ITEM_TITLE); -} - -int -cmd_subtitle (struct lexer *lexer, struct dataset *ds UNUSED) -{ - return parse_title (lexer, TEXT_ITEM_SUBTITLE); -} - static int -parse_title (struct lexer *lexer, enum text_item_type type) +parse_title (struct lexer *lexer, void (*set_title) (const char *)) { - if (lex_look_ahead (lexer) == T_STRING) + if (lex_token (lexer) == T_STRING) { + set_title (lex_tokcstr (lexer)); lex_get (lexer); - if (!lex_force_string (lexer)) - return CMD_FAILURE; - set_title (lex_tokcstr (lexer), type); - lex_get (lexer); - return lex_end_of_command (lexer); } else { - set_title (lex_rest_of_line (lexer), type); - lex_discard_line (lexer); + int start_ofs = lex_ofs (lexer); + while (lex_token (lexer) != T_ENDCMD) + lex_get (lexer); + + /* Get the raw representation of all the tokens, including any space + between them, and use it as the title. */ + char *title = lex_ofs_representation (lexer, start_ofs, + lex_ofs (lexer) - 1); + set_title (title); + free (title); } return CMD_SUCCESS; } -static void -set_title (const char *title, enum text_item_type type) +int +cmd_title (struct lexer *lexer, struct dataset *ds UNUSED) +{ + return parse_title (lexer, output_set_title); +} + +int +cmd_subtitle (struct lexer *lexer, struct dataset *ds UNUSED) { - text_item_submit (text_item_create (type, title)); + return parse_title (lexer, output_set_subtitle); } /* Performs the FILE LABEL command. */ int cmd_file_label (struct lexer *lexer, struct dataset *ds) { - const char *label; - - label = lex_rest_of_line (lexer); - lex_discard_line (lexer); - while (isspace ((unsigned char) *label)) - label++; + if (!lex_force_string (lexer)) + return CMD_FAILURE; - dict_set_label (dataset_dict (ds), label); + dict_set_label (dataset_dict (ds), lex_tokcstr (lexer)); + lex_get (lexer); return CMD_SUCCESS; } -/* Add entry date line to DICT's documents. */ -static void -add_document_trailer (struct dictionary *dict) -{ - char buf[64]; - - sprintf (buf, _(" (Entered %s)"), get_start_date ()); - dict_add_document_line (dict, buf); -} - /* Performs the DOCUMENT command. */ int cmd_document (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); - struct string line = DS_EMPTY_INITIALIZER; - bool end_dot; + char *trailer; + + if (!lex_force_string (lexer)) + return CMD_FAILURE; - do + while (lex_is_string (lexer)) { - end_dot = lex_end_dot (lexer); - ds_assign_string (&line, lex_entire_line_ds (lexer)); - if (end_dot) - ds_put_byte (&line, '.'); - dict_add_document_line (dict, ds_cstr (&line)); - - lex_discard_line (lexer); - lex_get_line (lexer); + dict_add_document_line (dict, lex_tokcstr (lexer), true); + lex_get (lexer); } - while (!end_dot); - add_document_trailer (dict); - ds_destroy (&line); + trailer = xasprintf (_(" (Entered %s)"), get_start_date ()); + dict_add_document_line (dict, trailer, true); + free (trailer); return CMD_SUCCESS; } -/* Performs the DROP DOCUMENTS command. */ +/* Performs the ADD DOCUMENTS command. */ int -cmd_drop_documents (struct lexer *lexer, struct dataset *ds) +cmd_add_documents (struct lexer *lexer, struct dataset *ds) { - dict_clear_documents (dataset_dict (ds)); - - return lex_end_of_command (lexer); + return cmd_document (lexer, ds); } - -/* Performs the ADD DOCUMENTS command. */ +/* Performs the DROP DOCUMENTS command. */ int -cmd_add_documents (struct lexer *lexer, struct dataset *ds) +cmd_drop_documents (struct lexer *lexer UNUSED, struct dataset *ds) { - struct dictionary *dict = dataset_dict (ds); - - if ( ! lex_force_string (lexer) ) - return CMD_FAILURE; - - while ( lex_is_string (lexer)) - { - dict_add_document_line (dict, lex_tokcstr (lexer)); - lex_get (lexer); - } - - add_document_trailer (dict); - - return lex_end_of_command (lexer) ; + dict_clear_documents (dataset_dict (ds)); + return CMD_SUCCESS; }