/* ps2mfutl.c */ #include #ifndef AIX #include #endif #include #include "defines.h" #include "mymalloc.h" #include "ps2mf.h" #include "ps2mfutl.h" #ifdef MSDOS #include #endif #ifdef __STDC__ void error (char * s) #else void error (s) char * s; #endif { fprintf (stderr, "\n%s\n", s); if (obuffer [0]) { fprintf (stderr, "%s\n", obuffer); while (param > buffer) { fprintf (stderr, " "); param --; } fprintf (stderr, "^n\n"); } if (* s == '!') exit (UNSUCCESSFUL); } #ifdef __STDC__ int transform (int x, int y) #else int transform (x, y) int x, y; #endif { double acc; acc = 1.0 * x + 0.0 * y; /* ^=efactor ^=slant */ return ((int) (acc >= 0.0 ? acc + 0.5 : acc - 0.5)); } #ifdef __STDC int get_line (FILE * in_file) #else int get_line (in_file) FILE * in_file; #endif { char * p; int c; param = buffer; do c = getc (in_file); while (c == ' ' || c == '\r' || c == '\n'); ungetc (c, in_file); for (p = buffer; (c = getc (in_file)) != EOF && c != '\n' && c != '\r'; /* skip */) * p ++ = c; if (buffer [0] == '%') return (get_line (in_file)); * p = 0; strcpy (obuffer, buffer); if (p == buffer && c == EOF) return (0); return (1); } #ifdef __STDC void un_get_line (FILE * in_file) #else void un_get_line (in_file) FILE * in_file; #endif { char * p; int c; for (p = obuffer; * p; p ++) /* skip */; for (* p = '\n'; p >= obuffer; p --) { if (! ungetc (* p, in_file) == * p) error ("! could not unget"); } } #ifdef __STDC__ int get_token (FILE * in_file) #else int get_token (in_file) FILE * in_file; #endif { if (! * param) if (! get_line (in_file)) return (0); return (1); } /* Routines for input parsing: param_new_string, param_string, param_num, param_float, expect */ #ifdef __STDC__ bool is_in_delimiters (char c) # else bool is_in_delimiters (c) char c; # endif { if (c == '{' || c == '[' || c == '(' || c == ')' || c == ']' || c == '}') return (TRUE); return (FALSE); } char * param_new_string () { char * p, * q; p = param; if (is_in_delimiters (* p)) p ++; else while (* p > ' ' && ! is_in_delimiters (* p)) p ++; q = my_malloc ((int) (p - param + 1)); if (* p != 0) * p ++ = 0; strcpy (q, param); while (* p && * p <= ' ') p ++; param = p; return (q); } char * param_string () { char * p, * q; p = param; if (is_in_delimiters (* p)) p ++; else while (* p > ' ' && ! is_in_delimiters (* p)) p ++; q = param; if (* p != 0) * p ++ = 0; while (* p && * p <= ' ') p ++; param = p; return (q); } int param_oct () { char * p; int i; p = param_string (); if (sscanf (p, "%o", & i) != 1) error ("! octal number expected"); return (i); } int param_hex () { char * p; int i; p = param_string (); if (sscanf (p, "%x", & i) != 1) error ("! hexadecimal number expected"); return (i); } int param_num () { char * p; int i; p = param_string (); if (sscanf (p, "%d", & i) != 1) error ("! integer expected"); return (i); } float param_float () { char * p; float f; p = param_string (); if (sscanf (p, "%f", & f) != 1) error ("! number expected"); return (f); } #ifdef __STDC__ void expect (char * s) #else void expect (s) char * s; #endif { if (! strequ (param_string (), s)) { fprintf (stderr, "%s expected.", s); error ("! syntax error"); } } #ifdef __STDC__ AFM_info_tp * find_AFM_info_for (char * p) #else AFM_info_tp * find_AFM_info_for (p) char * p; #endif { AFM_info_tp * ai; for (ai = AFM_chars; ai; ai = ai -> next) { if (strequ (p, ai -> AFM_name)) return (ai); } return (NULL); }