X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcount.c;h=e3220d79485a5d94ea9c39f8c24374897c46fcd0;hb=dc4eb33f68d5eebae670115752d3994f4f3d5c41;hp=0fc7370bb8d44c5f660e42c9c3593e769ab649ab;hpb=74a57f26f1458b28a0fddbb9f46004ac8f4d9c30;p=pspp diff --git a/src/count.c b/src/count.c index 0fc7370bb8..e3220d7948 100644 --- a/src/count.c +++ b/src/count.c @@ -14,14 +14,16 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include -#include +#include "error.h" #include #include "alloc.h" +#include "case.h" #include "command.h" +#include "dictionary.h" #include "error.h" #include "lexer.h" #include "str.h" @@ -106,7 +108,7 @@ struct cnt_var_info struct cnt_var_info *next; struct variable *d; /* Destination variable. */ - char n[9]; /* Name of dest var. */ + char n[LONG_NAME_LEN + 1]; /* Name of dest var. */ struct counting *c; /* The counting specifications. */ }; @@ -143,7 +145,7 @@ cmd_count (void) cnt->d = NULL; cnt->c = NULL; - /* Get destination struct variable, or at least its name. */ + /* Get destination variable, or at least its name. */ if (!lex_force_id ()) goto fail; cnt->d = dict_lookup_var (default_dict, tokid); @@ -156,7 +158,7 @@ cmd_count (void) } } else - strcpy (cnt->n, tokid); + str_copy_trunc (cnt->n, sizeof cnt->n, tokid); lex_get (); if (!lex_force_match ('=')) @@ -242,13 +244,13 @@ parse_numeric_criteria (struct counting * c) } cur = &c->crit.n[n++]; - if (token == T_NUM) + if (lex_is_number ()) { cur->a = tokval; lex_get (); if (lex_match_id ("THRU")) { - if (token == T_NUM) + if (lex_is_number ()) { if (!lex_force_num ()) return 0; @@ -280,7 +282,7 @@ parse_numeric_criteria (struct counting * c) { if (!lex_force_match_id ("THRU")) return 0; - if (token == T_NUM) + if (lex_is_number ()) { cur->type = CNT_LOW; cur->a = tokval; @@ -347,7 +349,7 @@ parse_string_criteria (struct counting * c) cur = &c->crit.s[n++]; cur->type = CNT_SINGLE; cur->s = malloc (len + 1); - st_pad_copy (cur->s, ds_value (&tokstr), len + 1); + str_copy_rpad (cur->s, len + 1, ds_c_str (&tokstr)); lex_get (); lex_match (','); @@ -366,16 +368,14 @@ static inline int count_numeric (struct counting * cnt, struct ccase * c) { int counter = 0; - - struct cnt_num *num; - - double cmp; int i; for (i = 0; i < cnt->n; i++) { + struct cnt_num *num; + /* Extract the variable value and eliminate missing values. */ - cmp = c->data[cnt->v[i]->fv].f; + double cmp = case_num (c, cnt->v[i]->fv); if (cmp == SYSMIS) { if (cnt->missing >= 1) @@ -433,27 +433,21 @@ static inline int count_string (struct counting * cnt, struct ccase * c) { int counter = 0; - - struct cnt_str *str; - - char *cmp; - int len; - int i; for (i = 0; i < cnt->n; i++) { - /* Extract the variable value, variable width. */ - cmp = c->data[cnt->v[i]->fv].s; - len = cnt->v[i]->width; + struct cnt_str *str; + /* Extract the variable value, variable width. */ for (str = cnt->crit.s;; str++) switch (str->type) { case CNT_ERROR: assert (0); case CNT_SINGLE: - if (memcmp (cmp, str->s, len)) + if (memcmp (case_str (c, cnt->v[i]->fv), str->s, + cnt->v[i]->width)) break; counter++; goto done; @@ -484,7 +478,7 @@ count_trns_proc (struct trns_header * trns, struct ccase * c, counter += count_numeric (cnt, c); else counter += count_string (cnt, c); - c->data[info->d->fv].f = counter; + case_data_rw (c, info->d->fv)->f = counter; } return -1; }