projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
GET DATA /TYPE=TXT: Get rid of VAR_NAME_LEN limit on variable names.
[pspp]
/
src
/
language
/
data-io
/
inpt-pgm.c
diff --git
a/src/language/data-io/inpt-pgm.c
b/src/language/data-io/inpt-pgm.c
index 609c9b2c92bec4b85894b6ab26daca928b0031d9..405f605a807a76267bb050c1469d5828feb352f3 100644
(file)
--- a/
src/language/data-io/inpt-pgm.c
+++ b/
src/language/data-io/inpt-pgm.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000
, 2009, 2010
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@
-16,7
+16,6
@@
#include <config.h>
#include <config.h>
-#include <language/data-io/inpt-pgm.h>
#include <float.h>
#include <stdlib.h>
#include <float.h>
#include <stdlib.h>
@@
-31,12
+30,12
@@
#include <language/command.h>
#include <language/data-io/data-reader.h>
#include <language/data-io/file-handle.h>
#include <language/command.h>
#include <language/data-io/data-reader.h>
#include <language/data-io/file-handle.h>
+#include <language/data-io/inpt-pgm.h>
#include <language/expressions/public.h>
#include <language/lexer/lexer.h>
#include <libpspp/assertion.h>
#include <libpspp/compiler.h>
#include <libpspp/message.h>
#include <language/expressions/public.h>
#include <language/lexer/lexer.h>
#include <libpspp/assertion.h>
#include <libpspp/compiler.h>
#include <libpspp/message.h>
-#include <libpspp/message.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
@@
-53,15
+52,6
@@
enum cmd_result_extensions
};
/* Indicates how a `union value' should be initialized. */
};
/* Indicates how a `union value' should be initialized. */
-enum value_init_type
- {
- INP_NUMERIC = 01, /* Numeric. */
- INP_STRING = 0, /* String. */
-
- INP_INIT_ONCE = 02, /* Initialize only once. */
- INP_REINIT = 0, /* Reinitialize for each iteration. */
- };
-
struct input_program_pgm
{
struct trns_chain *trns_chain;
struct input_program_pgm
{
struct trns_chain *trns_chain;
@@
-70,7
+60,7
@@
struct input_program_pgm
casenumber case_nr; /* Incremented by END CASE transformation. */
struct caseinit *init;
casenumber case_nr; /* Incremented by END CASE transformation. */
struct caseinit *init;
- s
ize_t value_cnt
;
+ s
truct caseproto *proto
;
};
static void destroy_input_program (struct input_program_pgm *);
};
static void destroy_input_program (struct input_program_pgm *);
@@
-105,12
+95,13
@@
cmd_input_program (struct lexer *lexer, struct dataset *ds)
bool saw_END_CASE = false;
proc_discard_active_file (ds);
bool saw_END_CASE = false;
proc_discard_active_file (ds);
- if (lex_token (lexer) !=
'.'
)
+ if (lex_token (lexer) !=
T_ENDCMD
)
return lex_end_of_command (lexer);
inp = xmalloc (sizeof *inp);
inp->trns_chain = NULL;
inp->init = NULL;
return lex_end_of_command (lexer);
inp = xmalloc (sizeof *inp);
inp->trns_chain = NULL;
inp->init = NULL;
+ inp->proto = NULL;
inside_input_program = true;
for (;;)
inside_input_program = true;
for (;;)
@@
-153,10
+144,10
@@
cmd_input_program (struct lexer *lexer, struct dataset *ds)
/* Figure out how to initialize each input case. */
inp->init = caseinit_create ();
caseinit_mark_for_init (inp->init, dataset_dict (ds));
/* Figure out how to initialize each input case. */
inp->init = caseinit_create ();
caseinit_mark_for_init (inp->init, dataset_dict (ds));
- inp->
value_cnt = dict_get_next_value_idx (dataset_dict (ds
));
+ inp->
proto = caseproto_ref (dict_get_proto (dataset_dict (ds)
));
proc_set_active_file_data (
proc_set_active_file_data (
- ds, casereader_create_sequential (NULL, inp->
value_cnt
, CASENUMBER_MAX,
+ ds, casereader_create_sequential (NULL, inp->
proto
, CASENUMBER_MAX,
&input_program_casereader_class, inp));
return CMD_SUCCESS;
&input_program_casereader_class, inp));
return CMD_SUCCESS;
@@
-180,35
+171,34
@@
is_valid_state (enum trns_result state)
|| state >= 0);
}
|| state >= 0);
}
-/* Reads
one case into C
.
- Returns t
rue if successful, false
at end of file or if an
+/* Reads
and returns one case
.
+ Returns t
he case if successful, null
at end of file or if an
I/O error occurred. */
I/O error occurred. */
-static bool
-input_program_casereader_read (struct casereader *reader UNUSED, void *inp_,
- struct ccase *c)
+static struct ccase *
+input_program_casereader_read (struct casereader *reader UNUSED, void *inp_)
{
struct input_program_pgm *inp = inp_;
{
struct input_program_pgm *inp = inp_;
-
- case_create (c, inp->value_cnt);
+ struct ccase *c = case_create (inp->proto);
do
{
assert (is_valid_state (inp->restart));
if (inp->restart == TRNS_ERROR || inp->restart == TRNS_END_FILE)
{
do
{
assert (is_valid_state (inp->restart));
if (inp->restart == TRNS_ERROR || inp->restart == TRNS_END_FILE)
{
- case_
destroy
(c);
- return
false
;
+ case_
unref
(c);
+ return
NULL
;
}
}
+ c = case_unshare (c);
caseinit_init_vars (inp->init, c);
inp->restart = trns_chain_execute (inp->trns_chain, inp->restart,
caseinit_init_vars (inp->init, c);
inp->restart = trns_chain_execute (inp->trns_chain, inp->restart,
- c, inp->case_nr);
+
&
c, inp->case_nr);
assert (is_valid_state (inp->restart));
caseinit_update_left_vars (inp->init, c);
}
while (inp->restart < 0);
assert (is_valid_state (inp->restart));
caseinit_update_left_vars (inp->init, c);
}
while (inp->restart < 0);
- return
true
;
+ return
c
;
}
static void
}
static void
@@
-218,6
+208,7
@@
destroy_input_program (struct input_program_pgm *pgm)
{
trns_chain_destroy (pgm->trns_chain);
caseinit_destroy (pgm->init);
{
trns_chain_destroy (pgm->trns_chain);
caseinit_destroy (pgm->init);
+ caseproto_unref (pgm->proto);
free (pgm);
}
}
free (pgm);
}
}
@@
-244,14
+235,14
@@
int
cmd_end_case (struct lexer *lexer, struct dataset *ds UNUSED)
{
assert (in_input_program ());
cmd_end_case (struct lexer *lexer, struct dataset *ds UNUSED)
{
assert (in_input_program ());
- if (lex_token (lexer) ==
'.'
)
+ if (lex_token (lexer) ==
T_ENDCMD
)
return CMD_END_CASE;
return lex_end_of_command (lexer);
}
/* Outputs the current case */
int
return CMD_END_CASE;
return lex_end_of_command (lexer);
}
/* Outputs the current case */
int
-end_case_trns_proc (void *inp_, struct ccase *c UNUSED,
+end_case_trns_proc (void *inp_, struct ccase *
*
c UNUSED,
casenumber case_nr UNUSED)
{
struct input_program_pgm *inp = inp_;
casenumber case_nr UNUSED)
{
struct input_program_pgm *inp = inp_;
@@
-276,15
+267,15
@@
cmd_reread (struct lexer *lexer, struct dataset *ds)
fh = fh_get_default_handle ();
e = NULL;
fh = fh_get_default_handle ();
e = NULL;
- while (lex_token (lexer) !=
'.'
)
+ while (lex_token (lexer) !=
T_ENDCMD
)
{
if (lex_match_id (lexer, "COLUMN"))
{
{
if (lex_match_id (lexer, "COLUMN"))
{
- lex_match (lexer,
'='
);
+ lex_match (lexer,
T_EQUALS
);
if (e)
{
if (e)
{
-
msg (SE, _("COLUMN subcommand multiply specified.")
);
+
msg (SE, _("%s subcommand may be given at most once."), "COLUMN"
);
expr_free (e);
return CMD_CASCADING_FAILURE;
}
expr_free (e);
return CMD_CASCADING_FAILURE;
}
@@
-295,7
+286,7
@@
cmd_reread (struct lexer *lexer, struct dataset *ds)
}
else if (lex_match_id (lexer, "FILE"))
{
}
else if (lex_match_id (lexer, "FILE"))
{
- lex_match (lexer,
'='
);
+ lex_match (lexer,
T_EQUALS
);
fh_unref (fh);
fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE);
if (fh == NULL)
fh_unref (fh);
fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE);
if (fh == NULL)
@@
-323,7
+314,7
@@
cmd_reread (struct lexer *lexer, struct dataset *ds)
/* Executes a REREAD transformation. */
static int
/* Executes a REREAD transformation. */
static int
-reread_trns_proc (void *t_, struct ccase *c, casenumber case_num)
+reread_trns_proc (void *t_, struct ccase *
*
c, casenumber case_num)
{
struct reread_trns *t = t_;
{
struct reread_trns *t = t_;
@@
-331,7
+322,7
@@
reread_trns_proc (void *t_, struct ccase *c, casenumber case_num)
dfm_reread_record (t->reader, 1);
else
{
dfm_reread_record (t->reader, 1);
else
{
- double column = expr_evaluate_num (t->column, c, case_num);
+ double column = expr_evaluate_num (t->column,
*
c, case_num);
if (!isfinite (column) || column < 1)
{
msg (SE, _("REREAD: Column numbers must be positive finite "
if (!isfinite (column) || column < 1)
{
msg (SE, _("REREAD: Column numbers must be positive finite "
@@
-368,7
+359,7
@@
cmd_end_file (struct lexer *lexer, struct dataset *ds)
/* Executes an END FILE transformation. */
static int
/* Executes an END FILE transformation. */
static int
-end_file_trns_proc (void *trns_ UNUSED, struct ccase *c UNUSED,
+end_file_trns_proc (void *trns_ UNUSED, struct ccase *
*
c UNUSED,
casenumber case_num UNUSED)
{
return TRNS_END_FILE;
casenumber case_num UNUSED)
{
return TRNS_END_FILE;