xref: /csrg-svn/usr.bin/tn3270/tools/prt3270.c (revision 31444)
130051Sminshall #ifndef	lint
230051Sminshall static	char	sccsid[] = "@(#)prt3270.c	3.1  10/29/86";
330051Sminshall #endif	/* ndef lint */
430051Sminshall 
530051Sminshall 
630051Sminshall #if defined(unix)
730051Sminshall #endif
830051Sminshall #include <stdio.h>
930051Sminshall #include <ctype.h>
1030051Sminshall 
1131175Sminshall #include "../general/general.h"
1231102Sminshall 
1330051Sminshall #include "../ascii/ascebc.h"
1430051Sminshall #include "../ctlr/hostctlr.h"
1530051Sminshall #include "../ctlr/screen.h"
16*31444Sminshall #include "../ctlr/function.h"
17*31444Sminshall #include "../ascii/astosc.h"
1831175Sminshall #include "../general/globals.h"
1930051Sminshall 
20*31444Sminshall #include "../ctlr/kbd.out"
2130051Sminshall 
22*31444Sminshall 
2330051Sminshall int NumberColumns = 80;
2430051Sminshall 
2530051Sminshall int direction;
2630051Sminshall 
2730051Sminshall int column = 1;
2830051Sminshall int indenting = 0;
2930051Sminshall int direction = '?';
3030051Sminshall 
3130051Sminshall unsigned char printBuffer[200], *print = printBuffer;
3230051Sminshall 
3330051Sminshall #define	ColsLeft()	(79-column)	/* A little room for error */
3430051Sminshall 
3530051Sminshall 
3630051Sminshall void
3730051Sminshall putSpace()
3830051Sminshall {
3930051Sminshall     extern void Column1();
4030051Sminshall     unsigned char *ourPrint = print;
4130051Sminshall 
4230051Sminshall     print = printBuffer;		/* For mutual calls */
4330051Sminshall     *ourPrint = 0;
4430051Sminshall     if (ColsLeft() < 0) {
4530051Sminshall 	Column1();
4630051Sminshall     }
4730051Sminshall     if (column != (indenting*8+1)) {
4830051Sminshall 	putchar(' ');
4930051Sminshall     } else {
5030051Sminshall 	int i;
5130051Sminshall 
5230051Sminshall 	putchar(direction);
5330051Sminshall 	putchar(' ');
5430051Sminshall 	for (i = 0; i < indenting; i++) {
5530051Sminshall 	    putchar('\t');
5630051Sminshall 	}
5730051Sminshall     }
5830051Sminshall     printf("%s", printBuffer);
5930051Sminshall     column += strlen(printBuffer);
6030051Sminshall }
6130051Sminshall 
6230051Sminshall void
6330051Sminshall Column1()
6430051Sminshall {
6530051Sminshall     if (print != printBuffer) {
6630051Sminshall 	putSpace();
6730051Sminshall     }
6830051Sminshall     if (column != (indenting*8+1)) {
6930051Sminshall 	putchar('\n');
7030051Sminshall 	column = indenting*8+1;
7130051Sminshall     }
7230051Sminshall }
7330051Sminshall 
7430051Sminshall void
7530051Sminshall Indent()
7630051Sminshall {
7730051Sminshall     if ((column != (indenting*8+1)) || (print != printBuffer)) {
7830051Sminshall 	Column1();
7930051Sminshall     }
8030051Sminshall     indenting++;
8130051Sminshall     column = indenting*8+1;
8230051Sminshall }
8330051Sminshall 
8430051Sminshall void
8530051Sminshall Undent()
8630051Sminshall {
8730051Sminshall     if ((column != (indenting*8+1)) || (print != printBuffer)) {
8830051Sminshall 	Column1();
8930051Sminshall     }
9030051Sminshall     indenting--;
9130051Sminshall     if (indenting < 0) {
9230051Sminshall 	fflush(stdout);
9330051Sminshall 	fprintf(stderr, "INTERNAL ERROR: indenting < 0.\n");
9430051Sminshall 	fflush(stderr);
9530051Sminshall     } else {
9630051Sminshall 	column = indenting*8+1;
9730051Sminshall     }
9830051Sminshall }
9930051Sminshall 
10030051Sminshall void
10130051Sminshall putChar(character)
10230051Sminshall int	character;
10330051Sminshall {
10430051Sminshall     *print++ = character;
10530732Sminshall     column++;
10630051Sminshall }
10730051Sminshall 
10830051Sminshall void
10930051Sminshall putstr(s)
11030051Sminshall char *s;
11130051Sminshall {
11230051Sminshall     while (*s) {
11330051Sminshall 	putChar(*s++);
11430051Sminshall     }
11530051Sminshall }
11630051Sminshall 
11730051Sminshall void
11830051Sminshall put2hex(i)
11930051Sminshall int i;
12030051Sminshall {
12130051Sminshall     char place[40];
12230051Sminshall 
12330051Sminshall     sprintf(place, "%02x", i);
12430051Sminshall     putstr(place);
12530051Sminshall }
12630051Sminshall 
12730051Sminshall 
12830051Sminshall void
12930051Sminshall putdecimal(i)
13030051Sminshall int i;
13130051Sminshall {
13230051Sminshall     char place[40];
13330051Sminshall 
13430051Sminshall     sprintf(place, "%d", i);
13530051Sminshall     putstr(place);
13630051Sminshall }
13730051Sminshall 
13830051Sminshall void
13930051Sminshall puthex(i)
14030051Sminshall int i;
14130051Sminshall {
14230051Sminshall     char place[40];
14330051Sminshall 
14430051Sminshall     sprintf(place, "%x", i);
14530051Sminshall     putstr(place);
14630051Sminshall }
14730051Sminshall 
14830051Sminshall void
14930051Sminshall putEChar(character)
15030051Sminshall int character;
15130051Sminshall {
15230051Sminshall     putChar(ebcasc[0][character]);
15330051Sminshall     if (ColsLeft() < 10) {
15430051Sminshall 	Column1();
15530051Sminshall     }
15630051Sminshall }
15730051Sminshall 
15830051Sminshall void
15930051Sminshall PrintAid(i)
16030051Sminshall int	i;
16130051Sminshall {
162*31444Sminshall     struct astosc *this;
16330051Sminshall 
164*31444Sminshall     for (this = &astosc[0]; this <= &astosc[highestof(astosc)]; this++) {
165*31444Sminshall 	if (this->function == FCN_AID) {
166*31444Sminshall 	    int j;
167*31444Sminshall 
168*31444Sminshall 	    switch (this->shiftstate) {
169*31444Sminshall 	    case 0:
170*31444Sminshall 		j = 0;
171*31444Sminshall 		break;
172*31444Sminshall 	    case SHIFT_UPSHIFT:
173*31444Sminshall 		j = 1;
174*31444Sminshall 		break;
175*31444Sminshall 	    case SHIFT_ALT:
176*31444Sminshall 		j = 2;
177*31444Sminshall 		break;
178*31444Sminshall 	    case (SHIFT_UPSHIFT|SHIFT_ALT):
179*31444Sminshall 		j = 3;
180*31444Sminshall 		break;
181*31444Sminshall 	    default:
182*31444Sminshall 		fprintf(stderr, "Bad shiftstate 0x%x.\n", this->shiftstate);
183*31444Sminshall 		exit(1);
184*31444Sminshall 	    }
185*31444Sminshall 	    if (hits[this->scancode].hit[j].code == i) {
186*31444Sminshall 		putstr(this->name);
187*31444Sminshall 		return;
188*31444Sminshall 	    }
18930051Sminshall 	}
19030051Sminshall     }
19130051Sminshall 
19230051Sminshall     putstr("Unknown AID 0x");
19330051Sminshall     put2hex(i);
19430051Sminshall }
19530051Sminshall 
19630051Sminshall void
19730051Sminshall PrintAddr(i)
19830051Sminshall int	i;
19930051Sminshall {
20030051Sminshall     if (ColsLeft() < 9) {
20130051Sminshall 	Column1();
20230051Sminshall     }
20330051Sminshall     putChar('(');
20430051Sminshall     putdecimal(ScreenLine(i));
20530051Sminshall     putChar(',');
20630051Sminshall     putdecimal(ScreenLineOffset(i));
20730051Sminshall     putChar(')');
20830051Sminshall }
20930051Sminshall 
21030051Sminshall 
21130051Sminshall /* returns the number of characters consumed */
21230051Sminshall int
21330051Sminshall DataFromNetwork(buffer, count, control)
21430051Sminshall register unsigned char	*buffer;		/* what the data is */
21530051Sminshall register int	count;				/* and how much there is */
21630051Sminshall int	control;				/* this buffer ended block? */
21730051Sminshall {
21830051Sminshall     int origCount;
21930051Sminshall     register int c;
22030051Sminshall     register int i;
22130051Sminshall     static int Command;
22230051Sminshall     static int Wcc;
22330051Sminshall     static int	LastWasTerminated = 1;	/* was "control" = 1 last time? */
22430051Sminshall 
22530051Sminshall     if (count == 0) {
22630051Sminshall 	Column1();
22730051Sminshall 	return 0;
22830051Sminshall     }
22930051Sminshall 
23030051Sminshall     origCount = count;
23130051Sminshall 
23230051Sminshall     if (LastWasTerminated) {
23330051Sminshall 
23430051Sminshall 	if (count < 2) {
23530051Sminshall 	    if (count == 0) {
23630051Sminshall 		fflush(stdout);
23730051Sminshall 		fprintf(stderr, "Short count received from host!\n");
23830051Sminshall 		fflush(stderr);
23930051Sminshall 		return(count);
24030051Sminshall 	    }
24130051Sminshall 	    Command = buffer[0];
24230051Sminshall 	    switch (Command) {		/* This had better be a read command */
24330051Sminshall 	    case CMD_READ_MODIFIED:
24430051Sminshall 		putstr("read_modified command\n");
24530051Sminshall 		break;
24630051Sminshall 	    case CMD_SNA_READ_MODIFIED:
24730051Sminshall 		putstr("read_modified command\n");
24830051Sminshall 		break;
24930051Sminshall 	    case CMD_SNA_READ_MODIFIED_ALL:
25030051Sminshall 		putstr("read_modified command\n");
25130051Sminshall 		break;
25230051Sminshall 	    case CMD_READ_BUFFER:
25330051Sminshall 		putstr("read_modified command\n");
25430051Sminshall 		break;
25530051Sminshall 	    case CMD_SNA_READ_BUFFER:
25630051Sminshall 		putstr("read_modified command\n");
25730051Sminshall 		break;
25830051Sminshall 	    default:
25930051Sminshall 		break;
26030051Sminshall 	    }
26130051Sminshall 	    return(1);			/* We consumed everything */
26230051Sminshall 	}
26330051Sminshall 	Command = buffer[0];
26430051Sminshall 	Wcc = buffer[1];
26530051Sminshall 	switch (Command) {
26630051Sminshall 	case CMD_ERASE_WRITE:
26730051Sminshall 	    putstr("erase write command ");
26830051Sminshall 	    break;
26930051Sminshall 	case CMD_ERASE_WRITE_ALTERNATE:
27030051Sminshall 	    putstr("erase write alternate command ");
27130051Sminshall 	    break;
27230051Sminshall 	case CMD_SNA_ERASE_WRITE:
27330051Sminshall 	    putstr("sna erase write command ");
27430051Sminshall 	    break;
27530051Sminshall 	case CMD_SNA_ERASE_WRITE_ALTERNATE:
27630051Sminshall 	    putstr("erase write alternate command ");
27730051Sminshall 	    break;
27830051Sminshall 	case CMD_ERASE_ALL_UNPROTECTED:
27930051Sminshall 	    putstr("erase all unprotected command ");
28030051Sminshall 	    break;
28130051Sminshall 	case CMD_SNA_ERASE_ALL_UNPROTECTED:
28230051Sminshall 	    putstr("sna erase write command ");
28330051Sminshall 	    break;
28430051Sminshall 	case CMD_WRITE:
28530051Sminshall 	    putstr("write command ");
28630051Sminshall 	    break;
28730051Sminshall 	case CMD_SNA_WRITE:
28830051Sminshall 	    putstr("sna write command ");
28930051Sminshall 	    break;
29030051Sminshall 	default:
29130051Sminshall 	    putstr("Unexpected command code 0x");
29230051Sminshall 	    puthex(Command);
29330051Sminshall 	    putstr(" received.");
29430051Sminshall 	    Column1();
29530051Sminshall 	    break;
29630051Sminshall 	}
29730051Sminshall 	putstr("WCC is 0x");
29830051Sminshall 	puthex(Wcc);
29930051Sminshall 	Column1();
30030051Sminshall 
30130051Sminshall 	count -= 2;			/* strip off command and wcc */
30230051Sminshall 	buffer += 2;
30330051Sminshall 
30430051Sminshall     }
30530051Sminshall     LastWasTerminated = 0;		/* then, reset at end... */
30630051Sminshall 
30730051Sminshall     while (count) {
30830051Sminshall 	count--;
30930051Sminshall 	c = *buffer++;
31030051Sminshall 	if (IsOrder(c)) {
31130051Sminshall 	    /* handle an order */
31230051Sminshall 	    switch (c) {
31330051Sminshall #		define Ensure(x)	if (count < x) { \
31430051Sminshall 					    if (!control) { \
31530051Sminshall 						return(origCount-(count+1)); \
31630051Sminshall 					    } else { \
31730051Sminshall 						/* XXX - should not occur */ \
31830051Sminshall 						count = 0; \
31930051Sminshall 						break; \
32030051Sminshall 					    } \
32130051Sminshall 					}
32230051Sminshall 	    case ORDER_SF:
32330051Sminshall 		Ensure(1);
32430051Sminshall 		c = *buffer++;
32530051Sminshall 		count--;
32630051Sminshall 		putstr("SF (0x");
32730051Sminshall 		put2hex(c);
32830051Sminshall 		putstr(") ");
32930051Sminshall 		break;
33030051Sminshall 	    case ORDER_SBA:
33130051Sminshall 		Ensure(2);
33230051Sminshall 		i = buffer[0];
33330051Sminshall 		c = buffer[1];
33430051Sminshall 		buffer += 2;
33530051Sminshall 		count -= 2;
33630051Sminshall 		putstr("SBA to ");
33730051Sminshall 		PrintAddr(Addr3270(i,c));
33830051Sminshall 		putSpace();
33930051Sminshall 		break;
34030051Sminshall 	    case ORDER_IC:
34130051Sminshall 		putstr("IC");
34230051Sminshall 		putSpace();
34330051Sminshall 		break;
34430051Sminshall 	    case ORDER_PT:
34530051Sminshall 		putstr("PT");
34630051Sminshall 		putSpace();
34730051Sminshall 		break;
34830051Sminshall 	    case ORDER_RA:
34930051Sminshall 		Ensure(3);
35030051Sminshall 		i = Addr3270(buffer[0], buffer[1]);
35130051Sminshall 		c = buffer[2];
35230051Sminshall 		buffer += 3;
35330051Sminshall 		count -= 3;
35430051Sminshall 		putstr("RA to ");
35530051Sminshall 		PrintAddr(i);
35630051Sminshall 		putstr(" of 0x");
35730051Sminshall 		put2hex(c);
35830051Sminshall 		putSpace();
35930051Sminshall 		break;
36030051Sminshall 	    case ORDER_EUA:    /* (from [here,there), ie: half open interval] */
36130051Sminshall 		Ensure(2);
36230051Sminshall 		putstr("EUA to ");
36330051Sminshall 		PrintAddr(Addr3270(buffer[0], buffer[1]));
36430051Sminshall 		putSpace();
36530051Sminshall 		buffer += 2;
36630051Sminshall 		count -= 2;
36730051Sminshall 		break;
36830051Sminshall 	    case ORDER_YALE:		/* special YALE defined order */
36930051Sminshall 		Ensure(2);	/* need at least two characters */
37030051Sminshall 		putstr("YALE order");
37130051Sminshall 		putSpace();
37230051Sminshall 		break;
37330051Sminshall 	    default:
37430051Sminshall 		putstr("UNKNOWN ORDER: 0x");
37530051Sminshall 		put2hex(c);
37630051Sminshall 		putSpace();
37730051Sminshall 		break;
37830051Sminshall 	    }
37930051Sminshall 	    if (count < 0) {
38030051Sminshall 		count = 0;
38130051Sminshall 	    }
38230051Sminshall 	} else {
38330051Sminshall 	    /* Data comes in large clumps - take it all */
38430051Sminshall 	    putstr("DATA:");
38530051Sminshall 	    Indent();
38630051Sminshall 	    putEChar(c);
38730051Sminshall 	    c = *buffer;
38830051Sminshall 	    while (count && !IsOrder(c)) {
38930051Sminshall 		putEChar(c);
39030051Sminshall 		count--;
39130051Sminshall 		buffer++;
39230051Sminshall 		c = *buffer;
39330051Sminshall 	    }
39430051Sminshall 	    Undent();
39530051Sminshall 	}
39630051Sminshall     }
39730051Sminshall     LastWasTerminated = control;
39830051Sminshall     return origCount - count;
39930051Sminshall }
40030051Sminshall 
40130051Sminshall int
40230051Sminshall DataToNetwork(buffer, count, control)
40330051Sminshall unsigned char *buffer;
40430051Sminshall int count;
40530051Sminshall int control;
40630051Sminshall {
40730051Sminshall #define	NEED_AID	0
40830051Sminshall #define	JUST_GOT_AID	1
40930051Sminshall #define	DATA		2
41030051Sminshall #define	DATA_CONTINUE	3
41130051Sminshall     static int state = NEED_AID;
41230051Sminshall     static int aid;
41330051Sminshall     int origCount = count;
41430051Sminshall 
41530051Sminshall     if (count == 0) {
41630051Sminshall 	if (control) {
41730051Sminshall 	    state = NEED_AID;
41830051Sminshall 	}
41930051Sminshall 	Column1();
42030051Sminshall 	return 0;
42130051Sminshall     }
42230051Sminshall 
42330051Sminshall     switch (state) {
42430051Sminshall     case NEED_AID:
42530051Sminshall 	aid = buffer[0];
42630051Sminshall 	buffer++;
42730051Sminshall 	count--;
42830051Sminshall 	PrintAid(aid);
42930051Sminshall 	putSpace();
430*31444Sminshall 	if (aid == AID_TREQ) {
43130051Sminshall 	    state = DATA;
43230051Sminshall 	} else {
43330051Sminshall 	    state = JUST_GOT_AID;
43430051Sminshall 	}
43530051Sminshall 	return origCount - count + DataToNetwork(buffer, count, control);
43630051Sminshall     case JUST_GOT_AID:
43730051Sminshall 	Ensure(2);
43830051Sminshall 	PrintAddr(Addr3270(buffer[0], buffer[1]));
43930051Sminshall 	putSpace();
44030051Sminshall 	buffer += 2;
44130051Sminshall 	count -= 2;
44230051Sminshall 	state = DATA;
44330051Sminshall 	return origCount - count + DataToNetwork(buffer, count, control);
44430051Sminshall     case DATA:
44530051Sminshall     case DATA_CONTINUE:
44630051Sminshall 	while (count) {
44730051Sminshall 	    if (*buffer == ORDER_SBA) {
44830051Sminshall 		if (state == DATA_CONTINUE) {
44930051Sminshall 		    Undent();
45030051Sminshall 		    state = DATA;
45130051Sminshall 		}
45230051Sminshall 		putstr("SBA ");
45330051Sminshall 		PrintAddr(Addr3270(buffer[1], buffer[2]));
45430051Sminshall 		putSpace();
45530051Sminshall 		buffer += 3;
45630051Sminshall 		count -= 3;
45730051Sminshall 	    } else {
45830051Sminshall 		if (state == DATA) {
45930051Sminshall 		    putstr("DATA:");
46030051Sminshall 		    Indent();
46130051Sminshall 		    state = DATA_CONTINUE;
46230051Sminshall 		}
46330051Sminshall 		putEChar(*buffer);
46430051Sminshall 		buffer++;
46530051Sminshall 		count--;
46630051Sminshall 	    }
46730051Sminshall 	}
46830051Sminshall 	if (control) {
46930051Sminshall 	    if (state == DATA_CONTINUE) {
47030051Sminshall 		Undent();
47130051Sminshall 	    }
47230051Sminshall 	    state = NEED_AID;
47330051Sminshall 	}
47430051Sminshall 	return origCount-count;
47530051Sminshall     }
47630051Sminshall }
47730051Sminshall 
47830051Sminshall int
47930051Sminshall GetXValue(c)
48030051Sminshall int	c;
48130051Sminshall {
48230051Sminshall     if (!isascii(c)) {
48330051Sminshall 	fflush(stdout);
48430051Sminshall 	fprintf(stderr, "Non-hex digit 0x%x.\n");
48530051Sminshall 	fflush(stderr);
48630051Sminshall 	return 0;
48730051Sminshall     } else {
48830051Sminshall 	if (islower(c)) {
48930051Sminshall 	    return (c-'a')+10;
49030051Sminshall 	} else if (isupper(c)) {
49130051Sminshall 	    return (c-'A')+10;
49230051Sminshall 	} else {
49330051Sminshall 	    return c-'0';
49430051Sminshall 	}
49530051Sminshall     }
49630051Sminshall }
49730051Sminshall 
49830051Sminshall unsigned char outbound[8192], inbound[8192],
49930051Sminshall 	*outnext = outbound, *innext = inbound, *p = 0;
50030051Sminshall 
50130051Sminshall void
50230051Sminshall termblock(old, new, control)
50330051Sminshall int old,
50430051Sminshall 	new;		/* old and new directions */
50530051Sminshall {
50630051Sminshall     int count;
50730051Sminshall 
50830051Sminshall     if (p) {
50930051Sminshall 	if (old == '<') {
51030051Sminshall 	    outnext = p;
51130051Sminshall 	    count = DataFromNetwork(outbound, outnext-outbound, control);
51230051Sminshall 	    if (outbound+count == outnext) {
51330051Sminshall 		outnext = outbound;
51430051Sminshall 	    } else {
51531102Sminshall 		memcpy(outbound, outbound+count, outnext-(outbound+count));
51630051Sminshall 		outnext = outbound+count;
51730051Sminshall 	    }
51830051Sminshall 	} else {
51930051Sminshall 	    innext = p;
52030051Sminshall 	    count = DataToNetwork(inbound, innext-inbound, control);
52130051Sminshall 	    if (inbound+count == innext) {
52230051Sminshall 		innext = inbound;
52330051Sminshall 	    } else {
52431102Sminshall 		memcpy(inbound, inbound+count, innext-(inbound+count));
52530051Sminshall 		innext = inbound+count;
52630051Sminshall 	    }
52730051Sminshall 	}
52830051Sminshall     }
52930051Sminshall     if (new == '<') {
53030051Sminshall 	p = outnext;
53130051Sminshall     } else if (new == '>') {
53230051Sminshall 	p = innext;
53330051Sminshall     } else {
53430051Sminshall 	fprintf(stderr, "Bad direction character '%c'.\n", new);
53530051Sminshall 	exit(1);
53630051Sminshall     }
53730051Sminshall }
53830051Sminshall 
53930051Sminshall main()
54030051Sminshall {
54130051Sminshall     int location;
54230051Sminshall     int new;
54330051Sminshall     int c, c1;
54430051Sminshall 
54531102Sminshall     memset(Orders, 0, sizeof Orders);
54630051Sminshall     Orders[ORDER_SF] = Orders[ORDER_SBA] = Orders[ORDER_IC]
54730051Sminshall 	    = Orders[ORDER_PT] = Orders[ORDER_RA] = Orders[ORDER_EUA]
54830051Sminshall 	    = Orders[ORDER_YALE] = 1;
54930051Sminshall 
55030051Sminshall     while (scanf("%c 0x%x\t", &new, &location) != EOF) {
55130051Sminshall 	if (new != direction) {
55230051Sminshall 	    termblock(direction, new, 0);
55330051Sminshall 	    direction = new;
55430051Sminshall 	}
55530051Sminshall 	while (((c = getchar()) != EOF) && (c != '\n') && (isxdigit(c))) {
55630051Sminshall #define	NORMAL	0
55730051Sminshall #define	GOT0XFF	0xff
55830051Sminshall 	    static int state = NORMAL;
55930051Sminshall 
56030051Sminshall 	    c1 = getchar();
56130051Sminshall 	    c = (GetXValue(c) << 4) + GetXValue(c1);
56230051Sminshall 	    switch (state) {
56330051Sminshall 	    case NORMAL:
56430051Sminshall 		if (c == 0xff) {
56530051Sminshall 		    state = GOT0XFF;
56630051Sminshall 		} else {
56730051Sminshall 		    *p++ = c;
56830051Sminshall 		}
56930051Sminshall 		break;
57030051Sminshall 	    case GOT0XFF:
57130051Sminshall 		if (c == 0xef) {
57230051Sminshall 		    termblock(direction, direction, 1);
57330051Sminshall 		} else {
57430051Sminshall 		    *p++ = 0xff;
57530051Sminshall 		    *p++ = c;
57630051Sminshall 		}
57730051Sminshall 		state = NORMAL;
57830051Sminshall 	    }
57930051Sminshall 	}
58030051Sminshall     }
58130051Sminshall     return 0;
58230051Sminshall }
583