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
118
119
120
121
122
123
124
125
126
127
128
129
|
For multilingualization (iso-2022 variant encodings).
Some part of this is biased to Japanization, however, it should
give some hints to asian people.
*** util/TypeRules.c++.orig Wed Nov 27 08:20:45 1996
--- util/TypeRules.c++ Sun Apr 20 23:43:42 1997
***************
*** 48,54 ****
}
static const char* typeNames[] =
! { "ascii", "string", "address", "byte", "short", "long" };
static const char* opNames[] =
{ "<any>", "=", "!=", "<", "<=", ">", ">=", "&", "^", "!" };
static const char* resultNames[] = { "tiff", "postscript", "error" };
--- 48,54 ----
}
static const char* typeNames[] =
! { "ascii", "asciiesc", "string", "address", "byte", "short", "long" };
static const char* opNames[] =
{ "<any>", "=", "!=", "<", "<=", ">", ">=", "&", "^", "!" };
static const char* resultNames[] = { "tiff", "postscript", "error" };
***************
*** 65,71 ****
);
if (type == STRING)
printf(" \"%s\"", value.s);
! else if (type != ASCII) {
if (op == ANY)
printf(" <any value>");
else
--- 65,71 ----
);
if (type == STRING)
printf(" \"%s\"", value.s);
! else if (type != ASCII && type != ASCIIESC) {
if (op == ANY)
printf(" <any value>");
else
***************
*** 83,88 ****
--- 83,89 ----
const u_char* cp = (const u_char*) data;
switch (type) {
case ASCII:
+ {
u_int i;
for (i = 0; i < size; i++)
if (!isprint(cp[i]) && !isspace(cp[i])) {
***************
*** 92,97 ****
--- 93,111 ----
}
ok = TRUE;
goto done;
+ }
+ case ASCIIESC:
+ {
+ u_int i;
+ for (i = 0; i < size; i++)
+ if (!isprint(cp[i]) && !isspace(cp[i]) && cp[i] != '\033') {
+ if (verbose)
+ printf("failed (unprintable char %#x)\n", cp[i]);
+ return (FALSE);
+ }
+ ok = TRUE;
+ goto done;
+ }
case STRING:
ok = (strncmp((const char*)(cp+off), value.s,
fxmin((u_int) strlen(value.s), (u_int)(size-off))) == 0);
***************
*** 307,312 ****
--- 321,328 ----
rule.type = TypeRule::STRING;
else if (strncasecmp(tp, "ascii", cp-tp) == 0)
rule.type = TypeRule::ASCII;
+ else if (strncasecmp(tp, "asciiesc", cp-tp) == 0)
+ rule.type = TypeRule::ASCIIESC;
else if (strncasecmp(tp, "addr", cp-tp) == 0)
rule.type = TypeRule::ADDR;
else {
***************
*** 317,323 ****
cp++;
rule.op = TypeRule::EQ; // default is '='
const char* vp = cp;
! if (rule.type != TypeRule::STRING && rule.type != TypeRule::ASCII) {
// numeric value
switch (*vp) {
case '=': rule.op = TypeRule::EQ; cp++; break;
--- 333,340 ----
cp++;
rule.op = TypeRule::EQ; // default is '='
const char* vp = cp;
! if (rule.type != TypeRule::STRING && rule.type != TypeRule::ASCII
! && rule.type != TypeRule::ASCIIESC) {
// numeric value
switch (*vp) {
case '=': rule.op = TypeRule::EQ; cp++; break;
*** util/TypeRules.h.orig Sun Apr 20 23:22:28 1997
--- util/TypeRules.h Sun Apr 20 23:21:11 1997
***************
*** 130,135 ****
--- 130,136 ----
fxBool cont; // continuation
enum {
ASCII, // ascii-only string
+ ASCIIESC, // ascii-only string + escape char (iso-2022 variants)
STRING, // byte string
ADDR, // address of match
BYTE, // 8 bits
*** util/typerules.orig Sun Apr 20 23:22:49 1997
--- util/typerules Sun Apr 20 23:24:45 1997
***************
*** 128,133 ****
--- 128,138 ----
>15 string ascii ps %F/textfmt -B -f Courier-Bold\
-p 11 -s %s >%o <%i
#
+ # Japanization (should help other iso-2022 variants too)
+ #
+ #>15 string asciiesc ps a2ps-j -l '' -p -ns -nt <%i >%o
+ #0 asciiesc x ps a2ps-j -l '' -p -ns -nt <%i >%o
+ #
# This causes anything else with ascii-only data to be treated as text.
#
0 ascii x ps %F/textfmt -B -f Courier-Bold\
|