home *** CD-ROM | disk | FTP | other *** search
- ############################################################################
- #
- # File: edscript.icn
- #
- # Subject: Program to produce script for ed(1)
- #
- # Author: Ralph E. Griswold
- #
- # Date: June 10, 1988
- #
- ###########################################################################
- #
- # This program takes specifications for global edits from standard
- # input and outputs an edit script for the UNIX editor ed to standard output.
- # Edscript is primarily useful for making complicated literal sub-
- # stitutions that involve characters that have syntactic meaning to
- # ed and hence are difficult to enter in ed.
- #
- # Each specification begins with a delimiter, followed by a tar-
- # get string, followed by the delimiter, followed by the replace-
- # ment string, followed by the delimiter. For example
- #
- # |...|**|
- # |****||
- #
- # specifies the replacement of all occurrences of three consecutive
- # periods by two asterisks, followed by the deletion of all
- # occurrences of four consecutive asterisks. Any character may be
- # used for the delimiter, but the same character must be used in
- # all three positions in any specification, and the delimiter char-
- # acter cannot be used in the target or replacement strings.
- #
- # Diagnostic:
- #
- # Any line that does not have proper delimiter structure is noted
- # and does not contribute to the edit script.
- #
- # Reference:
- #
- # "A Tutorial Introduction to the UNIX Text Editor", Brian W. Kernighan.
- # AT&T Bell Laboratories.
- #
- ############################################################################
-
- procedure main()
- local line, image, object, char
- while line := read() do {
- line ? {
- char := move(1) | {error(line); next}
- image := tab(find(char)) | {error(line); next}
- move(1)
- object := tab(find(char)) | {error(line); next}
- }
- write("g/",xform(image),"/s//",xform(object),"/g")
- }
- write("w\nq")
- end
-
- # process characters that have meaning to ed
- #
- procedure insert()
- static special
- initial special := '\\/^&*[.$'
- suspend {
- tab(upto(special)) ||
- "\\" ||
- move(1) ||
- (insert() | tab(0))
- }
- end
-
- procedure error(line)
- write(&errout,"*** erroneous input: ",line)
- end
-
- # transform line
- #
- procedure xform(line)
- line ?:= insert()
- return line
- end
-