diff options
Diffstat (limited to 'ipl/progs/yescr.icn')
-rw-r--r-- | ipl/progs/yescr.icn | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/ipl/progs/yescr.icn b/ipl/progs/yescr.icn new file mode 100644 index 0000000..65e6d8b --- /dev/null +++ b/ipl/progs/yescr.icn @@ -0,0 +1,141 @@ +############################################################################ +# +# File: yescr.icn +# +# Subject: Program to convert UNIX files to DOS format +# +# Author: Richard L. Goerwitz +# +# Date: December 30, 1991 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# Version: 1.2 +# +############################################################################ +# +# This program simply inserts MS-DOS carriage-return+linefeed +# sequences in place of UNIX newlines. Effects conversion from the +# native UNIX text file format to its DOS correspondent. +# +# usage: yescr file1 [file2 [etc.]] +# +# Bug: Doesn't check to see whether the input files are in fact +# text files. +# +############################################################################ +# +# Requires: UNIX or MS-DOS +# +# See also: nocr.icn +# +############################################################################ + + +procedure main(a) + + local fname, infile, outfile, line, temp_name + + # Static variables, initial clause not really necessary in main(). + static slash, l, ms, DOSos, nok, ok + initial { + nok := string(~&letters) + ok := repl("X",*nok) + # Find us a place to put temporary files. + if find("UNIX",&features) then { + slash := "/" + l := 10 + ms := "" + } + else if find("MS-DOS", &features) then { + slash := "\\" + l := 8 + ms := "u" + DOSos := 1 + } + # Don't take this out unless you're sure of what you're doing. + else stop("yescr: tested only under UNIX and MS-DOS") + } + + # Check to see if we have any arguments. + *a = 0 & stop("usage: yescr file1 [file2...]") + + # Start popping filenames off of the argument list. + while fname := pop(a) do { + + # Open input file. + infile := open(fname,"r"||ms) | (er_out(fname), next) + # Get temporary file name. + every temp_name := + pathname(fname, slash) || + map(left(basename(fname,slash),l,"X"), nok, ok) || + "." || right(0 to 999,3,"0") + do close(open(temp_name)) | break + # Open temporary file. + outfile := open(temp_name,"w"||ms) | (er_out(temp_name), next) + + if \DOSos then { + # Read in blocks of 80 chars. + while line := reads(infile,80) do { + line ? { + # Replace ASCII LF with CR+LF, effecting a translation + # from UNIX to DOS format. + while writes(outfile, tab(find("\x0A")), "\x0D", move(1)) + writes(outfile, tab(0)) + } + } + } + else { + # I presume I'm running under UNIX (unless I've been hacked). + # Convert lines into DOS format by appending a carriage return, + # and then write()'ing (which automatically adds a newline). + every line := !infile do { + if line[-1] == "\x0D" + then write(outfile, line) + else write(outfile, line || "\x0D") + } + } + + # Close opened input and output files. + close(infile) | stop("yescr: cannot close, ",fname,"; aborting") + close(outfile) | stop("yescr: cannot close, ",temp_name,"; aborting") + + # Remove physical input file. + remove(fname) | stop("yescr: cannot remove ",fname,"; aborting") + + # Give temp name the same name as the input file, completing the + # conversion process. + rename(temp_name,fname) | + stop("yescr: Can't find temp file ",temp_name,"; aborting") + } + +end + + +procedure er_out(s) + write(&errout,"yescr: cannot open ",s," for reading") + return +end + + +procedure basename(s,slash) + s ? { + while tab(find(slash)+1) + return tab(0) + } +end + + +procedure pathname(s,slash) + local s2 + + s2 := "" + s ? { + while s2 ||:= tab(find(slash)+1) + return s2 + } +end |