projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
PCOMPUTE works
[pspp]
/
src
/
data
/
por-file-reader.c
diff --git
a/src/data/por-file-reader.c
b/src/data/por-file-reader.c
index 4fb6c5fb452de7fbf64a00cf3001124594d85d0e..94a2faf33b1ff4849c1d19a7f4801f6ec28d4b28 100644
(file)
--- a/
src/data/por-file-reader.c
+++ b/
src/data/por-file-reader.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014
, 2015
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
@@
-43,7
+43,6
@@
#include "libpspp/pool.h"
#include "libpspp/str.h"
#include "libpspp/pool.h"
#include "libpspp/str.h"
-#include "gl/intprops.h"
#include "gl/minmax.h"
#include "gl/xalloc.h"
#include "gl/xmemdup0.h"
#include "gl/minmax.h"
#include "gl/xalloc.h"
#include "gl/xmemdup0.h"
@@
-78,7
+77,7
@@
struct pfm_reader
int line_length; /* Number of characters so far on this line. */
char cc; /* Current character. */
char *trans; /* 256-byte character set translation table. */
int line_length; /* Number of characters so far on this line. */
char cc; /* Current character. */
char *trans; /* 256-byte character set translation table. */
- int
var_cnt;
/* Number of variables. */
+ int
n_vars;
/* Number of variables. */
int weight_index; /* 0-based index of weight variable, or -1. */
struct caseproto *proto; /* Format of output cases. */
bool ok; /* Set false on I/O error. */
int weight_index; /* 0-based index of weight variable, or -1. */
struct caseproto *proto; /* Format of output cases. */
bool ok; /* Set false on I/O error. */
@@
-103,7
+102,6
@@
error (struct pfm_reader *r, const char *msg,...)
static void
error (struct pfm_reader *r, const char *msg, ...)
{
static void
error (struct pfm_reader *r, const char *msg, ...)
{
- struct msg m;
struct string text;
va_list args;
struct string text;
va_list args;
@@
-114,16
+112,13
@@
error (struct pfm_reader *r, const char *msg, ...)
ds_put_vformat (&text, msg, args);
va_end (args);
ds_put_vformat (&text, msg, args);
va_end (args);
- m.category = MSG_C_GENERAL;
- m.severity = MSG_S_ERROR;
- m.file_name = NULL;
- m.first_line = 0;
- m.last_line = 0;
- m.first_column = 0;
- m.last_column = 0;
- m.text = ds_cstr (&text);
-
- msg_emit (&m);
+ struct msg *m = xmalloc (sizeof *m);
+ *m = (struct msg) {
+ .category = MSG_C_GENERAL,
+ .severity = MSG_S_ERROR,
+ .text = ds_steal_cstr (&text),
+ };
+ msg_emit (m);
r->ok = false;
r->ok = false;
@@
-135,7
+130,6
@@
error (struct pfm_reader *r, const char *msg, ...)
static void
warning (struct pfm_reader *r, const char *msg, ...)
{
static void
warning (struct pfm_reader *r, const char *msg, ...)
{
- struct msg m;
struct string text;
va_list args;
struct string text;
va_list args;
@@
-146,16
+140,13
@@
warning (struct pfm_reader *r, const char *msg, ...)
ds_put_vformat (&text, msg, args);
va_end (args);
ds_put_vformat (&text, msg, args);
va_end (args);
- m.category = MSG_C_GENERAL;
- m.severity = MSG_S_WARNING;
- m.file_name = NULL;
- m.first_line = 0;
- m.last_line = 0;
- m.first_column = 0;
- m.last_column = 0;
- m.text = ds_cstr (&text);
-
- msg_emit (&m);
+ struct msg *m = xmalloc (sizeof *m);
+ *m = (struct msg) {
+ .category = MSG_C_GENERAL,
+ .severity = MSG_S_WARNING,
+ .text = ds_steal_cstr (&text),
+ };
+ msg_emit (m);
}
/* Close and destroy R.
}
/* Close and destroy R.
@@
-166,11
+157,11
@@
pfm_close (struct any_reader *r_)
struct pfm_reader *r = pfm_reader_cast (r_);
bool ok;
struct pfm_reader *r = pfm_reader_cast (r_);
bool ok;
- dict_
destroy
(r->dict);
+ dict_
unref
(r->dict);
any_read_info_destroy (&r->info);
if (r->file)
{
any_read_info_destroy (&r->info);
if (r->file)
{
- if (fn_close (
fh_get_file_name (r->fh)
, r->file) == EOF)
+ if (fn_close (
r->fh
, r->file) == EOF)
{
msg (ME, _("Error closing portable file `%s': %s."),
fh_get_file_name (r->fh), strerror (errno));
{
msg (ME, _("Error closing portable file `%s': %s."),
fh_get_file_name (r->fh), strerror (errno));
@@
-255,7
+246,7
@@
static void read_documents (struct pfm_reader *, struct dictionary *);
/* Reads the dictionary from file with handle H, and returns it in a
dictionary structure. This dictionary may be modified in order to
rename, reorder, and delete variables, etc. */
/* Reads the dictionary from file with handle H, and returns it in a
dictionary structure. This dictionary may be modified in order to
rename, reorder, and delete variables, etc. */
-struct any_reader *
+st
atic st
ruct any_reader *
pfm_open (struct file_handle *fh)
{
struct pool *volatile pool = NULL;
pfm_open (struct file_handle *fh)
{
struct pool *volatile pool = NULL;
@@
-274,7
+265,7
@@
pfm_open (struct file_handle *fh)
r->line_length = 0;
r->weight_index = -1;
r->trans = NULL;
r->line_length = 0;
r->weight_index = -1;
r->trans = NULL;
- r->
var_cnt
= 0;
+ r->
n_vars
= 0;
r->proto = NULL;
r->ok = true;
if (setjmp (r->bail_out))
r->proto = NULL;
r->ok = true;
if (setjmp (r->bail_out))
@@
-288,7
+279,7
@@
pfm_open (struct file_handle *fh)
goto error;
/* Open file. */
goto error;
/* Open file. */
- r->file = fn_open (
fh_get_file_name (r->fh)
, "rb");
+ r->file = fn_open (
r->fh
, "rb");
if (r->file == NULL)
{
msg (ME, _("An error occurred while opening `%s' for reading "
if (r->file == NULL)
{
msg (ME, _("An error occurred while opening `%s' for reading "
@@
-322,7
+313,7
@@
pfm_open (struct file_handle *fh)
return NULL;
}
return NULL;
}
-struct casereader *
+st
atic st
ruct casereader *
pfm_decode (struct any_reader *r_, const char *encoding UNUSED,
struct dictionary **dictp, struct any_read_info *info)
{
pfm_decode (struct any_reader *r_, const char *encoding UNUSED,
struct dictionary **dictp, struct any_read_info *info)
{
@@
-597,7
+588,7
@@
read_version_data (struct pfm_reader *r, struct any_read_info *info)
info->float_format = FLOAT_NATIVE_DOUBLE;
info->integer_format = INTEGER_NATIVE;
info->compression = ANY_COMP_NONE;
info->float_format = FLOAT_NATIVE_DOUBLE;
info->integer_format = INTEGER_NATIVE;
info->compression = ANY_COMP_NONE;
- info->
case_cnt
= -1;
+ info->
n_cases
= -1;
/* Date. */
info->creation_date = xmalloc (11);
/* Date. */
info->creation_date = xmalloc (11);
@@
-689,9
+680,9
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
if (!match (r, '4'))
error (r, _("Expected variable count record."));
if (!match (r, '4'))
error (r, _("Expected variable count record."));
- r->
var_cnt
= read_int (r);
- if (r->
var_cnt
<= 0)
- error (r, _("Invalid number of variables %d."), r->
var_cnt
);
+ r->
n_vars
= read_int (r);
+ if (r->
n_vars
<= 0)
+ error (r, _("Invalid number of variables %d."), r->
n_vars
);
if (match (r, '5'))
read_int (r);
if (match (r, '5'))
read_int (r);
@@
-703,7
+694,7
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
error (r, _("Weight variable name (%s) truncated."), weight_name);
}
error (r, _("Weight variable name (%s) truncated."), weight_name);
}
- for (i = 0; i < r->
var_cnt
; i++)
+ for (i = 0; i < r->
n_vars
; i++)
{
int width;
char name[256];
{
int width;
char name[256];
@@
-739,9
+730,9
@@
read_variables (struct pfm_reader *r, struct dictionary *dict)
unsigned long int i;
for (i = 1; ; i++)
{
unsigned long int i;
for (i = 1; ; i++)
{
- char try_name[8 + 1 + INT_STRLEN_BOUND (i) + 1];
- sprintf (try_name, "%s_%lu", name, i);
+ char *try_name = xasprintf ("%s_%lu", name, i);
v = dict_create_var (dict, try_name, width);
v = dict_create_var (dict, try_name, width);
+ free (try_name);
if (v != NULL)
break;
}
if (v != NULL)
break;
}
@@
-868,11
+859,8
@@
read_value_label (struct pfm_reader *r, struct dictionary *dict)
static void
read_documents (struct pfm_reader *r, struct dictionary *dict)
{
static void
read_documents (struct pfm_reader *r, struct dictionary *dict)
{
- int line_cnt;
- int i;
-
- line_cnt = read_int (r);
- for (i = 0; i < line_cnt; i++)
+ int n_lines = read_int (r);
+ for (int i = 0; i < n_lines; i++)
{
char line[256];
read_string (r, line);
{
char line[256];
read_string (r, line);
@@
-905,12
+893,12
@@
por_file_casereader_read (struct casereader *reader, void *r_)
return NULL;
}
return NULL;
}
- for (i = 0; i < r->
var_cnt
; i++)
+ for (i = 0; i < r->
n_vars
; i++)
{
int width = caseproto_get_width (r->proto, i);
if (width == 0)
{
int width = caseproto_get_width (r->proto, i);
if (width == 0)
-
case_data_rw_idx (c, i)->f
= read_float (r);
+
*case_num_rw_idx (c, i)
= read_float (r);
else
{
uint8_t buf[256];
else
{
uint8_t buf[256];
@@
-922,35
+910,35
@@
por_file_casereader_read (struct casereader *reader, void *r_)
return c;
}
return c;
}
-/*
Returns true if FILE is an SPSS portable file
,
-
false otherwise
. */
-int
+/*
Detects whether FILE is an SPSS portable file. Returns 1 if so, 0 if not
,
+
and a negative errno value if there is an error reading FILE
. */
+
static
int
pfm_detect (FILE *file)
{
unsigned char header[464];
char trans[256];
pfm_detect (FILE *file)
{
unsigned char header[464];
char trans[256];
- int
cooked_cnt, raw_cnt
, line_len;
+ int
n_cooked, n_raws
, line_len;
int i;
int i;
-
cooked_cnt = raw_cnt
= 0;
+
n_cooked = n_raws
= 0;
line_len = 0;
line_len = 0;
- while (
cooked_cnt
< sizeof header)
+ while (
n_cooked
< sizeof header)
{
int c = getc (file);
{
int c = getc (file);
- if (c == EOF ||
raw_cnt
++ > 512)
- return 0;
+ if (c == EOF ||
n_raws
++ > 512)
+ return
ferror (file) ? -errno :
0;
else if (c == '\n')
{
else if (c == '\n')
{
- while (line_len < 80 &&
cooked_cnt
< sizeof header)
+ while (line_len < 80 &&
n_cooked
< sizeof header)
{
{
- header[
cooked_cnt
++] = ' ';
+ header[
n_cooked
++] = ' ';
line_len++;
}
line_len = 0;
}
else if (c != '\r')
{
line_len++;
}
line_len = 0;
}
else if (c != '\r')
{
- header[
cooked_cnt
++] = c;
+ header[
n_cooked
++] = c;
line_len++;
}
}
line_len++;
}
}