1 /*
2 Imported scan_hex(), scan_oct(), xmalloc(), xrealloc() from
3 Ruby b19's"util.c" and "gc.c". Thanks to Matsumoto-san for consent!
4 */
5
6 #include <stdio.h>
7 #include <string.h>
8 #include <stdlib.h>
9 #include <ctype.h>
10 #include "namazu.h"
11
12 unsigned long
scan_oct(start,len,retlen)13 scan_oct(start, len, retlen)
14 char *start;
15 int len;
16 int *retlen;
17 {
18 register char *s = start;
19 register unsigned long retval = 0;
20
21 while (len-- && *s >= '0' && *s <= '7') {
22 retval <<= 3;
23 retval |= *s++ - '0';
24 }
25
26 *retlen = s - start;
27 return retval;
28 }
29
30 unsigned long
scan_hex(start,len,retlen)31 scan_hex(start, len, retlen)
32 char *start;
33 int len;
34 int *retlen;
35 {
36 static char hexdigit[] = "0123456789abcdef0123456789ABCDEFx";
37 register char *s = start;
38 register unsigned long retval = 0;
39 char *tmp;
40
41 while (len-- && *s && (tmp = strchr(hexdigit, *s))) {
42 retval <<= 4;
43 retval |= (tmp - hexdigit) & 15;
44 s++;
45 }
46 *retlen = s - start;
47 return retval;
48 }
49
50
51 static unsigned long malloc_memories = 0;
52
53 void *
xmalloc(size)54 xmalloc(size)
55 unsigned long size;
56 {
57 void *mem;
58
59 if (size == 0) size = 1;
60 malloc_memories += size;
61 mem = malloc(size);
62
63 return mem;
64 }
65
66 void *
xrealloc(ptr,size)67 xrealloc(ptr, size)
68 void *ptr;
69 unsigned long size;
70 {
71 void *mem;
72
73 if (!ptr) return xmalloc(size);
74 mem = realloc(ptr, size);
75 return mem;
76 }
77
78
79
tr(uchar * str,uchar f,uchar t)80 void tr(uchar *str, uchar f, uchar t)
81 {
82 while (*str) {
83 if (*str == f)
84 *str = t;
85 str++;
86 }
87 }
88
89 /* delete ending LF and spaces of string*/
chop(uchar * s)90 void chop(uchar * s)
91 {
92 int i;
93 for (i = strlen(s) - 1; i >= 0; i--) {
94 if (*(s + i) == '\n' || *(s + i) == '\r'
95 || *(s + i) == ' ' || *(s + i) == '\t')
96 *(s + i) = '\0';
97 else
98 break;
99 }
100 }
101
102
103 /* a machine has no memmove() such as SunOS 4.1.x */
104 #if !defined(HAVE_MEMMOVE)
105
memmove(void * d,void * s,size_t n)106 void *memmove(void *d, void *s, size_t n)
107 {
108 size_t i;
109
110 if (s > d) {
111 for (i = 0; i < n; i++) {
112 *((char *)d + i) = *((char *)s + i);
113 }
114 } else {
115 for (i = n - 1; ; i--) {
116 *((char *)d + i) = *((char *)s + i);
117 if (i == 0)
118 break;
119 }
120 }
121 return d;
122 }
123
124 #endif
125
126 /* decoding URL encoded strings */
decode_url_string(uchar * s)127 void decode_url_string(uchar * s)
128 {
129 int i, j;
130 for (i = j = 0; s[i]; i++, j++) {
131 if (s[i] == '%') {
132 s[j] = URLdecode(s[i + 1], s[i + 2]);
133 i += 2;
134 } else if (s[i] == '+') {
135 s[j] = ' ';
136 } else {
137 s[j] = s[i];
138 }
139 }
140 s[j] = '\0';
141 }
142
tolower_string(uchar * str)143 void tolower_string(uchar *str)
144 {
145 while (*str) {
146 *str = tolower(*str);
147 str++;
148 }
149 }
150
delete_backslashes(uchar * str)151 void delete_backslashes(uchar *str)
152 {
153 uchar *pos = str;
154
155 while (*str) {
156 if (*str == '\\' && *(str + 1) == '\\') {
157 *pos = *str;
158 pos++;
159 str++;
160 str++;
161 } else if (*str == '\\') {
162 str++;
163 } else {
164 *pos = *str;
165 pos++;
166 str++;
167 }
168 }
169 *pos = '\0';
170 }
171
172 /* return with pointer to character at the end of string */
lastc(uchar * str)173 uchar *lastc(uchar *str)
174 {
175 return (str + strlen(str) - 1);
176 }
177
178 /* fread with endian consideration */
freadx(void * ptr,size_t size,size_t nmemb,FILE * stream)179 size_t freadx(void *ptr, size_t size, size_t nmemb, FILE *stream)
180 {
181 size_t value;
182
183 value = fread(ptr, size, nmemb, stream);
184 if (OppositeEndian && size == sizeof(int)) {
185 reverse_byte_order(ptr, nmemb);
186 }
187 return value;
188 }
189