UNIMPL ("REFORMAT", ERRO, ERRO, ERRO, ERRO, "Read obsolete files")
UNIMPL ("REGRESSION", ERRO, ERRO, ERRO, ERRO, "Compute regression coefficients")
DEFCMD ("RENAME VARIABLES", ERRO, INPU, TRAN, PROC, cmd_rename_variables)
-DEFCMD ("REPEATING DATA", ERRO, INPU, ERRO, ERRO, cmd_repeating_data)
+UNIMPL ("REPEATING DATA", ERRO, INPU, ERRO, ERRO, "Specify multiple cases per input record")
UNIMPL ("REPORT", ERRO, ERRO, ERRO, ERRO, "Pretty print working file")
DEFCMD ("REREAD", ERRO, INPU, ERRO, ERRO, cmd_reread)
UNIMPL ("RESTORE", ERRO, ERRO, ERRO, ERRO, "Restore settings")
if (!parse_num_or_var (&rpd->starts_end, "STARTS ending column"))
goto error;
} else {
- /* Otherwise, rpd->starts_end is left uninitialized.
- This is okay. We will initialize it later from the
- record length of the file. We can't do this now
- because we can't be sure that the user has specified
- the file handle yet. */
+ /* Otherwise, rpd->starts_end is uninitialized. We
+ will initialize it later from the record length
+ of the file. We can't do so now because the
+ file handle may not be specified yet. */
}
if (rpd->starts_beg.num != 0 && rpd->starts_end.num != 0
if (!lex_match ('/'))
{
- if (!parse_num_or_var (&rpd->cont_beg, "CONTINUED beginning column"))
+ if (!parse_num_or_var (&rpd->cont_beg,
+ "CONTINUED beginning column"))
goto error;
lex_negative_to_dash ();
goto error;
}
- /* Calculate starts_end, cont_end if necessary and possible. */
- if (fh != NULL)
+ /* Calculate and check starts_end, cont_end if necessary. */
+ if (rpd->starts_end.num == 0 && rpd->starts_end.var == NULL)
{
- if (rpd->starts_end.num == 0 && rpd->starts_end.var == NULL)
- rpd->starts_end.num = handle_get_record_width (fh);
- if (rpd->cont_end.num == 0 && rpd->cont_end.var == NULL)
- rpd->cont_end.num = handle_get_record_width (fh);
+ rpd->starts_end.num = fh != NULL ? handle_get_record_width (fh) : 80;
+ if (rpd->starts_beg.num != 0
+ && rpd->starts_beg.num > rpd->starts_end.num)
+ {
+ msg (SE, _("STARTS beginning column (%d) exceeds "
+ "default STARTS ending column taken from file's "
+ "record width (%d)."),
+ rpd->starts_beg.num, rpd->starts_end.num);
+ goto error;
+ }
+ }
+ if (rpd->cont_end.num == 0 && rpd->cont_end.var == NULL)
+ {
+ rpd->cont_end.num = fh != NULL ? handle_get_record_width (fh) : 80;
+ if (rpd->cont_beg.num != 0
+ && rpd->cont_beg.num > rpd->cont_end.num)
+ {
+ msg (SE, _("CONTINUED beginning column (%d) exceeds "
+ "default CONTINUED ending column taken from file's "
+ "record width (%d)."),
+ rpd->cont_beg.num, rpd->cont_end.num);
+ goto error;
+ }
}
lex_match ('=');
/* Obtains the real value for rpd_num_or_var N in case C and returns
it. The valid range is nonnegative numbers, but numbers outside
this range can be returned and should be handled by the caller as
- invalid. If N does not have a value, returns DEFAULT_VALUE,
- which must be nonzero if this is possible. */
+ invalid. */
static int
-realize_value (struct rpd_num_or_var *n, struct ccase *c, int default_value)
+realize_value (struct rpd_num_or_var *n, struct ccase *c)
{
- if (n->num != 0)
- return n->num;
- else if (n->var != NULL)
+ if (n->var != NULL)
{
double v = case_num (c, n->var->fv);
return v != SYSMIS && v >= INT_MIN && v <= INT_MAX ? v : -1;
}
- else
- {
- assert (default_value != 0);
- return default_value;
- }
+ else
+ return n->num;
}
/* Parameter record passed to rpd_parse_record(). */
dfm_forward_record (t->reader);
/* Calculate occurs, length. */
- occurs_left = occurs = realize_value (&t->occurs, c, 0);
+ occurs_left = occurs = realize_value (&t->occurs, c);
if (occurs <= 0)
{
tmsg (SE, RPD_ERR, _("Invalid value %d for OCCURS."), occurs);
return -3;
}
- starts_beg = realize_value (&t->starts_beg, c, 0);
+ starts_beg = realize_value (&t->starts_beg, c);
if (starts_beg <= 0)
{
tmsg (SE, RPD_ERR, _("Beginning column for STARTS (%d) must be "
starts_beg);
return -3;
}
- starts_end = realize_value (&t->starts_end, c, line.length + 1);
+ starts_end = realize_value (&t->starts_end, c);
if (starts_end < starts_beg)
{
tmsg (SE, RPD_ERR, _("Ending column for STARTS (%d) is less than "
starts_end, starts_beg);
skip_first_record = 1;
}
- length = realize_value (&t->length, c, 0);
+ length = realize_value (&t->length, c);
if (length < 0)
{
tmsg (SE, RPD_ERR, _("Invalid value %d for LENGTH."), length);
length = 1;
occurs = occurs_left = 1;
}
- cont_beg = realize_value (&t->cont_beg, c, 0);
+ cont_beg = realize_value (&t->cont_beg, c);
if (cont_beg < 0)
{
tmsg (SE, RPD_ERR, _("Beginning column for CONTINUED (%d) must be "
cont_beg);
return -2;
}
- cont_end = realize_value (&t->cont_end, c, line.length + 1);
+ cont_end = realize_value (&t->cont_end, c);
if (cont_end < cont_beg)
{
tmsg (SE, RPD_ERR, _("Ending column for CONTINUED (%d) is less than "