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