- union value *val = temp_case->data;
- unsigned char *cp = inp_init;
- unsigned char c;
- int i, j;
-
- /* This code is 2-3X the complexity it might be, but I felt like
- it. It initializes temp_case union values to 0, or SYSMIS, or
- blanks, as appropriate. */
- for (i = 0; i < inp_nval / 4; i++)
- {
- c = *cp++;
- for (j = 0; j < 4; j++)
- {
- switch (c & INP_MASK)
- {
- case INP_NUMERIC | INP_RIGHT:
- val++->f = SYSMIS;
- break;
- case INP_NUMERIC | INP_LEFT:
- val++->f = 0.0;
- break;
- case INP_STRING | INP_RIGHT:
- case INP_STRING | INP_LEFT:
- memset (val++->s, ' ', MAX_SHORT_STRING);
- break;
- }
- c >>= 2;
- }
- }
- if (inp_nval % 4)
- {
- c = *cp;
- for (j = 0; j < inp_nval % 4; j++)
- {
- switch (c & INP_MASK)
- {
- case INP_NUMERIC | INP_RIGHT:
- val++->f = SYSMIS;
- break;
- case INP_NUMERIC | INP_LEFT:
- val++->f = 0.0;
- break;
- case INP_STRING | INP_RIGHT:
- case INP_STRING | INP_LEFT:
- memset (val++->s, ' ', MAX_SHORT_STRING);
- break;
- }
- c >>= 2;
- }
- }
+ size_t i;
+
+ for (i = 0; i < inp_nval; i++)
+ switch (inp_init[i])
+ {
+ case INP_NUMERIC | INP_INIT_ONCE:
+ temp_case->data[i].f = 0.0;
+ break;
+ case INP_NUMERIC | INP_REINIT:
+ temp_case->data[i].f = SYSMIS;
+ break;
+ case INP_STRING | INP_INIT_ONCE:
+ case INP_STRING | INP_REINIT:
+ memset (temp_case->data[i].s, ' ', sizeof temp_case->data[i].s);
+ break;
+ default:
+ assert (0);
+ }