Merge remote-tracking branch 'origin/master' into sheet
[pspp] / src / language / data-io / get-data.c
index 995be8e7ce896212cd9775af4789c1aa1441360a..13eebe6c3aaabe840a155c4e405fa797e99af295 100644 (file)
@@ -52,9 +52,6 @@ static const bool odf_read_support = true;
 #else
 static const bool odf_read_support = false;
 struct spreadsheet *ods_probe (const char *filename, bool report_errors){}
-struct casereader * ods_make_reader (struct spreadsheet *spreadsheet,
-                                         const struct spreadsheet_read_options *opts){}
-void ods_unref (struct spreadsheet *r){}
 #endif
 
 #ifdef GNM_READ_SUPPORT
@@ -62,10 +59,6 @@ static const bool gnm_read_support = true;
 #else
 static const bool gnm_read_support = false;
 struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors){}
-struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet,
-                                         const struct spreadsheet_read_options *opts){}
-void gnumeric_unref (struct spreadsheet *r){}
-
 #endif
 
 static bool parse_spreadsheet (struct lexer *lexer, char **filename,
@@ -88,14 +81,20 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds)
   opts.read_names = false;
   opts.asw = -1;
 
-  lex_force_match (lexer, T_SLASH);
+  if (! lex_force_match (lexer, T_SLASH))
+    goto error;
 
   if (!lex_force_match_id (lexer, "TYPE"))
     goto error;
 
-  lex_force_match (lexer, T_EQUALS);
+  if (!lex_force_match (lexer, T_EQUALS))
+    goto error;
 
-  tok = strdup (lex_tokcstr (lexer));
+  const char *s = lex_tokcstr (lexer);
+
+  if (s)
+    tok = strdup (s);
+  
   if (lex_match_id (lexer, "TXT"))
     {
       free (tok);
@@ -155,12 +154,14 @@ parse_get_psql (struct lexer *lexer, struct dataset *ds)
   psql.bsize = -1;
   ds_init_empty (&psql.sql);
 
-  lex_force_match (lexer, T_SLASH);
+  if (! lex_force_match (lexer, T_SLASH))
+    goto error;
 
   if (!lex_force_match_id (lexer, "CONNECT"))
     goto error;
 
-  lex_force_match (lexer, T_EQUALS);
+  if (! lex_force_match (lexer, T_EQUALS))
+    goto error;
 
   if (!lex_force_string (lexer))
     goto error;
@@ -174,14 +175,20 @@ parse_get_psql (struct lexer *lexer, struct dataset *ds)
       if ( lex_match_id (lexer, "ASSUMEDSTRWIDTH"))
        {
          lex_match (lexer, T_EQUALS);
-         psql.str_width = lex_integer (lexer);
-         lex_get (lexer);
+          if (lex_force_int (lexer))
+            {
+              psql.str_width = lex_integer (lexer);
+              lex_get (lexer);
+            }
        }
       else if ( lex_match_id (lexer, "BSIZE"))
        {
          lex_match (lexer, T_EQUALS);
-         psql.bsize = lex_integer (lexer);
-         lex_get (lexer);
+          if (lex_force_int (lexer))
+            {
+              psql.bsize = lex_integer (lexer);
+              lex_get (lexer);
+            }
        }
       else if ( lex_match_id (lexer, "UNENCRYPTED"))
        {
@@ -231,12 +238,14 @@ parse_spreadsheet (struct lexer *lexer, char **filename,
   opts->read_names = true;
   opts->asw = -1;
 
-  lex_force_match (lexer, T_SLASH);
+  if (! lex_force_match (lexer, T_SLASH))
+    goto error;
 
   if (!lex_force_match_id (lexer, "FILE"))
     goto error;
 
-  lex_force_match (lexer, T_EQUALS);
+  if (! lex_force_match (lexer, T_EQUALS))
+    goto error;
 
   if (!lex_force_string (lexer))
     goto error;
@@ -250,8 +259,11 @@ parse_spreadsheet (struct lexer *lexer, char **filename,
       if ( lex_match_id (lexer, "ASSUMEDSTRWIDTH"))
        {
          lex_match (lexer, T_EQUALS);
-         opts->asw = lex_integer (lexer);
-         lex_get (lexer);
+          if (lex_force_int (lexer))
+            {
+              opts->asw = lex_integer (lexer);
+              lex_get (lexer);
+            }
        }
       else if (lex_match_id (lexer, "SHEET"))
        {
@@ -268,6 +280,9 @@ parse_spreadsheet (struct lexer *lexer, char **filename,
            }
          else if (lex_match_id (lexer, "INDEX"))
            {
+              if (!lex_force_int (lexer))
+                goto error;
+
              opts->sheet_index = lex_integer (lexer);
              if (opts->sheet_index <= 0)
                {
@@ -374,11 +389,13 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
   enum data_parser_type type;
   bool has_type;
 
-  lex_force_match (lexer, T_SLASH);
+  if (! lex_force_match (lexer, T_SLASH))
+    goto error;
 
   if (!lex_force_match_id (lexer, "FILE"))
     goto error;
-  lex_force_match (lexer, T_EQUALS);
+  if (! lex_force_match (lexer, T_EQUALS))
+    goto error;
   fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL);
   if (fh == NULL)
     goto error;
@@ -593,18 +610,20 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
           lex_get (lexer);
         }
 
-      if (!lex_force_id (lexer)
-          || !dict_id_is_valid (dict, lex_tokcstr (lexer), true))
-        goto error;
       name = xstrdup (lex_tokcstr (lexer));
+      if (!lex_force_id (lexer)
+          || !dict_id_is_valid (dict, name, true))
+       {
+         goto error;
+       }
       lex_get (lexer);
-
       if (type == DP_DELIMITED)
         {
           if (!parse_format_specifier (lexer, &input)
-              || !fmt_check_input (&input))
-            goto error;
-
+             || !fmt_check_input (&input))
+           {
+             goto error;
+           }
           output = fmt_for_output_from_input (&input);
         }
       else
@@ -624,14 +643,12 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
               msg (SE, _("Unknown format type `%s'."), fmt_type_name);
               goto error;
             }
-
           /* Compose input format. */
           input.type = fmt_type;
           input.w = lc - fc + 1;
           input.d = 0;
           if (!fmt_check_input (&input))
             goto error;
-
           /* Compose output format. */
           if (w != 0)
             {
@@ -644,7 +661,6 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
           else
             output = fmt_for_output_from_input (&input);
         }
-
       v = dict_create_var (dict, name, fmt_var_width (&input));
       if (v == NULL)
         {
@@ -652,7 +668,6 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
           goto error;
         }
       var_set_both_formats (v, &output);
-
       if (type == DP_DELIMITED)
         data_parser_add_delimited_field (parser, &input,
                                          var_get_case_index (v),