#include "mess822.h"
int mess822_token(out,in)
stralloc *out;
char *in;
{
char ch;
int level;
if (!stralloc_copys(out,"")) return 0;
for (;;)
switch(ch = *in++) {
case 0:
return 1;
case '"':
if (!stralloc_append(out,"=")) return 0;
while (*in) {
ch = *in++;
if (ch == '"') break;
if (ch == '\\') if (*in) ch = *in++;
if (!stralloc_append(out,&ch)) return 0;
}
if (!stralloc_0(out)) return 0;
break;
case '[':
if (!stralloc_append(out,"=")) return 0;
if (!stralloc_append(out,"[")) return 0;
while (*in) {
ch = *in++;
if (ch == ']') break;
if (ch == '\\') if (*in) ch = *in++;
if (!stralloc_append(out,&ch)) return 0;
}
if (!stralloc_append(out,"]")) return 0;
if (!stralloc_0(out)) return 0;
break;
case '(':
if (!stralloc_append(out,"(")) return 0;
level = 1;
while (*in) {
ch = *in++;
if (ch == ')') {
--level;
if (!level) break;
if (!stralloc_append(out,")")) return 0;
continue;
}
if (ch == '(') {
if (level) if (!stralloc_append(out,"(")) return 0;
++level;
continue;
}
if (ch == '\\') if (*in) ch = *in++;
if (!stralloc_append(out,&ch)) return 0;
}
if (!stralloc_0(out)) return 0;
break;
case '<': case '>': case ',': case ';': case ':':
case '@': case '.':
case ' ': case '\t':
if (!stralloc_append(out,&ch)) return 0;
if (!stralloc_0(out)) return 0;
break;
default:
if (!stralloc_append(out,"=")) return 0;
for (;;) {
if (ch == '\\') if (*in) ch = *in++;
if (!stralloc_append(out,&ch)) return 0;
ch = *in;
if (!ch) break;
if (ch == '"') break;
if (ch == '[') break;
if (ch == '(') break;
if (ch == '<') break;
if (ch == '>') break;
if (ch == ',') break;
if (ch == ';') break;
if (ch == ':') break;
if (ch == '@') break;
if (ch == '.') break;
if (ch == ' ') break;
if (ch == '\t') break;
++in;
}
if (!stralloc_0(out)) return 0;
break;
}
}
syntax highlighted by Code2HTML, v. 0.9.1