Text Executive Programming Language
Encyclopedia
In 1979, Honeywell Information Systems announced a new programming language for their time-sharing
service named TEX, an acronym for the Text Executive processor. TEX was a first generation scripting language, developed around the time of AWK and used by Honeywell initially as an in-house system test automation tool.
TEX extended the Honeywell Time-Sharing service (TSS) line editor with programmable capabilities which allowed the user greater latitude in developing ease-of-use editing extensions as well as write scripts to automate many other time-sharing tasks formerly done by more complex TSS FORTRAN programs.
.
TEX programs are a collection of TSS line editing commands, TSS session commands and TEX statements. TEX variables could be inserted into TSS commands and TSS line editor commands via the TEX variable substitution feature. TEX programs were primarily designed to extend the line editor system. Consequently, TEX had no concept of file input/output relying instead on applying line edit commands to the working file and saving as needed.
The key developers of TEX at Honeywell were Eric Clamons and Richard Keys with Robert Bemer, famous as the father of ASCII and grandfather of COBOL, acting in an advisory capacity.
TEX should not be confused with TeX
a typesetting markup language invented by Donald Knuth
.
The American Mathematical Society
has also claimed a trademark
for TeX, which was rejected, because at the time this was tried (early 1980s), “TEX” (all caps) was registered by Honeywell
for the “Text EXecutive” text processing system.
point variables, arrays or other datatypes common in current scripting languages did not exist in a TEX environment.
All variables were stored in a single global variable pool which users had to manage in order to avoid
variable naming conflicts. There were no variable scoping capabilities in TEX. Variable names were limited to 40 characters.
TEX provided several internal read-only registers called star functions or star variables which changed state when certain TEX string parsing operations were executed. Star functions provided a means to get the current date and time, resultant strings from a split or scan string parsing operations, TEX internal call level and TSS session information.
The maximum length of a string value was 240 ASCII characters. This includes intermediate results when evaluating a TEX expression. Numeric string values are limited to 62 digits in the string including the (-) for negative numbers. Numeric values are also normalized where leading zeros are stripped from the string representation.
Some examples of variable usage:
_ we can use quotes or other characters as delimiters as long as the string doesn't contain them
a="hello"
_ here we use the / character as a delimiter (a common practice especially if the string has a " char)
b=/world/
_ here we are concatenating strings together via the comma concatenation operator
c=a,/ /,b
_ the out statement will print "hello world" to the terminal without the quotes
out:c
_ here we use a TEX variable in a line editing command to find a line starting with "hello world"
hello="hello world"
f:hello
_ here we are replacing the "hello" string with the "hello world" string
rs:a:c
When constructing a TEX expression, all spaces must be compressed out except for string literals. In general,spaces
delimit TEX statements.
_ in the "d=" statement there are no spaces between the commas or the variables
a="hello" b=" " c="world" d=a,b,c out:d
_ the space separates the 'if' from the expression and the expression from the next TEX command to conditionally execute
if a:eqs:"hello" out:a
with up to 16 levels of parentheses.
Some examples are:
a=1
b=-2
c=3*(a-b)/(2*2+(4+1))
They were most often used within the context of an IF control statement.
A list of available numeric boolean operators in TEX are:
A list of available string boolean operators are:
String boolean operators are affected by the TEX CASE mode. Under CASE mode, strings such as 'ABC' and 'abc' were considered equal (TEX converted 'ABC' to 'abc' prior to the comparison). Under NOCASE mode, the 'abc' string would be considered greater than the 'ABC' string based on the ASCII
code point value for 'a' being a larger value than the 'A' ASCII code point value.
The boolean NOT operator was represented by the circumflex character (^).
Some examples of boolean operators in action:
if name:eqs:"luke" out:"May the force be with you!"
if ^age:gtn:500 out:"Heh, you can't be Yoda!"
TEX did not provide and or or connecters to make more complex boolean expressions. Instead, programmers had to use nested if statements for and connections and a block of if...do something statements to handle or connections:
_ an example of an and construct
if a:eqs:'a' if b:eqs:'b' goto !its_true
goto !its_false
_ an example of an or construct
if a:eqs:'a' goto !its_true
if b:eqs:'b' goto !its_true
if c:eqs:'c' goto !its_true
goto !its_false
!its_true out:"Its true!" goto !next_block
!its_false out:"Its false!" goto !next_block
!next_block
...do something...
a="hello"," "," world"
TEX provided several string splitting operators:
Some string splitting examples:
a="hello world"
b=a']5
c=a]'5
out:"It's a strange new ",c," but ",b," anyways!"
TEX provided several string scanning/parsing operators:
Some string scanning/parsing examples:
a="hello world"
b=a'>" "
out:b
The mypgm file:
!hello
out:"hello world"
return
!hello2
out:"hello world again"
exit
(end-of-file marker)
Calling by label example:
call /mycat/mypgm!hello
In the above example, TEX would process the /mycat/mypgm file searching for the !hello label(*). TEX would continue processing the file until a return statement or exit statement was executed or end of file was reached.
Goto by label example:
goto /mycat/mypgm!hello2
In the next example, TEX would process the /mycat/mypgm file searching for the !hello2 label(*). TEX would continue processing until an exit statement or end of file was reached. An error would be thrown if a return statement was executed and there were no CALLs active.
(*) TEX did not check for duplicate labels in the same file, consequently execution was unpredictable if present.
xx=/out:"Hello World"/
subs ?
?xx?
nosubs
?xx?
In the above example, the xx variable contains a TEX output statement as its value. The subs command specifies that (?) is the substitution character for all future statements of the program. Upon processing the first ?xx? line, TEX will substitute in the out:"Hello World" command for ?xx? and then execute the resultant statement. The nosubs command turns off substitutions for subsequent statements and so TEX issues an error when it tries to execute the second ?xx? line.
As an example:
__a
out:__a
TEX programs were primarily designed to extend the line editor system. Consequently, TEX had no concept of file input/output relying instead on making changes to the working file via line edit commands and saving as needed.
However, TEX did provide terminal-oriented input/output commands: out -- print a message
A simple example using in and out:
in:"What is your name?"
out:"Hi ",*in
A list of star variables follows: *cl - the current line of the current file being edited
*lcl - the length of the *cl value
*clvl - current depth of calls
*date - current date in the form of YY-MM-DD
*eof - T if positioned after the last line of the current file or when there is no current file
*in - contains the last response to an in or int TEX command execution
*lin - length of *in
*left or *l - left string from scan or split command execution
*lleft or *ll - length of *left
*middle or *m - middle string from scan or split command execution
*lmiddle or *lm - length of *middle'
*right or *r - right string from scan or split command execution
*lright or *lr - length of *right
*null - represents the null string
*random - contains a randomly selected digit from 0 to 9
*rmdr - remainder of the last division operation
*snumb - system number of the last batch job run
*svmd - TEX commands to restore the TEX modes at the time of the last interfile call or goto
*sw00 to *sw35 - examines the TSS 36-bit switch word with 1 bit returning a T value and a 0 bit returning a F
*time - current time in hh:mm:ss always to the nearest second
*userid - current userid
*soh - start of header
*stx - start of text
*etx - end of text
*eot - end of transmission
*enq - enquiry
*ack - acknowledge
*bel - bell
*bs - backspace
*ht - horizontal tab
*lf - line feed
*vt - vertical tab
*ff - form feed
*cr - carriage return
*so - shift out
*si - shift in
*del - delete
*dle - data link escape
*dc1 - device control 1
*dc2 - device control 2
*dc3 - device control 3
*dc4 - device control 4 (stop)
*nak - negative acknowledge
*syn - synchronous idle
*etb - end of transmission block
*can - cancel
*em - end of medium
*sub - substitute
*esc - escape
*fs - field separator
*gs - group separator
*rs - record separator
*us - unit separator
TEX commands
TEX mode commands
TSS system commands
verb:;;:
The could contain a range as in F:/hello/,/world/ to find all lines that start with the string "hello" and contain the string "world" too.
TEX provided standard line-based file editing commands:
F: move forward through the current file line by line
B: move backward through the current file line by line
A: append after the current line
I: insert before the current line
R: replace the current with the expression provided
D: delete the current line
copy: copy the current line
cut: copy and delete the current line
paste: paste what was cut or copied before the current line
Each command could be modified with a numeric repeat value or with an asterisk (*): P;*: print all lines from the current position to the end of file
F;999: move forward 999 lines from the current position
F;*: move to the end of file
B;999: move backward 999 lines from the current position
B;*: move to the first line of the file
Commands can be further modified with a line matching string or expression: B:/xxx/;999 move backward to the line beginning with 999th occurrence of /xxx/
I:/xxx/;999:/yyy/ insert line yyy before the next 999 lines beginning with /xxx/
R:/xxx/;999;/yyy/ replace the next 999 lines beginning with /xxx/ with the line /yyy/
D:/xxx/;999 delete the next 999 lines beginning with /xxx/
For string mode, an S was added. Whenever /xxx/ was found within the line then the editwas applied: IS:/xxx/;999:/yyy/ insert the string /yyy/ before the next 999 occurrences of /xxx/
RS:/xxx/;999:/yyy/ replace the next 999 occurrences of the string /xxx/ with /yyy/
DS:/xxx/;999 delete the next 999 occurrences of the string /xxx/
Lastly, the commands can be further modified with V to turn on verify mode and with O to specify nth occurrence string mode:
There are a few other lesser used editing commands:
In all edit command formats, the /xxx/ or /yyy/ or 999 could be replaced with a TEX variable.In addition, the 999 value could be replaced with an asterisk (*) to denote all occurrences.
!ELIM_DUPS a=*cl f;1
_
!NEXT_LINE if *eof out:"task complete" return
b=*cl if a:eqs:b d goto !NEXT_LINE
a=b f;1 goto !NEXT_LINE
TEX commands:!
Time-sharing
Time-sharing is the sharing of a computing resource among many users by means of multiprogramming and multi-tasking. Its introduction in the 1960s, and emergence as the prominent model of computing in the 1970s, represents a major technological shift in the history of computing.By allowing a large...
service named TEX, an acronym for the Text Executive processor. TEX was a first generation scripting language, developed around the time of AWK and used by Honeywell initially as an in-house system test automation tool.
TEX extended the Honeywell Time-Sharing service (TSS) line editor with programmable capabilities which allowed the user greater latitude in developing ease-of-use editing extensions as well as write scripts to automate many other time-sharing tasks formerly done by more complex TSS FORTRAN programs.
Overview
TEX was a subsystem of Honeywell TSS. Users would enter the TSS command 'tex' to change to a TEX session mode of operation. TEX expressions could be entered directly on the command line or run from script file via the TEX command CALLTEX programs are a collection of TSS line editing commands, TSS session commands and TEX statements. TEX variables could be inserted into TSS commands and TSS line editor commands via the TEX variable substitution feature. TEX programs were primarily designed to extend the line editor system. Consequently, TEX had no concept of file input/output relying instead on applying line edit commands to the working file and saving as needed.
The key developers of TEX at Honeywell were Eric Clamons and Richard Keys with Robert Bemer, famous as the father of ASCII and grandfather of COBOL, acting in an advisory capacity.
TEX should not be confused with TeX
TeX
TeX is a typesetting system designed and mostly written by Donald Knuth and released in 1978. Within the typesetting system, its name is formatted as ....
a typesetting markup language invented by Donald Knuth
Donald Knuth
Donald Ervin Knuth is a computer scientist and Professor Emeritus at Stanford University.He is the author of the seminal multi-volume work The Art of Computer Programming. Knuth has been called the "father" of the analysis of algorithms...
.
The American Mathematical Society
American Mathematical Society
The American Mathematical Society is an association of professional mathematicians dedicated to the interests of mathematical research and scholarship, which it does with various publications and conferences as well as annual monetary awards and prizes to mathematicians.The society is one of the...
has also claimed a trademark
Trademark
A trademark, trade mark, or trade-mark is a distinctive sign or indicator used by an individual, business organization, or other legal entity to identify that the products or services to consumers with which the trademark appears originate from a unique source, and to distinguish its products or...
for TeX, which was rejected, because at the time this was tried (early 1980s), “TEX” (all caps) was registered by Honeywell
Honeywell
Honeywell International, Inc. is a major conglomerate company that produces a variety of consumer products, engineering services, and aerospace systems for a wide variety of customers, from private consumers to major corporations and governments....
for the “Text EXecutive” text processing system.
Variables
All variables were stored as strings and converted to integer numeric values when required. Floatingpoint variables, arrays or other datatypes common in current scripting languages did not exist in a TEX environment.
All variables were stored in a single global variable pool which users had to manage in order to avoid
variable naming conflicts. There were no variable scoping capabilities in TEX. Variable names were limited to 40 characters.
TEX provided several internal read-only registers called star functions or star variables which changed state when certain TEX string parsing operations were executed. Star functions provided a means to get the current date and time, resultant strings from a split or scan string parsing operations, TEX internal call level and TSS session information.
The maximum length of a string value was 240 ASCII characters. This includes intermediate results when evaluating a TEX expression. Numeric string values are limited to 62 digits in the string including the (-) for negative numbers. Numeric values are also normalized where leading zeros are stripped from the string representation.
Some examples of variable usage:
_ we can use quotes or other characters as delimiters as long as the string doesn't contain them
a="hello"
_ here we use the / character as a delimiter (a common practice especially if the string has a " char)
b=/world/
_ here we are concatenating strings together via the comma concatenation operator
c=a,/ /,b
_ the out statement will print "hello world" to the terminal without the quotes
out:c
_ here we use a TEX variable in a line editing command to find a line starting with "hello world"
hello="hello world"
f:hello
_ here we are replacing the "hello" string with the "hello world" string
rs:a:c
Operators
TEX has three types of operators:- arithmetic
- boolean
- string
When constructing a TEX expression, all spaces must be compressed out except for string literals. In general,spaces
delimit TEX statements.
_ in the "d=" statement there are no spaces between the commas or the variables
a="hello" b=" " c="world" d=a,b,c out:d
_ the space separates the 'if' from the expression and the expression from the next TEX command to conditionally execute
if a:eqs:"hello" out:a
Arithmetic
TEX supports only basic integer arithmetic operations:- unary sign number prefix (+/-)
- addition (+),
- subtraction (-),
- multiplication (*) and
- division (/)
with up to 16 levels of parentheses.
Some examples are:
a=1
b=-2
c=3*(a-b)/(2*2+(4+1))
Boolean operators
TEX boolean operators come in two flavors for:- numeric comparisons
- string comparisons
They were most often used within the context of an IF control statement.
A list of available numeric boolean operators in TEX are:
- :eq: or :eqn: returns t for true if two values are numerically equal
- :ge: or :gen: returns t for true if first value is numerically equal to or greater than second value
- :le: or :len: returns t for true if first value is numerically equal to or lesser than second value
- :gt: or :gtn: returns t for true if first value is numerically greater than second value
- :lt: or :ltn: returns t for true if first value is numerically lesser than second value
- :ne: or :nen: returns t for true if first value is not numerically equal to the second value
A list of available string boolean operators are:
- :eqs: returns t for true if two strings values are identical in characters, case and length
- :ges: returns t for true if first string is greater than or equal to the second string in characters case and length
- :les: returns t for true if first string is less than or equal to the second string in characters case and length
- :gts: returns t for true if first string is greater than or equal to the second string in characters case and length
- :lts: returns t for true if first string is less than to the second string in characters case and length
- :nes: returns t for true if first string is NOT equal to the second string in characters case and length
String boolean operators are affected by the TEX CASE mode. Under CASE mode, strings such as 'ABC' and 'abc' were considered equal (TEX converted 'ABC' to 'abc' prior to the comparison). Under NOCASE mode, the 'abc' string would be considered greater than the 'ABC' string based on the ASCII
ASCII
The American Standard Code for Information Interchange is a character-encoding scheme based on the ordering of the English alphabet. ASCII codes represent text in computers, communications equipment, and other devices that use text...
code point value for 'a' being a larger value than the 'A' ASCII code point value.
The boolean NOT operator was represented by the circumflex character (^).
Some examples of boolean operators in action:
if name:eqs:"luke" out:"May the force be with you!"
if ^age:gtn:500 out:"Heh, you can't be Yoda!"
TEX did not provide and or or connecters to make more complex boolean expressions. Instead, programmers had to use nested if statements for and connections and a block of if...do something statements to handle or connections:
_ an example of an and construct
if a:eqs:'a' if b:eqs:'b' goto !its_true
goto !its_false
_ an example of an or construct
if a:eqs:'a' goto !its_true
if b:eqs:'b' goto !its_true
if c:eqs:'c' goto !its_true
goto !its_false
!its_true out:"Its true!" goto !next_block
!its_false out:"Its false!" goto !next_block
!next_block
...do something...
String operators
String concatenation in TEX was provided by the comma operator:a="hello"," "," world"
TEX provided several string splitting operators:
- splitting a string from the left and saving the left side ('])
- splitting a string from the left and saving the right side (]')
- splitting a string from the right and saving the left side ('[)
- splitting a string from the right and saving the right side ([')
Some string splitting examples:
a="hello world"
b=a']5
c=a]'5
out:"It's a strange new ",c," but ",b," anyways!"
TEX provided several string scanning/parsing operators:
- scanning a string from the left for a given substring and saving the left side ('>)
- scanning a string from the left for a given substring and saving the right side (>')
- scanning a string from the right for a given substring and saving the left side ('<)
- scanning a string from the right for a given substring and saving the right side (<')
Some string scanning/parsing examples:
a="hello world"
b=a'>" "
out:b
Labels
All TEX statement labels were prefixed with a (!). Statement labels were in general ignored unless referenced by a goto or call statement. One notable feature of TEX was the ability to call or goto labels in other files. Coupled with the TEX SUBS mode meant that TEX could create new scripts via line editing, save and then call or goto labels in these scripts dynamically.The mypgm file:
!hello
out:"hello world"
return
!hello2
out:"hello world again"
exit
(end-of-file marker)
Calling by label example:
call /mycat/mypgm!hello
In the above example, TEX would process the /mycat/mypgm file searching for the !hello label(*). TEX would continue processing the file until a return statement or exit statement was executed or end of file was reached.
Goto by label example:
goto /mycat/mypgm!hello2
In the next example, TEX would process the /mycat/mypgm file searching for the !hello2 label(*). TEX would continue processing until an exit statement or end of file was reached. An error would be thrown if a return statement was executed and there were no CALLs active.
(*) TEX did not check for duplicate labels in the same file, consequently execution was unpredictable if present.
Substitutions
TEX provides the SUBS and NOSUBS commands to activate or deactivate variable substitution for subsequent TEX statements or TSS commands.xx=/out:"Hello World"/
subs ?
?xx?
nosubs
?xx?
In the above example, the xx variable contains a TEX output statement as its value. The subs command specifies that (?) is the substitution character for all future statements of the program. Upon processing the first ?xx? line, TEX will substitute in the out:"Hello World" command for ?xx? and then execute the resultant statement. The nosubs command turns off substitutions for subsequent statements and so TEX issues an error when it tries to execute the second ?xx? line.
Indirections
In addition to variable substitution, TEX supported variable indirection. Variables prefixed with the underscore character (_) were considered to contain a variable name as their contents and so TEX would use indirection to get the value. TEX limited indirection to 64 levels to avoid possible looping.As an example:
__a
_b
c and so the command became out:c.out:__a
Input/output
Honeywell Timesharing sessions had a concept of the working file. To edit an existing file, you would first make it the working file via the old command. To create a new file, you would first create it via the new command. Once changes were complete, you would either save (for new files) or resave the working file. Basically only one file could be open for editing at a time.TEX programs were primarily designed to extend the line editor system. Consequently, TEX had no concept of file input/output relying instead on making changes to the working file via line edit commands and saving as needed.
However, TEX did provide terminal-oriented input/output commands:
A simple example using in and out:
in:"What is your name?"
out:"Hi ",*in
Star variables and functions
TEX provided star variables as a means to access results or side-effects of TEX system functions or to represent ASCII terminal codes.A list of star variables follows:
Terminal codes
Terminal codes were mapped into star functions for easy reference in TEX programs.Commands
TEX was built on top of the TSS line editor as such line editor commands could be used within a TEX program. TEX programs may have:Edit Commands
The general command format was:verb:
The
Each command could be modified with a numeric repeat value or with an asterisk (*):
Commands can be further modified with a line matching string or expression:
For string mode, an S was added. Whenever /xxx/ was found within the line then the editwas applied:
Lastly, the commands can be further modified with V to turn on verify mode and with O to specify nth occurrence string mode:
There are a few other lesser used editing commands:
- mark - to include files within files when the .mark
statement is found in the current or subsequently included files (recursive operation) - befl - insert before the current line (normally the "A" command was used to insert after the current line)
- trul
- truncate left most columns of the current file - trur
- truncate right most columns of the current file
In all edit command formats, the /xxx/ or /yyy/ or 999 could be replaced with a TEX variable.In addition, the 999 value could be replaced with an asterisk (*) to denote all occurrences.
TEX commands
TEX did not provide commands for numeric or conditional looping or switch cases as is common in modern scripting languages. These had to be constructed using if, labels and goto commands. As an example to eliminate duplicate lines from a file, we would use:!ELIM_DUPS a=*cl f;1
_
!NEXT_LINE if *eof out:"task complete" return
b=*cl if a:eqs:b d goto !NEXT_LINE
a=b f;1 goto !NEXT_LINE
TEX commands: