[comp.os.minix] 1.5.0 /usr/src/lib/string

nfs@notecnirp.Princeton.EDU (Norbert Schlenker) (01/02/90)

Andy Tanenbaum has asked me to post the most recent version of my string
routines for the IBM PC.  These routines form the contents of the official
1.5.0 source directory /usr/src/lib/string.

A few notes regarding installation:
  - Read the Readme file.
  - Edit the makefile to ensure that it points to the right places and
    uses the appropriate programs and definitions.
  - If you require your binaries to run on any PC, do not make the library
    with a target of "i80386".  Using that target will result in code for
    memset() that will fail on 8088's, 8086's, and 80286's.  (I use memset()
    extensively to zero blocks of memory, and thought it would be worthwhile
    to have a '386 specific version.)

The routines have been shar'ed, compress'ed, and uuencode'd.

Happy New Year!

----------------------------------- Snip snip --------------------------------
begin 644 string.shar.Z
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
'Y"[W?@?P %6E
 
end

hall@cod.NOSC.MIL (Robert R. Hall) (01/14/90)

My system (an XT with 640k memory)  must be what some people are referring
to as small systems, because I was unable have all the files required by
Makefile for /usr/src/lib/string to fit in memory all at the same time.
To get the makfile to run I had to split the pipe string into separate
statements. See enclosed patch for Makefile.

Robert R. Hall
hall@nosc.mil

echo x - makefile.dif
sed '/^X/s///' > makefile.dif << '/'
X*** Makefile	Sat Jan 13 12:13:57 1990
X--- /usr/src/lib/string/Makefile	Sat Jan 13 12:11:22 1990
X***************
X*** 32,38 ****
X  .SUFFIXES: .s .x .o .c .y
X  
X  .x.s:
X! 	$(CPP) -P -D$(TARGET) $*.x | $(LIBPACK) >$*.s
X  
X  objects: $(OBJS)
X  
X--- 32,42 ----
X  .SUFFIXES: .s .x .o .c .y
X  
X  .x.s:
X! 	@echo ------------------------   $*    -------------------------
X! 	@$(CPP) -P -D$(TARGET) $*.x > $*.i
X! 	@sed '/^$$/d' < $*.i >$*.k
X! 	@libpack < $*.k > $*.s
X! 	@rm $*.i $*.k
X  
X  objects: $(OBJS)
X  
/

nfs@notecnirp.Princeton.EDU (Norbert Schlenker) (01/17/90)

In article <1753@cod.NOSC.MIL> hall@cod.NOSC.MIL (Robert R. Hall) writes:
>My system (an XT with 640k memory)  must be what some people are referring
>to as small systems, because I was unable have all the files required by
>Makefile for /usr/src/lib/string to fit in memory all at the same time.
>To get the makfile to run I had to split the pipe string into separate
>statements. See enclosed patch for Makefile.
>
>Robert R. Hall
>hall@nosc.mil

I have had a few email comments about this, so thought I should post this.
The /usr/src/lib/string Makefile was written to use sed because (1) the
existing libpack doesn't remove blank lines from the files it packs and
(2) the 1.3 grep binary (direct from P-H) is broken with respect to blank
lines (i.e. regular expressions of the form '^$' don't necessarily work -
this problem disappears if grep.c is recompiled).

With large binaries in the pipeline (both /usr/lib/cpp and /usr/bin/sed
qualify), the pipe is a bit hard to run on a small system.  Here is an
alternative:  a version of libpack that gets rid of its own blank lines.
With this version, the sed can be pulled out of the pipeline (the Makefile
has provision for using this version of libpack - look at its macros).

This libpack has the following advantages as well:
  - it deletes trailing spaces on lines, making .s files slightly smaller
  - if you specify a filename, libpack writes into it rather than onto
    standard output (particularly useful for people like me who always 
    type "libpack file" instead of "libpack >file"
  - it uses <stdio>, so there is no limit on the size of the file being
    packed, and all that crufty buffering code has disappeared

It has the following disadvantage:
  - it uses <stdio>: if you are using the vanilla <stdio>, performance
    will be much poorer than the existing version.  Upgrade to either
    Earl Chew's or my package.

--------------------------------- Cut here -------------------------------
/* libpack - pack ASCII assembly code */
/* Packs common strings found in PC Minix assembly code into single	*/
/* byte abbreviations.  The abbreviations all have their high bit set.	*/
/* Do not alter the order of the entries in "table"; asld depends on it.*/

/* External interfaces */
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

/* Constants */
#define MAXLINE	256			/* maximum input line length */
#define ABBREVS	128			/* number of abbreviations */
#define COMMENT '|'			/* comment character */

/* Structures and types */
struct node {
  char *string;				/* pointer to original string */
  size_t length;			/* length of original string */
  struct node *next;			/* next node with same hash value */
};
typedef unsigned short TWOBYTES;	/* CHEAT - used to return two bytes */

/* Local interfaces */
static void error_exit(/* int rc, char *msg */);
static void hash_init(/* void */);		/* initializes hash table */
static void pack_line(/* char *line */);	/* packs an input line */
static TWOBYTES abbreviate_string(/* char *s */); /* abbreviates a string */

/* Macros */
#define HASH(word) ((*(word) + *((word) + 1)) & 0x7f)
#define HIBYTE(n)  ((n) >> 8)
#define LOBYTE(n)  ((n) & 0xff)
#define MAKETWOBYTES(hi, lo)  ((((hi) & 0xff) << 8) | ((lo) & 0xff))

/* Static storage */
static 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",
NULL
};

/* This table is used to look up strings.  */

struct node node[ABBREVS];

struct node *hash[ABBREVS];		/* hash table */

/* Code */
int main(argc, argv)
int argc;
char *argv[];
{
  char line[MAXLINE];

  switch (argc) {
  case 1:
	break;
  case 2:
	if (freopen(argv[1], "r", stdin) == NULL)
		error_exit(ENOENT, "libpack: could not open file\n");
	break;
  default:
	error_exit(EINVAL, "Usage: libpack [file]\n");
  }

  hash_init();
  while (fgets(line, MAXLINE, stdin) != NULL) {
	pack_line(line);
	fputs(line, stdout);
  }

  exit(0);
}

static void error_exit(rc, msg)
int rc;
char *msg;
{
  fputs(msg, stderr);
  exit(rc);
}

static void hash_init()
{
  int i;
  register char **p;
  register struct node *np;

  for (i = 0, p = table; i < ABBREVS && *p != NULL; i++, p++) {
  	if (hash[HASH(*p)] == NULL) {
		hash[HASH(*p)] = &node[i];
	} else {
		for (np = hash[HASH(*p)]; np->next != NULL; np = np->next)
			;
		np->next = &node[i];
	}
	np = &node[i];
  	np->string = *p;
	np->length = strlen(*p);
  	np->next = NULL;
  }
}

static void pack_line(line)
char *line;
{
  register char *ip;
  register char *op;
  int in_white;
  TWOBYTES n;

  for (ip = line; *ip != '\0'; ++ip)		/* translate tabs */
	if (*ip == '\t') *ip = ' ';

  op = line;
  in_white = 1;
  for (ip = line; *ip != '\0'; ++ip) {		/* pack strings in line */
	if (*ip == COMMENT)
		break;
	if (isspace(*ip)) {
		if (!in_white) {
			*op++ = ' ';
			in_white = 1;
		}
		continue;
	}
	in_white = 0;
	n = abbreviate_string(ip);
	*op++ = LOBYTE(n);
	ip += HIBYTE(n);
  }

  if (op != line) {				/* finish nicely */
	if (op[-1] == ' ')
		--op;
	*op++ = '\n';
  }
  *op = '\0';
}

static TWOBYTES abbreviate_string(ip)
register char *ip;
{
  register struct node *np;

  for (np = hash[HASH(ip)]; np != NULL; np = np->next)
	if (strncmp(ip, np->string, np->length) == 0)
		return MAKETWOBYTES(np->length - 1, 128 + (np - node));

  return MAKETWOBYTES(0, *ip);
}