summaryrefslogtreecommitdiff
path: root/ipl/progs/icvt.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/icvt.icn')
-rw-r--r--ipl/progs/icvt.icn97
1 files changed, 97 insertions, 0 deletions
diff --git a/ipl/progs/icvt.icn b/ipl/progs/icvt.icn
new file mode 100644
index 0000000..e7326d4
--- /dev/null
+++ b/ipl/progs/icvt.icn
@@ -0,0 +1,97 @@
+############################################################################
+#
+# File: icvt.icn
+#
+# Subject: Program for ASCII/EBCDIC program conversion
+#
+# Author: Cheyenne Wills, modified by Ralph E. Griswold
+#
+# Date: May 2, 2001
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This program converts Icon programs from ASCII syntax to EBCDIC syntax
+# or vice versa. The option -a converts to ASCII, while the option
+# -e converts to EBCDIC. The program given in standard input is written
+# in converted form to standard output.
+#
+############################################################################
+
+global outf,process,bb,quotechar
+global nrbrack,nlbrack,nrbrace,nlbrace,rbrack,lbrack,rbrace,lbrace
+
+procedure main(args)
+ local line
+
+ case map(args[1]) | stop("Usage: icvt -a | -e") of {
+ "-a" : {
+ lbrace := "$("; nlbrace := "{"
+ rbrace := "$)"; nrbrace := "}"
+ lbrack := "$<"; nlbrack := "["
+ rbrack := "$>"; nrbrack := "]"
+ bb := '$'
+ }
+ "-e" : {
+ lbrace := "{"; nlbrace := "$(";
+ rbrace := "}"; nrbrace := "$)";
+ lbrack := "["; nlbrack := "$<";
+ rbrack := "]"; nrbrack := "$>";
+ bb := '[]{}'
+ }
+ default :
+ stop("Usage: icvt -a | -e")
+ }
+
+ process := standard
+
+ while line := read() do {
+ line ||:= "\n"
+ line ? while not pos(0) do
+ process()
+ }
+
+end
+
+procedure standard()
+ writes(tab(upto( '"\'#' ++ bb))) | (writes(tab(0)) & return)
+
+ if match("#") then {
+ writes(tab(0))
+ }
+ else if any('\'"') then {
+ process := inquote
+ quotechar := move(1)
+ writes(quotechar)
+ }
+ else if match(lbrack) then {
+ move(*lbrack)
+ writes(nlbrack)
+ }
+ else if match(rbrack) then {
+ move(*rbrack)
+ writes(nrbrack)
+ }
+ else if match(lbrace) then {
+ move(*lbrace)
+ writes(nlbrace)
+ }
+ else if match(rbrace) then {
+ move(*rbrace)
+ writes(nrbrace)
+ }
+ else writes(move(1))
+ return
+end
+
+procedure inquote()
+ writes( tab(upto( quotechar ++ '\\')) ) |
+ (writes(tab(0)) & return)
+ writes(="\\") & writes(move(1)) & return
+ writes( =quotechar )
+ process := standard
+ return
+end