1 #include <stdio.h>
2 #include <ctype.h>
3 #include "translate.h"
4 
5 extern char *prog;
6 
7 void
inviz_num(str,line)8 inviz_num(str, line)
9 register char *str;
10 int line;
11 {
12     typedef union {
13 	char c;		unsigned char uc;
14 	short s;	unsigned short us;
15 	int i;		unsigned int ui;
16 	long l;		unsigned long ul;
17 	float f;
18 	double d;
19     } ANYVAL;
20     register ANYVAL rv;
21     ANYVAL v;
22     float f;
23 
24     register j;
25     char *next;
26     register char *p;
27 
28     int negative;
29 
30     char mode = 'I';
31     char outbuf[1000];
32 
33     double strtod();
34     unsigned long strtou();
35 
36     while (*str) {
37 	if (isspace(*str)) {
38 	    str++;
39 	    continue;
40 	}
41 
42 	switch (*str) {
43 	case 'C':
44 	case 'S':
45 	case 'I':
46 	case 'L':
47 	case 'F':
48 	case 'D':
49 	    mode = *str++;
50 	    break;
51 	case '\\':
52 	    str++;
53 	    if (*str == '#' && *(str+1)) {
54 		mode = *++str;
55 		str++;
56 	    } else if (*str == 'x') {
57 		str++;
58 		translate_hex(rv.uc, str);
59 		(void) putchar(rv.uc);
60 	    } else {
61 		translate_octal(rv.uc, str);
62 		(void) putchar(rv.uc);
63 	    }
64 	    break;
65 	case '-':
66 	case '0':
67 	case '1':
68 	case '2':
69 	case '3':
70 	case '4':
71 	case '5':
72 	case '6':
73 	case '7':
74 	case '8':
75 	case '9':
76 	    /* Translate a number */
77 	    if (mode == 'F' || mode == 'D') {
78 		v.d = strtod(str, &next);
79 		if (next == str) {
80 		    (void) fprintf(stderr,
81 			"%s: Error while translating number on line %d\n.",
82 			prog, line);
83 		    (void) fprintf(stderr, "Line ignored from `%s'\n", str);
84 		    return;
85 		}
86 		str = next;
87 		if (mode == 'F') {
88 		    f = v.d;
89 		    for (j = sizeof(float), p = (char *) &f; j; --j)
90 			(void) putchar(*p++);
91 		} else {
92 		    for (j = sizeof(double), p = (char *) &v.d; j; --j)
93 			(void) putchar(*p++);
94 		}
95 	    } else {
96 		if (*str == '-') {
97 		    str++;
98 		    negative = 1;
99 		} else {
100 		    negative = 0;
101 		}
102 		rv.ul = strtou(str, &next, 0);
103 		if (next == str) {
104 		    (void) fprintf(stderr,
105 			"%s: Error while translating number on line %d\n.",
106 			prog, line);
107 		    (void) fprintf(stderr, "Line ignored from `%s'\n", str);
108 		    return;
109 		}
110 		str = next;
111 		if (negative) {
112 		    switch (mode) {
113 		    case 'C':
114 			(void) putchar((char) -rv.ul);
115 			break;
116 		    case 'S':
117 			v.s = (short) -rv.ul;
118 			for (j = sizeof(short), p = (char *) &v.s; j; --j)
119 			    (void) putchar(*p++);
120 			break;
121 		    case 'I':
122 			v.i = (int) -rv.ul;
123 			for (j = sizeof(int), p = (char *) &v.i; j; --j)
124 			    (void) putchar(*p++);
125 			break;
126 		    case 'L':
127 			v.l = (long) -rv.ul;
128 			for (j = sizeof(long), p = (char *) &v.l; j; --j)
129 			    (void) putchar(*p++);
130 			break;
131 		    }
132 		} else {
133 		    switch (mode) {
134 		    case 'C':
135 			(void) putchar((unsigned char) rv.ul);
136 			break;
137 		    case 'S':
138 			v.us = (unsigned short) rv.ul;
139 			for (j = sizeof(short), p = (char *) &v.us; j; --j)
140 			    (void) putchar(*p++);
141 			break;
142 		    case 'I':
143 			v.ui = (unsigned int) rv.ul;
144 			for (j = sizeof(int), p = (char *) &v.ui; j; --j)
145 			    (void) putchar(*p++);
146 			break;
147 		    case 'L':
148 			v.ul = (unsigned long) rv.ul;
149 			for (j = sizeof(long), p = (char *) &v.ul; j; --j)
150 			    (void) putchar(*p++);
151 			break;
152 		    }
153 		}
154 	    }
155 	    break;
156 	default:
157 	    (void) fprintf(stderr, "%s: Invalid input on line %d\n",
158 		prog, line);
159 	    exit(1);
160 	    break;
161 	}
162     }
163 }
164