Minix1.5/commands/ibm/libupack.c

Compare this file to the similar file:
Show the results in this format:

/* libupack - unpack a packed .s file		Author: Andy Tanenbaum */

char *table[] = {
	 "push ax",
	 "ret",
	 "mov bp,sp",
	 "push bp",
	 "pop bp",
	 "mov sp,bp",
	 ".text",
	 "xor ax,ax",
	 "push 4(bp)",
	 "pop bx",
	 "pop si",
	 "cbw",
	 "movb al,(bx)",
	 "pop ax",
	 "xorb ah,ah",
	 "mov ax,#1",
	 "call _callm1",
	 "add sp,#16",
	 "mov bx,4(bp)",
	 "push 6(bp)",
	 "mov -2(bp),ax",
	 "I0013:",
	 "call .cuu",
	 "mov ax,-2(bp)",
	 "add 4(bp),#1",
	 "or ax,ax",
	 "jmp I0011",
	 "mov bx,8(bp)",
	 "push dx",
	 "mov cx,#2",
	 "mov bx,#2",
	 "I0011:",
	 "I0012:",
	 "push -2(bp)",
	 "mov ax,4(bp)",
	 "mov ax,-4(bp)",
	 "add sp,#6",
	 "and ax,#255",
	 "push bx",
	 "mov bx,-2(bp)",
	 "loop 2b",
	 "jcxz 1f",
	 ".word 4112",
	 "mov ax,(bx)",
	 "mov -4(bp),ax",
	 "jmp I0013",
	 ".data",
	 "mov bx,6(bp)",
	 "mov (bx),ax",
	 "je I0012",
	 ".word 8224",
	 ".bss",
	 "mov ax,#2",
	 "call _len",
	 "call _callx",
	 ".word 28494",
	 ".word 0",
	 "push -4(bp)",
	 "movb (bx),al",
	 "mov bx,ax",
	 "mov -2(bp),#0",
	 "I0016:",
	 ".word 514",
	 ".word 257",
	 "mov ",
	 "push ",
	 ".word ",
	 "pop ",
	 "add ",
	 "4(bp)",
	 "-2(bp)",
	 "(bx)",
	 ".define ",
	 ".globl ",
	 "movb ",
	 "xor ",
	 "jmp ",
	 "cmp ",
	 "6(bp)",
	 "-4(bp)",
	 "-6(bp)",
	 "#16",
	 "_callm1",
	 "call ",
	 "8(bp)",
	 "xorb ",
	 "and ",
	 "sub ",
	 "-8(bp)",
	 "jne ",
	 ".cuu",
	 "lea ",
	 "inc ",
	 "_M+10",
	 "#255",
	 "loop",
	 "jcxz",
	 "ax,#",
	 "bx,#",
	 "cx,#",
	 "ax,",
	 "bx,",
	 "cx,",
	 "dx,",
	 "si,",
	 "di,",
	 "bp,",
	 "ax",
	 "bx",
	 "cx",
	 "dx",
	 "si",
	 "di",
	 "bp",
	 "sp",
	 "dec ",
	 "neg ",
	 "_execve",
	 ",#0",
	 0};

#define IBUFSIZE 10000
#define OBUFSIZE 30000
#define OUTMAX (7*1024)

char input[IBUFSIZE + 1], output[OBUFSIZE + 1];

main()
{
  int n, count, bytes, cum;

  while (1) {
	n = read(0, input, IBUFSIZE);
	if (n <= 0) exit(1);
	input[n] = 0;
	count = unpack88(input, output);
	cum = 0;
	while (count > 0) {
		bytes = (count < OUTMAX ? count : OUTMAX);
		n = write(1, output + cum, bytes);
		count -= bytes;
		cum += bytes;
	}
  }
}

unpack88(inp, outp)
register char *inp, *outp;
{

  register k;
  char *p, *orig;

  orig = outp;
  while (*inp != 0) {
	k = *inp & 0377;
	if (k < 128) {
		*outp++ = *inp++;
	} else {
		p = table[k - 128];
		while (*p != 0) *outp++ = *p++;
		*inp++;
	}
  }
  return(outp - orig);
}