js@UW-JUNE.ARPA (Joe Meadows) (06/26/86)
Well, today someone asked me a simple question, how to
make a foreign command into a real command. The answer follows:
DEFINE VERB SD ! Set default type of program
IMAGE UTILITY:SD, CLIFLAGS(FOREIGN)
Well, that works fine, but VERB wouldn't parse it correctly due to an
invalid assumption on my part. I had thought that the Cliflags option
only pertained to CLIROUTINEs. Not IMAGEs.. Oh well, a mistake on my
part. The following replacement for COMMAND.MAR fixes this problem.
Also, some people apparently haven't got fortran compilers,
so, I was wondering if anyone happened to rewrite VERB.FOR into some other
language, like Macro? (everyones got that one...).
Another also: I wrote a program to modify file attributes,
(Via ATR subfunction in a QIO call). Anybody want it? It's set up as a
command and can twiddle just about any bit in the header that you want.
If theres enough interest I'll post it. It's uses are many, for one, you
can use it to the equivalent of SET FILE/DIRECTORY (one of those left out
functions), or, perhaps (as I often use it) to fix a backup save set after
sending it through Kermit. (I never remember to set the block size beforehand)
ANyhow, if you do, ask for FILE, it's BASIC and MACRO (It's really not too
horrible, the BASIC is minimal, and, shoot, where I work it is the
only language available to me (THAT is horrible).
*****cut somewhere around here... In, this is a great spot -> . <- *****
.title print command block
; VERB Version 1.0 June 1st, 1985
; Written by Joe Meadows Jr., with thanks to the
; Fred Hutchinson Cancer Research Center for kindly
; allowing me to use their computing resources.
;
; If you have any questions, comments, ideas, or
; whatever, feel free to contact me via US Mail :
; Joe Meadows Jr.
; 4841 268th Ave. N.E.
; Redmond Wa. 98052
; or via phone : (206) 827-7296
.library 'clexlib'
.entry clex_print_command,^m<r2,r3,r4,r5,r6,r7>
; 4(ap) = address of command block
movl 4(ap),r6
5$: bitw #cmd_m_parms,cmd_w_flags(r6)
beql 10$
tstl cmd_l_parms(r6)
beql 10$
addl3 clex_table,cmd_l_parms(r6),-(sp)
calls #1,clex_evaluate_entity
10$: bitw #cmd_m_quals,cmd_w_flags(r6)
beql 20$
tstl cmd_l_quals(r6)
beql 20$
addl3 clex_table,cmd_l_quals(r6),-(sp)
calls #1,clex_evaluate_entity
20$: movzwl cmd_w_name(r6),r7
addl r6,r7
case cmd_b_subtype(r6),type=b,limit=#1,<-
_verb,-
_syntax>
movl #0,r0 ; invalid
ret
_verb: add_string <'define verb '>
movzbl (r7),r2 ; save size of entire thing
movzbl 1(r7),r3 ; save size of verb name
_verb1: incl r7 ; point to first ascic
add_ascic_trunc r7,r3
decl r2 ; subtract off extra byte for count byte
movzbl (r7),r4 ; assume verb bigger than synonym
cmpb (r7),r3 ; is synonym bigger than verb?
bleq _verb2
movzbl r3,r4 ; if so it got truncated by CDU
add_string <' !! warning, synonym truncated'>
_verb2: calls #0,g^put_output
subb r4,r2 ; subtract off printed portion.
beql _verb3
addl r4,r7
tstb 1(r7)
beql _verb1 ; if zero length string , skip to next.
add_string <' synonym '>
brb _verb1
_verb3: brb _continue
_syntax:
add_string <'define syntax '>
add_ascic r7
_continue:
calls #0,put_output
movzwl cmd_w_image(r6),r7
addl r6,r7
clrl _clex_handler_flag
case cmd_b_handler(r6),type=b,limit=#0,<-
_print_prefix,- ; no handler
_handler_cli,-
_handler_user,-
_handler_image,-
_handler_same>
movl #0,r0 ; invalid handler
ret
_handler_cli:
add_string <' cliroutine '>
add_ascic r7
brw _print_cliflags
_handler_user:
add_string <' routine '>
add_ascic r7
brw _print_cliflags
_handler_image:
add_string <' image '>
add_ascic r7
brw _print_cliflags
_handler_same:
movl #1,_clex_handler_flag
brw _print_cliflags
_print_cliflags:
bitw #^x1F,cmd_w_flags(r6) ; any cliflags?
bneq _cliflags_cli1
calls #0,g^put_output
brw _print_prefix
_cliflags_cli1:
clrq r4
add_string <' , cliflags ('>
moval table_cli_flags,r3
_cliflags_cli2:
bbc r4,cmd_w_flags(r6),_cliflags_cli4
tstl r5
beql _cliflags_cli3
add_string <','>
_cliflags_cli3:
incl r5
add_ascic (r3)[r4]
_cliflags_cli4:
aobleq #4,r4,_cliflags_cli2
add_string <')'>
calls #0,g^put_output
_print_prefix:
movzwl cmd_w_prefix(r6),r7
beql _print_parms
addl r6,r7
add_string <' prefix '>
add_ascic r7
calls #0,g^put_output
_print_parms:
bitw #cmd_m_parms,cmd_w_flags(r6)
beql _print_quals
tstl cmd_l_parms(r6)
bneq _print_parms_1
add_string <' noparameters'>
calls #0,g^put_output
brb _print_quals
_print_parms_1:
addl3 clex_table,cmd_l_parms(r6),-(sp)
calls #1,clex_print_entity
_print_quals:
bitw #cmd_m_quals,cmd_w_flags(r6)
beql _print_disallows
tstl cmd_l_quals(r6)
bneq _print_quals_1
add_string <' noqualifiers'>
calls #0,g^put_output
brb _print_disallows
_print_quals_1:
addl3 clex_table,cmd_l_quals(r6),-(sp)
calls #1,clex_print_entity
_print_disallows:
bitw #cmd_m_disallows,cmd_w_flags(r6)
beql _print_outputs
tstl cmd_l_disallow(r6)
beql _print_outputs
add_string <' disallow '>
pushl r6
addl3 clex_table,cmd_l_disallow(r6),-(sp)
calls #2,clex_print_disallows
calls #0,g^put_output
brb _print_outputs
_print_outputs:
clrl r5
movzwl cmd_w_outputs(r6),r3 ; BRO outputs list
beql _end_of_command
addl r6,r3 ; point to ascic of outputs
movzbl (r3),r4 ; number of outputs
beql _end_of_command ; see if there is indeed any outputs
incl r3
add_string <' outputs('>
brb _print_continue
_print_out_loop:
add_string <','>
_print_continue:
movb (r3)[r5],r2
blss _print_out_parm
addl3 clex_table,cmd_l_quals(r6),r7 ; r7 is address of first entity
brb _get_entity_loop
_print_out_parm:
mnegb r2,r2
addl3 clex_table,cmd_l_parms(r6),r7
_get_entity_loop:
decb r2
beql _print_this_output
addl3 clex_table,ent_l_next(r7),r7
brb _get_entity_loop
_print_this_output:
movzwl ent_w_label(r7),r2
addl r7,r2
add_ascic r2
aoblss r4,r5,_print_out_loop
add_string <')'>
calls #0,g^put_output
_end_of_command:
ret
.psect string_table rd,nowrt,noexe
table_cli_flags:
string <'abbreviate'>
string <'nostatus'>
string <'foreign'>
string <'immediate'>
string <'mcrparse'>
.end