more files
diff --git a/src/cmd/postscript/tr2post/Bgetfield.c b/src/cmd/postscript/tr2post/Bgetfield.c
new file mode 100644
index 0000000..8922139
--- /dev/null
+++ b/src/cmd/postscript/tr2post/Bgetfield.c
@@ -0,0 +1,156 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "../common/common.h"
+#include "tr2post.h"
+
+#undef isspace
+#define isspace bisspace
+
+int
+isspace(Rune r)
+{
+	return(r==' ' || r=='\t' || r=='\n' || r == '\r' || r=='\f');
+}
+
+int
+Bskipws(Biobuf *bp) {
+	int r;
+	char c[UTFmax];
+	int sindex = 0;
+
+	/* skip over initial white space */
+	do {
+		r = Bgetrune(bp);
+		if (r == '\n') inputlineno++;
+		sindex++;	
+	} while (r>=0 && isspace(r));
+	if (r<0) {
+		return(-1);
+	} else if (!isspace(r)) {
+		Bungetrune(bp);
+		--sindex;
+	}
+	return(sindex);
+}
+
+int
+asc2dig(char c, int base) {
+	if (c >= '0' && c <= '9')
+		if (base == 8 && c > '7') return(-1);
+		else return(c - '0');
+
+	if (base == 16)
+		if (c >= 'a' && c <= 'f') return(10 + c - 'a');
+		else if (c >= 'A' && c <= 'F') return(10 + c - 'A');
+
+	return(-1);
+}
+
+/* get a string of type: "d" for decimal integer, "u" for unsigned,
+ * "s" for string", "c" for char, 
+ * return the number of characters gotten for the field.  If nothing
+ * was gotten and the end of file was reached, a negative value
+ * from the Bgetrune is returned.
+ */
+
+int
+Bgetfield(Biobuf *bp, int type, void *thing, int size) {
+	int r;
+	Rune R;
+	char c[UTFmax];
+	int sindex = 0, i, j, n = 0;
+	int negate = 0;
+	int base = 10;
+	BOOLEAN bailout = FALSE;
+	int dig;
+	unsigned int u = 0;
+
+	/* skip over initial white space */
+	if (Bskipws(bp) < 0)
+		return(-1);
+
+	switch (type) {
+	case 'd':
+		while (!bailout && (r = Bgetrune(bp))>=0) {
+			switch (sindex++) {
+			case 0:
+				switch (r) {
+				case '-':
+					negate = 1;
+					continue;
+				case '+':
+					continue;
+				case '0':
+					base = 8;
+					continue;
+				default:	
+					break;
+				}
+				break;
+			case 1:
+				if ((r == 'x' || r == 'X') && base == 8) {
+					base = 16;
+					continue;
+				}
+			}
+			if ((dig = asc2dig(r, base)) == -1) bailout = TRUE;						
+			else n = dig + (n * base);
+		}
+		if (r < 0) return(-1);
+		*(int *)thing = (negate)?-n:n;
+		Bungetrune(bp);
+		break;
+	case 'u':
+		while (!bailout && (r = Bgetrune(bp))>=0) {
+			switch (sindex++) {
+			case 0:
+				if (*c == '0') {
+					base = 8;
+					continue;
+				}
+				break;
+			case 1:
+				if ((r == 'x' || r == 'X') && base == 8) {
+					base = 16;
+					continue;
+				}
+			}
+			if ((dig = asc2dig(r, base)) == -1) bailout = TRUE;						
+			else u = dig + (n * base);
+		}
+		*(int *)thing = u;
+		if (r < 0) return(-1);
+		Bungetrune(bp);
+		break;
+	case 's':
+		j = 0;
+		while ((size>j+UTFmax) && (r = Bgetrune(bp))>=0 && !isspace(r)) {
+			R = r;
+			i = runetochar(&(((char *)thing)[j]), &R);
+			j += i;
+			sindex++;
+		}
+		((char *)thing)[j++] = '\0';
+		if (r < 0) return(-1);
+		Bungetrune(bp);
+		break;
+	case 'r':
+		if ((r = Bgetrune(bp))>=0) {
+			*(Rune *)thing = r;
+			sindex++;
+			return(sindex);
+		}
+		if (r <= 0) return(-1);
+		Bungetrune(bp);
+		break;
+	default:
+		return(-2);
+	}
+	if (r < 0 && sindex == 0)
+		return(r);
+	else if (bailout && sindex == 1) {
+		return(0);
+	} else
+		return(sindex);
+}