summaryrefslogtreecommitdiff
path: root/ipl/progs/fileprnt.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/fileprnt.icn')
-rw-r--r--ipl/progs/fileprnt.icn105
1 files changed, 105 insertions, 0 deletions
diff --git a/ipl/progs/fileprnt.icn b/ipl/progs/fileprnt.icn
new file mode 100644
index 0000000..af70da2
--- /dev/null
+++ b/ipl/progs/fileprnt.icn
@@ -0,0 +1,105 @@
+############################################################################
+#
+# File: fileprnt.icn
+#
+# Subject: Program to display characters in file
+#
+# Author: Ralph E. Griswold
+#
+# Date: November 21, 1989
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This program reads the file specified as a command-line argument and
+# writes out a representation of each character in several forms:
+# hexadecimal, octal, decimal, symbolic, and ASCII code.
+#
+# Input is from a named file rather than standard input, so that it
+# can be opened in untranslated mode. Otherwise, on some systems, input
+# is terminated for characters like ^Z.
+#
+# Since this program is comparatively slow, it is not suitable
+# for processing very large files.
+#
+# There are several useful extensions that could be added to this program,
+# including other character representations, an option to skip an initial
+# portion of the input file, and suppression of long ranges of identical
+# characters.
+#
+############################################################################
+#
+# Requires: co-expressions
+#
+############################################################################
+#
+# Program note:
+#
+# This program illustrates a situation in which co-expressions can be
+# used to considerably simplify programming. Try recasting it without
+# co-expressions.
+#
+############################################################################
+
+procedure main(arg)
+ local width, chars, nonprint, prntc, asc, hex, sym, dec
+ local oct, ascgen, hexgen, octgen, chrgen, prtgen, c
+ local cnt, line, length, bar, input
+
+ input := open(arg[1],"u") | stop("*** cannot open input file")
+ width := 16
+ chars := string(&cset)
+ nonprint := chars[1:33] || chars[128:0]
+ prntc := map(chars,nonprint,repl(" ",*nonprint))
+
+ asc := table(" |")
+ hex := table()
+ sym := table()
+ dec := table()
+ oct := table()
+ ascgen := create "NUL" | "SOH" | "STX" | "ETX" | "EOT" | "ENQ" | "ACK" |
+ "BEL" | " BS" | " HT" | " LF" | " VT" | " FF" | " CR" | " SO" | " SI" |
+ "DLE" | "DC1" | "DC2" | "DC3" | "DC4" | "NAK" | "SYN" | "ETB" | "CAN" |
+ " EM" | "SUB" | "ESC" | " FS" | " GS" | " RS" | " US" | " SP"
+ hexgen := create !"0123456789ABCDEF" || !"0123456789ABCDEF"
+ octgen := create (0 to 3) || (0 to 7) || (0 to 7)
+ chrgen := create !chars
+ prtgen := create !prntc
+ every c := !&cset do {
+ asc[c] := @ascgen || "|"
+ oct[c] := @octgen || "|"
+ hex[c] := " " || @hexgen || "|"
+ sym[c] := " " || @prtgen || " |"
+ }
+ asc[char(127)] := "DEL|" # special case
+
+ cnt := -1 # to handle zero-indexing of byte count
+
+ while line := reads(input,width) do { # read one line's worth
+ length := *line # may not have gotten that many
+ bar := "\n" || repl("-",5 + length * 4)
+ write()
+ writes("BYTE|")
+ every writes(right(cnt + (1 to length),3),"|")
+ write(bar)
+ writes(" HEX|")
+ every writes(hex[!line])
+ write(bar)
+ writes(" OCT|")
+ every writes(oct[!line])
+ write(bar)
+ writes(" DEC|")
+ every writes(right(ord(!line),3),"|")
+ write(bar)
+ writes(" SYM|")
+ every writes(sym[!line])
+ write(bar)
+ writes(" ASC|")
+ every writes(asc[!line])
+ write(bar)
+ cnt +:= length
+ }
+end