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