return 0;
}
+/* parse octal string */
+
+long int octal (char *s, int n) {
+ int i;
+ long int l = 0;
+ for (i = 0; i < n; i++) {
+ if ((s[i] >= '0') && (s[i] <= '9')) {
+ l = l * 8 + s[i] - '0';
+ } else {
+ return -1;
+ }
+ }
+ return l;
+}
+
+/* parse hexa string */
+
+long int hexa (char *s, int n) {
+ int i;
+ long int l = 0;
+ for (i = 0; i < n; i++) {
+ l *= 16;
+ if ((s[i] >= '0') && (s[i] <= '9')) {
+ l += s[i] - '0';
+ } else if ((s[i] >= 'A') && (s[i] <= 'F')) {
+ l += s[i] + 10 - 'A';
+ } else if ((s[i] >= 'a') && (s[i] <= 'f')) {
+ l += s[i] + 10 - 'a';
+ } else {
+ return -1;
+ }
+ }
+ return l;
+}
+
/* special character function */
char *specialchar (char *s) {
continue;
}
- int l = 0;
+ int l = -1;
switch (s[i + 1]) {
case 'a': l = 0x07; i += 2; break;
case 'b': l = 0x08; i += 2; break;
case '1':
case '2':
case '3':
- if ((s[i + 2] >= '0') && (s[i + 2] <= '9') &&
- (s[i + 3] >= '0') && (s[i + 3] <= '9')) {
- l = (s[i + 1] - '0') * 8 * 8 + (s[i + 2] - '0') * 8 + s[i + 3] - '0';
+ l = octal (s + 1, 3);
+ if (l != -1) {
i += 4;
}
break;
case 'x':
- if ((((s[i + 2] >= '0') && (s[i + 2] <= '9')) ||
- ((s[i + 2] >= 'A') && (s[i + 2] <= 'F')) ||
- ((s[i + 2] >= 'a') && (s[i + 2] <= 'f'))) &&
- (((s[i + 3] >= '0') && (s[i + 3] <= '9')) ||
- ((s[i + 3] >= 'A') && (s[i + 3] <= 'F')) ||
- ((s[i + 3] >= 'a') && (s[i + 3] <= 'f')))) {
- l = s[i + 2] - '0';
- if (s[i + 2] >= 'a') {
- l += '0' + 10 - 'a';
- } else if (s[i + 2] >= 'A') {
- l += '0' + 10 - 'A';
- }
- l = l * 16 + s[i + 3] - '0';
- if (s[i + 3] >= 'a') {
- l += '0' + 10 - 'a';
- } else if (s[i + 3] >= 'A') {
- l += '0' + 10 - 'A';
- }
+ l = hexa (s + 2, 2);
+ if (l != -1) {
i += 4;
}
break;
default:
}
VERBOSE (DEBUG, printf("l: 0x%02x '%c'\n", l, l));
- s[j++] = (l != 0) ? l : s[i++];
+ s[j++] = (l != -1) ? l : s[i++];
}
s[j] = '\0';