File: strutils.c

package info (click to toggle)
hx 0.7.14-6
  • links: PTS
  • area: main
  • in suites: woody
  • size: 564 kB
  • ctags: 834
  • sloc: ansic: 7,901; sh: 152; makefile: 81
file content (117 lines) | stat: -rw-r--r-- 2,335 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "hx_types.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void strexpand (char *);
void chrexpand (char *);

void
strexpand (char *str)
{
	register char c, *p, *sk;

	for (p = str; *p; p++) {
		if (*p != '\\' || !p[1])
			continue;
		sk = &(p[2]);
		switch (p[1]) {
			case 'n': c = '\n'; break;
			case 'r': c = '\r'; break;
			case 't': c = '\t'; break;
#ifdef __STDC__
			case 'a': c = '\a'; break;
			case 'v': c = '\v'; break;
#else
			case 'a': c = '\007'; break;
			case 'v': c = 0x0b; break;
#endif
			case 'b': c = '\b'; break;
			case 'f': c = '\f'; break;
			case 'e': c = '\033'; break;
			case 'E': c = '\033'; break;
			case '0': case '1': case '2': case '3':
			case '4': case '5': case '6': case '7':
				c = p[1] - '0';
				if (p[2] >= '0' && p[2] <= '7') {
        				c = c * 8 + (p[2] - '0');
					sk++;
				}
      				if (p[3] >= '0' && p[3] <= '7') {
        				c = c * 8 + (p[3] - '0');
					sk++;
				}
				break;
			case 'x':
				if (isxdigit(p[2])) {
					char xstr[6] = " 0x";
					xstr[3] = p[2];
					if (isxdigit(p[3])) {
						xstr[4] = p[3];
						xstr[5] = 0;
						sk = &(p[4]);
					} else {
						xstr[4] = 0;
						sk = &(p[3]);
					}
					c = (char)strtoul(xstr, 0, 16);
				} else
					c = 'x';
				break;
			default: c = p[1];
		}
		*p = c;
		strcpy(&(p[1]), sk);
	}
}

void
chrexpand (char *p)
{
	register char c, *sk = &(p[2]);

	switch (p[1]) {
		case 'n': c = '\n'; break;
		case 'r': c = '\r'; break;
		case 't': c = '\t'; break;
#ifdef __STDC__
		case 'a': c = '\a'; break;
		case 'v': c = '\v'; break;
#else
		case 'a': c = '\007'; break;
		case 'v': c = 0x0b; break;
#endif
		case 'b': c = '\b'; break;
		case 'f': c = '\f'; break;
		case 'e': c = '\033'; break;
		case 'E': c = '\033'; break;
		case '0': case '1': case '2': case '3':
		case '4': case '5': case '6': case '7':
			c = p[1] - '0';
			if (p[2] >= '0' && p[2] <= '7') {
        			c = c * 8 + (p[2] - '0');
				sk++;
			}
      			if (p[3] >= '0' && p[3] <= '7') {
        			c = c * 8 + (p[3] - '0');
				sk++;
			}
			break;
		case 'x':
			{
				char xstr[6] = " 0x";
				xstr[3] = p[2];
				xstr[4] = p[3];
				xstr[5] = 0;
				if (p[3])
					sk = &(p[4]);
				else
					sk = &(p[3]);
				c = (char)strtoul(xstr, 0, 16);
			}
			break;
		default: c = p[1];
	}
	*p = c;
	strcpy(&(p[1]), sk);
}