-/* Public functions. */
-
-typedef int numeric_converter (char *, const struct fmt_spec *, double);
-static numeric_converter convert_F, convert_N, convert_E, convert_F_plus;
-static numeric_converter convert_Z, convert_IB, convert_P, convert_PIB;
-static numeric_converter convert_PIBHEX, convert_PK, convert_RB;
-static numeric_converter convert_RBHEX, convert_CCx, convert_date;
-static numeric_converter convert_time, convert_WKDAY, convert_MONTH;
-
-static numeric_converter try_F, convert_infinite;
-
-typedef int string_converter (char *, const struct fmt_spec *, const char *);
-static string_converter convert_A, convert_AHEX;
-
-/* Converts binary value V into printable form in the exactly
- FP->W character in buffer S according to format specification
- FP. No null terminator is appended to the buffer. */
-bool
-data_out (char *s, const struct fmt_spec *fp, const union value *v)
-{
- int cat = formats[fp->type].cat;
- int ok;
-
- assert (check_output_specifier (fp, 0));
- if (!(cat & FCAT_STRING))
- {
- /* Numeric formatting. */
- double number = v->f;
-
- /* Handle SYSMIS turning into blanks. */
- if ((cat & FCAT_BLANKS_SYSMIS) && number == SYSMIS)
- {
- memset (s, ' ', fp->w);
- s[fp->w - fp->d - 1] = '.';
- return true;
- }
-
- /* Handle decimal shift. */
- if ((cat & FCAT_SHIFT_DECIMAL) && number != SYSMIS && fp->d)
- number *= pow (10.0, fp->d);
-
- switch (fp->type)
- {
- case FMT_F:
- ok = convert_F (s, fp, number);
- break;
-
- case FMT_N:
- ok = convert_N (s, fp, number);
- break;
-
- case FMT_E:
- ok = convert_E (s, fp, number);
- break;
-
- case FMT_COMMA: case FMT_DOT: case FMT_DOLLAR: case FMT_PCT:
- ok = convert_F_plus (s, fp, number);
- break;
-
- case FMT_Z:
- ok = convert_Z (s, fp, number);
- break;
-
- case FMT_A:
- assert (0);
- abort ();
-
- case FMT_AHEX:
- assert (0);
- abort ();
-
- case FMT_IB:
- ok = convert_IB (s, fp, number);
- break;
-
- case FMT_P:
- ok = convert_P (s, fp, number);
- break;
-
- case FMT_PIB:
- ok = convert_PIB (s, fp, number);
- break;
-
- case FMT_PIBHEX:
- ok = convert_PIBHEX (s, fp, number);
- break;
-
- case FMT_PK:
- ok = convert_PK (s, fp, number);
- break;
-
- case FMT_RB:
- ok = convert_RB (s, fp, number);
- break;
-
- case FMT_RBHEX:
- ok = convert_RBHEX (s, fp, number);
- break;
-
- case FMT_CCA: case FMT_CCB: case FMT_CCC: case FMT_CCD: case FMT_CCE:
- ok = convert_CCx (s, fp, number);
- break;
-
- case FMT_DATE: case FMT_EDATE: case FMT_SDATE: case FMT_ADATE:
- case FMT_JDATE: case FMT_QYR: case FMT_MOYR: case FMT_WKYR:
- case FMT_DATETIME:
- ok = convert_date (s, fp, number);
- break;
-
- case FMT_TIME: case FMT_DTIME:
- ok = convert_time (s, fp, number);
- break;
-
- case FMT_WKDAY:
- ok = convert_WKDAY (s, fp, number);
- break;