$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.2-007 22-FEB-1990 $! On 5-APR-1991 14:23:33.92 By user CASTILLO $! $! This VMS_SHARE Written by: $! Andy Harper, Kings College London UK $! $! Acknowledgements to: $! James Gray - Original VMS_SHARE $! Michael Bednarek - Original Concept and implementation $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. BRDCST.C;1 $! 2. CTRAP.C;1 $! 3. CTRAP.COM;1 $! 4. CTRAP.H;1 $! 5. CTRAP.HLP;1 $! 6. MAKECTRAP.COM;1 $! 7. MBX.C;1 $! 8. OPTIONS.C;1 $! 9. QUEUE.C;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if f$trnlnm("SHARE_LOG") then $ w = "!" $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $UNPACK: SUBROUTINE ! P1=filename, P2=checksum $ if f$search(P1) .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped." $ delete 'f'* $ exit $file_absent: $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'." $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped." $ delete 'f'* $ exit $dirok: $ w "-I-PROCESS, Processing file ''P1'." $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1' PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b)); LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION( BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1); IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE; MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1; ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")= 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF"; POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r); ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1; COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE, "output_file"));ENDPROCEDURE;Unpacker;QUIT; $ delete/nolog 'f'* $ CHECKSUM 'P1' $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT $ e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ ENDSUBROUTINE $START: $ create 'f' X/* `09Brdcst.C v1.02`09`09Spring 1991 X X`09MODULE NAME: Brdcst.C X`09AUTHOR: Belgarion (castillo@nauvax.ucc.nau.edu) X`09LAST REVISED: March 11, 1991 X`09 X X `09This file is for use with Ctrap.C It is the module containing all X `09functions relating to broadcast trapping. X X `09The buffer containing the broadcast messages is implemented as a`20 X`09circular queue ADT. The usable functions to manipulate X `09brdcast_buf (the queue) are: push, pop, setqueue. When the`09number`20 X`09of broadcast messages received becomes larger than the LIMIT, older`20 X`09messages are overwritten by the newer ones instead of just`20 X`09floating off into limbo. X X*/ X X#include "ctrap.h" X X/*----------------broadcast handling module-----------------------------*/ X Xvoid setup_broad_hand(int pbid) X `09/* Enable the trapping of broadcast messages that would otherwise `20 X screw up the screen. `20 X pbid is the pasteboard id, brdtrap is the AST function called`20 X when a broadcast message is received. The last pbid is the`20 X argument passed to brdtrap. X `09*/ X`7B X `09smg$set_broadcast_trapping(&pbid,brd_trap, pbid); X`09fprintf(stdout, "Broadcast trapping enabled.\n"); X`7D/* setup_broad_hand */ X X Xvoid brd_trap(int pbid) X `09/* This AST routine is called whenever a broadcast message comes to the V`20 X terminal. E.G. newmail, phone calls, bitnet noise and operators that` V20 X want to get your attention. The broadcast message(s) are retrieved ` V20 X and then displayed according to the flags that have been sent. X `09*/ X`7B X short int msgl; X int status; X msg_type msg; X msg.length = STRLIM; /* build a string descriptor for V */ X msg.dtype = 14; /* the broadcast message */ X msg.class = 1; X msg.ptr = (char *) malloc(STRLIM); X status = 1; /* get and display the message(s) */ X while (status == 1) `7B X status = smg$get_broadcast_message(&pbid,&msg,&msgl); X if (status == 1)`20 X`09`09handle_msg(brdcst_buf, msg); X `7D /* while */ X free(msg.ptr); X`7D /* brd_trap */ X X Xvoid handle_msg(queue *q, msg_type msg) X`09/* handle_msg is the main message handler. It uses the various X`09 flags to decide what to do with the message. In this early stage, X`09 flags are not worried about at all. X`09*/ X`7B`09 `20 X`09msg.ptr = strtrim(msg.ptr); X`09push(q, msg); X`09notify_user(); X`7D /* handle_msg */ X X Xvoid notify_user(void) X`09/* notify_user places the message Msgs(s) pending on the bottom X`09 of their screen. X`09*/ X`7B X`09fprintf(stdout,"`1B7`1B`5B25;0H`1B`5B1m`1B`5B5mMsgs(s) pending.`1B`5B0m`1 VB8"); X`7D /* notify_user */ X Xvoid dump_msgs() X`09/* this dumps the messages contained in the queue to the screen. X`09*/ X`7B X`09msg_type msg; X X`09while (pop(brdcst_buf, &msg)) `7B X`09`09fprintf(stdout, "%s\n",msg.ptr); X`09`7D /* while */ X`09fprintf(stdout,"\nNo more messages.\n"); X`09fprintf(stdout,"`1B7`1B`5B25;0H `1B8"); X`7D /* dump_msgs */ X`09 Xchar *strtrim(char *s) X`7B X int i=0; X X while (s`5Bi`5D != 0) ++i; X if (i == 0) X return s; X --i; X while (s`5Bi`5D == '\n' `7C`7C s`5Bi`5D == ' ' `7C`7C s`5Bi`5D == '\t') -- Vi; X s`5B++i`5D = 0; X X return s; `20 X`7D /* strtrim */ X X /* --------------- end of broadcast module ----------------------*/ $ CALL UNPACK BRDCST.C;1 1782911098 $ create 'f' X/* `09CTrap.C v1.02`09`09Spring 1991 X X`09MODULE NAME: CTRAP.C`09the main module :) X`09HEADER: CTRAP.H X`09SUBMODULES: BRDCST.C X QUEUE.C X MBX.C X`09SHAREABLE IMAGE: SYS$LIBRARY:VAXCRTL/SHARE X X`09AUTHOR: Belgarion (castillo@nauvax.ucc.nau.edu) X`09LAST REVISED: March 12, 1991 X X`09Inspired by, and in consultation with`20 X`09`09Tony McCracken (ACM@nauvax.ucc.nau.edu) & X`09`09Sir Gareth /`7E (mshimniok@xray1.chem.arizona.edu) X`09 X`09Notice of Copyright: X`09`09 X`09This program is Copyright(c) 1991 by Ulysses Castillo,`20 X`09Tony McCracken, and Michael E. Shimniok. All rights reserved. X`09This program may be copied as long as this notice of copyright and X`09disclaimer is included. If this program is posted in any form to`20 X`09any public forum, it must contain this notice of copyright,`20 X`09disclaimer, and all required files. X X`09Disclaimer: X`09 X`09This program was tested on a VAX 3610 running VMS 5.3-1. I X`09do not make any claim that this program will work as stated. X`09I don't guarantee that this program won't crash your VAX. X`09All use is at the complete risk of the user. X X`09Purpose: X X`09This program is used to trap incoming broadcast messages. X`09Normally, when a broadcast message is received (such as mail, X`09bitnet messages, PHONE, TALK, etc....) it is blasted all over the X`09screen. This is rather annoying. If you are in an editor, it often X`09either screws up your program nicely, or it just disappears altogether. X`09Ctrap provides a good way to trap these incoming broadcast messages and X`09store them until you are ready for them. X X`09Usage: X X`09To use this program, execute the ctrap.com file in the following`20 X`09manner: X X`09CTRAP ON`09`09-- turn broadcast trapping on. X`09CTRAP DUMP`09`09-- Display the stored messages to the screen. X`09CTRAP OFF`09`09-- turn broadcast trapping off. X X`09Methodology: X`09 X`09This program was meant to be executed through a comfile. This comfile X`09spawn/nowaits this program. The program goes through an early`20 X`09initialization and then is ready to trap the incoming messages. X`09Once a broadcast message is received, it is stored in a circular`20 X`09queue and the message "Msg(s) pending." is printed at row 25 of X`09the terminal. After a suitable amount of time, the broadcast`20 X`09messages can then be displayed on the screen by again calling the X`09comfile (CTRAP DUMP). The comfile communicates to this program`20 X`09through the use of a temporary mailbox. The mailbox is queued X`09for read during initialization. Once a read is obtained, it`20 X`09processes the command. If an invalid command is read, it just X`09goes on it's merry way doing absolutely nothing. To stop the program, X`09a command is issued by the comfile (CTRAP QUIT). X X`09The program spends most of its time in hibernation. It only`20 X`09awakes during one of the following: X`09`09a) a broadcast message is received. X`09`09b) a read to the terminal mailbox is received. X X`09This reduces the CPU time used to very little since no CPU is used X`09when a process is hibernating. X X`09Compilation: X`09`09Execute the make file that comes with this a la`20 X`09`09@MAKECTRAP.COM X`09`09In the absence of this comfile the program may be compiled: X`09`09cc CTRAP.C X`09`09cc BRDCST.C X`09`09cc MBX.C X`09 cc QUEUE.C X`09`09link CTRAP,BRDCST,MBX,QUEUE, sys$input/opt X`09`09sys4library:vaxcrtl/share X X`09Future Expansions: X X`09Expansions immediately in the future will be: X X`09-r `09--- replace.`20 X`09`09an input file will be read on initialization. The input file X`09`09will be of the form: X`09`09`09NAME = EQUIVALENT. X X`09`09The result: when a broadcast message is received, the input file X`09`09will be searched. If the text of the broadcast message matches X`09`09any NAME entry, the text of the broadcast message will be altered X`09`09to replace NAME with equivalent. The result is something like: X`09`09 X`09`09original: X`09`09`09S1606266 is phoning you. X X`09`09with -r: X`09`09`09Mike is phoning you. X X`09`09-x --- exclusive. X X`09`09This switch will read an input file of the same format as above. X`09`09When a broadcast message is received, the file is checked for`20 X`09`09matches. If a match occurs, the broadcast message is displayed. X`09`09Otherwise, the broadcast message is stored in the queue with the X`09`09other broadcast messages. This results in a selective display X`09`09of messages (much like call screening on an answering machine).`20 X`09 X`09`09Bugs: X`09`09 X`09`09As of this writing, there are no known bugs. There is one`20 X`09`09side effect. While this program is running, a person may not X`09`09spawn. This is because a special mailbox is used to trap the X`09`09incoming messages. This is VMS' fault. It is NOT mine, that's X`09`09just the way it is. Bug reports may be sent to: X`09`09castillo@nauvax.ucc.nau.edu (internet) or X`09`09castillo@nauvax (bitnet) X X`09 X*/ X X#include "ctrap.h" X Xint main(int argc, char *argv`5B`5D) X`7B X`09int pbid; `09`09`09`09/* pasteboard id */ X X`09initialize_mbx(); `09`09 /* initialize the terminal mailbox */ X`09smg$create_pasteboard(&pbid); /* create a pasteboard */ X brdcst_buf = (queue *)malloc(sizeof(queue)); X setqueue(brdcst_buf);`09`09 /* initialize the queue */ X`09setup_broad_hand(pbid);`09`09 /* setup the broadcast AST */ X`09sys$hiber();`09`09`09`09 /* hibernate until something happens */ X`09fprintf(stdout, "Something is hosed up real good.\n"); X`09sys$exit(1); X`7D /* main */ X X/* -----------------end of CTRAP module ------------------------------*/ $ CALL UNPACK CTRAP.C;1 1411669189 $ create 'f' X$! CTRAP.COM - V1.02`09Spring 1991`09The Camelot System X$! X$! `09Last Updated: March 14, 1991 X$! X$! AUTHOR: Belgarion (castillo@nauvax.ucc.nau.edu) X$! Sir Gareth /`7E (mshimniok@xray.chem.arizona.edu) X$! X$! This comfile executes the broadcast trapper CTRAP.EXE which is pointed X$! to by the logical name CTRAP_EXE_FILE. X$! X$ CTrapOn = (f$trnlnm("CTRAP_MBX") .nes. "") ! a boolean flag for later use X$ if p1 .eqs. "" X$ then gosub USAGE X$ else if p1 .eqs. "ON" X$ then gosub STARTUP X$ else if p1 .eqs. "DUMP" X$ then gosub DUMPIT X$ else if p1 .eqs. "OFF" X$`09 then gosub SHUTDOWN X$`09`09 else gosub USAGE X$`09`09 endif X$`09 endif X$ endif X$ endif X$ exit 1 X$! X$ USAGE: X$ type sys$input: XCtrap v1.02 XUsage: ctrap `5BON`7COFF`7CDUMP`5D X$ return X$! X$ STARTUP: X$ if CTrapOn X$ then write sys$output "CTrap already enabled." X$ return X$ endif X$ set term/nobroadcast/brdcstmbx X$ write sys$output "Executing ctrap. Hit return to get prompt." X$ spawn/nowait/input=nla0:/proc="Camelot-CTRAP" -`20 X run CTRAP_EXE_FILE X$ return X$ DUMPIT: X$ if .not. CTrapOn X$ then write sys$output "CTrap not enabled." X$ return X$ endif X$ open/write mmm CTRAP_MBX X$ write mmm "DUMP" X$ close mmm X$ return X$ SHUTDOWN: X$ if .not. CTrapOn X$ then write sys$output "CTrap already disabled." X$ return X$ endif X$ open/write mmm CTRAP_MBX X$ write mmm "QUIT" X$ close mmm X$ set term/broadcast/nobrdcstmbx X$ return $ CALL UNPACK CTRAP.COM;1 740890647 $ create 'f' X/* CTRAP.H X`09-- header file for ctrap.c X`09AUTHOR: Belgarion (castillo@nauvax.ucc.nau.edu X`09Last Updated: March 12, 1991 X*/ X#include X#include X#include X#include X X#define LIMIT 1000 /* max number of messages that can be trapped. */ X#define MBXBUFSIZ 512 X#define QUIT_CMD "QUIT" X#define START_CMD "START" X#define DUMP_CMD "DUMP" X#define STRLIM `09512 /* max characters per msg */ X X/* Global structures: */ X Xtypedef struct `7B X short int length; /* Length of string */ X char dtype; /* Type 14 is a string */ X char class; /* Class 1 is fixed length */ X char *ptr; /* Pointer to the string */ X `7D msg_type; /* once initialized, this is a fixed */ X /* length string descriptor */ Xtypedef struct X`7B X msg_type queuearray`5BLIMIT`5D; X int front; X int rear; X int numitems; X`7D queue; X Xtypedef struct `7B X short length; /* descriptor length field */ X char dtype; /* type field */ X char class; /* class field */ X char *ptr; /* pointer to the data */ X`7D mbx_descr; X X/* ------------function prototypes :: queue ----------------------------*/ Xvoid setqueue(queue *); Xint isempty(queue *); Xint isfull(queue *); Xvoid push(queue *, msg_type); Xint pop(queue *, msg_type *); Xvoid checkqueue(queue *); X/* -------------------function prototypes :: MBX --------------------*/ Xvoid initialize_mbx(); Xvoid mbxast(); Xextern void dump_msgs(); X/* ----------------------- end prototypes :: BRDCST ------------------*/ Xvoid brd_trap(int); /* broadcast handler AST */ Xvoid setup_broad_hand(int);`20 Xvoid handle_msg(queue *, msg_type); /* Message handler */ Xvoid notify_user(void); Xvoid dump_msgs(); Xchar *strtrim(char *); X X/* ---------------------global variables ----------------------------*/ X short int mbxchan; `09/* channel number */ X char *mbxbuff; /* mailbox buffer */`20 X extern queue *brdcst_buf; X $ CALL UNPACK CTRAP.H;1 1685339840 $ create 'f' X1 CTRAP X X X This program is used to trap incoming broadcast messages. X Normally, when a broadcast message is received (such as mail, X bitnet messages, PHONE, TALK, etc....) it is blasted all over the X screen. This is rather annoying. If you are in an editor, it often X either screws up your program nicely, or it just disappears`20 X altogether. Ctrap provides a good way to trap these incoming broadcast`2 V0 X messages and store them until you are ready for them. X X Format: CTRAP `5BON`7COFF`7CDUMP`5D X X2 ON X `20 X Turn CTRAP on. If CTRAP is already on, you will get a message to that X effect. CTRAP.COM will spawn/nowait CTRAP.EXE to perform its routines. X X Format: X X CTRAP ON X X2 OFF X `20 X Turns CTRAP off. If CTRAP is already off, you will get a message to X that effect. CTRAP.COM will communicate with CTRAP.EXE through a`20 X mailbox to perform its shutdown routine. X X Format: X X CTRAP OFF X X2 DUMP X X Display stored messages to the screen. CTRAP.COM will communicate X with CTRAP.EXE through a mailbox to display any stored broadcast X messages to the screen. X X Format: X X CTRAP DUMP X X2 Author X X Ulysses K. Castillo aka Belgarion X (castillo@nauvax.ucc.nau.edu) X X In consultation with: X X Michael E. Shimniok aka Sir Gareth /`7E X (mshimniok@xray.chem.arizona.edu) X & X Anthony C. McCracken X (acm@nauvax.ucc.nau.edu) X X for the Camelot System. X X Last Update: March 12, 1991 X X2 Copyright X X Notice of Copyright: X `20 X This program is Copyright(c) 1991 by Ulysses Castillo,`20 X Tony McCracken, and Michael E. Shimniok. All rights reserved. X This program may be copied as long as this notice of copyright and X disclaimer is included. If this program is posted in any form to`20 X any public forum, it must contain this notice of copyright,`20 X disclaimer, and all required files. X X Disclaimer: X `20 X The author assumes no liability for any damage caused by`20 X the use of this program. X Use of this program is at the sole risk of the user. X X2 Methodology X X This program was meant to be executed through a comfile. This`20 X spawn/nowaits this program. The program goes through an early`20 X initialization and then is ready to trap the incoming messages. X Once a broadcast message is received, it is stored in a circular`20 X queue and the message "Msg(s) pending." is printed at row 25 of X the terminal. After a suitable amount of time, the broadcast`20 X messages can then be displayed on the screen by again calling the X comfile (CTRAP DUMP). The comfile communicates to this program`20 X through the use of a temporary mailbox. The mailbox is queued X for read during initialization. Once a read is obtained, it`20 X processes the command. If an invalid command is read, it just X goes on it's merry way doing absolutely nothing. To stop the`20 X program a command is issued by the comfile (CTRAP OFF). X X The program spends most of its time in hibernation. It only`20 X awakes during one of the following: X a) a broadcast message is received. X b) a read to the terminal mailbox is received. X X This reduces the CPU time used to very little since no CPU is used X when a process is hibernating. X X X2 Compilation X X Execute the make file that comes with this a la`20 X @MAKECTRAP.COM X In the absence of this comfile the program may be compiled: X cc CTRAP.C X cc BRDCST.C X cc MBX.C X cc QUEUE.C X link CTRAP,BRDCST,MBX,QUEUE, sys$input/opt X sys$library:vaxcrtl/share X `5EZ X X2 Expansions X X Future expansions include: X X Implementation of the following options: X X REPLACE X X an input file will be read on initialization. The input file X will be of the form: X NAME=EQUIVALENT. X X The result: when a broadcast message is received, the input file X will be searched. If the text of the broadcast message matches X any NAME entry, the text of the broadcast message will be altered X to replace NAME with equivalent. The result is something like: X `20 X original: X S1606266 is phoning you. X X with REPLACE option: X Mike is phoning you. X X EXCLUSIVE X X This switch will read an input file of the same format as above. X When a broadcast message is received, the file is checked for`20 X matches. If a match occurs, the broadcast message is displayed. X Otherwise, the broadcast message is stored in the queue with the X other broadcast messages. This results in a selective display X of messages (much like call screening on an answering machine).`20 X There will be an option to either store or display both X matched and unmatched broadcast messages. X X2 Bugs X `20 X As of this writing, there are no known bugs. There is one`20 X side effect. While this program is running, a person may not X spawn. This is because a special mailbox is used to trap the X incoming messages. This is VMS' fault. It is NOT mine, that's X just the way it is. Bug reports may be sent to: X castillo@nauvax.ucc.nau.edu (internet) or X castillo@nauvax (bitnet). $ CALL UNPACK CTRAP.HLP;1 1126630112 $ create 'f' X$!MAKECTRAP.COM`09`09Spring 1991 X$!Last Update: March 12, 1991 X$!AUTHOR: Belgarion. X$! X$!This file compiles & links the required files to make CTRAP.EXE X$!Also sets the symbol CTRAP to the current path. You will have to`20 X$!change that if you wish. X$!All necessary files should be in the SAME directory! X$!The files are: X$!`09`09Ctrap.C`09`09-- main module X$! CTRAP.H`09`09-- The header file X$!`09`09BRDCST.C`09-- Broadcast trap module X$!`09`09QUEUE.C`09`09-- Broadcast trap submodule X$!`09`09MBX.C`09`09-- Mailbox module X$! X$ write sys$output "Here we go...." X$ write sys$output " " X$ write sys$output "Compiling Ctrap.C ..." X$ cc ctrap.c/opt X$ write sys$output "Compiling Brdcst.C ..." X$ cc brdcst.c/opt X$ write sys$output "Compiling MBX.C ..." X$ cc mbx.c/opt X$ write sys$output "Compiling Queue.C ..." X$ cc queue.c/opt X$ write sys$output "Linking..." X$ Link Ctrap,brdcst,mbx,queue,sys$input/opt Xsys$library:vaxcrtl/share X$ write sys$output "Done." X$write sys$output " " X$ inquire resp "Delete .obj files?" X$ if resp .eqs. "Y" X$ then X$ delete/noconfirm ctrap.obj.* X$ delete/noconfirm brdcst.obj.* X$ delete/noconfirm mbx.obj.* X$ delete/noconfirm queue.obj.* X$ write sys$output "Done." X$ endif X$ curdir := 'f$environment("default") X$ ctrap:=="@''curdir'ctrap.com" X$exit $ CALL UNPACK MAKECTRAP.COM;1 1042243761 $ create 'f' X/* `09MBX.C v1.02`09`09Spring 1991 X X`09MODULE NAME: MBX.C X`09AUTHOR: Belgarion (castillo@nauvax.ucc.nau.edu) X`09LAST REVISED: March 12, 1991 X`09 X X `09This file is for use with Ctrap.C It is the module containing all X `09functions relating to the terminal mailbox. X X`09All communication with ctrap is made by a comfile. The comfile will X`09write to a mailbox that is asynchronously read by this module. The X`09commands written into the mailbox affect ctrap. `20 X X`09Current valid commands are: X`09`09DUMP`09-- Display the stored broadcast messages to the screen. X`09`09 `09 The actual displaying is handled by the BRDCST module. X`09 QUIT`09-- Quit CTRAP. This disables broadcast trapping and does X`09`09`09`09 a mass cleanup using sys$exit(). X X*/ X X#include "ctrap.h" X Xvoid initialize_mbx() X`7B X mbx_descr mbxnam; X int i=0; X X mbxnam.dtype = 14; /* type 14 means character string */ X mbxnam.class = 2; /* class 2 means dynamic string */ X mbxnam.ptr = malloc(30); /* create a 30 byte buffer */ X strcpy(mbxnam.ptr,"CTRAP_MBX"); /* logical name for the mailbox */ X mbxnam.length = strlen(mbxnam.ptr); X mbxbuff = (char *) malloc(MBXBUFSIZ); X X sys$crembx(0,&mbxchan,256,4096,0,0,&mbxnam); /* create a mail box */ X sys$qio(0,mbxchan,IO$_READVBLK,0,mbxast,0,mbxbuff,256,0,0,0,0); X`7D /* initialize_mbx */ X Xvoid mbxast() X`7B X`09/* this AST is called whenever a read is completed. X`09 The commands received are then acted upon`20 X`09*/ X `09int i; X `20 X`09/* GOD I wish there was a case statment for strings. */ X X`09if (strcmp(mbxbuff,DUMP_CMD) == 0) `7B X`09`09fprintf(stdout, "\nDumping messages ::\n"); X`09`09dump_msgs(); X`09`7D X X`09if (strcmp(mbxbuff,QUIT_CMD) == 0) `7B X`09`09fprintf(stdout, "\nDumping messages ::\n"); X`09`09dump_msgs(); X`09`09sys$dassgn(mbxchan); X`09`09sys$exit(1); X`09`7D X `09for (i=0;i<256;i++)`20 X`09`09mbxbuff`5Bi`5D = 0; /* zero out the buffer */ X `09sys$qio(0,mbxchan,IO$_READVBLK,0,mbxast,0,mbxbuff,256,0,0,0,0); X`09/* re-arm the AST */ X`7D /* mbxast */ X X X/* ---------------------------end module MBX -----------------------------*/ $ CALL UNPACK MBX.C;1 474162383 $ create 'f' X/* this file contains functions related to options for ctrap. */ X X#include Xint replace = 0; Xint exclusive = 0; X X Xint parseoptions(argc, char *argv`5B`5D); X`7B X`09if (strncmp(argv`5B1`5D,"-r",2)) X`09`09replace = 1; X`09if (strncmp(argv`5B1`5D,"-x",2)) X`09`09exclusive = 1; X`7D X Xint scanreplace(char *arg, char *message) X`7B X`09char *filen; X`09FILE *fp; X`09char *aline; X X`09filen = strextract(arg, 3, strlen(arg)); X`09fp = fopen(filen,"r"); X `09while (fgets(fp,aline) != NULL) X`09`09if (strstr(message,aline) != NULL) X`09`09`09replace(aline, message); X`7D X Xreplace(char *a, char *b) X`7B X`7D`09 X Xchar *strstrlocate(char *s, char *l) X`7B X`09int pos, i, j, k; X`09 X`09i = 0; j = 0; k = 0; pos = 0; X`09j = 0; X`09k = 0; X`09pos=0; X s = arghit l = oh X`09for (i = 0,i <= (strlen(s) - strlen(l)), ++i) `7B X`09`09while ((s`5Bj`5D != '\0') && (s`5Bj`5D != l`5Bk`5D)) X`09`09`09++j; /* find the first character of l in *s */ X`09`09pos = ++j; 6 X`09`09while(s`5Bj`5D == l`5Bk`5D) X`09`09`09++j; ++k; X`09`09if (k = stlren(l)) X`09`09`09return pos; /* we found it */ X`09`09else X`09`09`09k = 0; /* that wasn't it, try again */ X`09`7D X`09return j; X`7D X Xchar *strextract(char *s, int j, int k) X`7B X char *t; X int i; X X if (j > k) X return "\0"; X X t = (char *) malloc(k - j + 2); X for (i = j; i <= k; ++i) X t`5Bi - j`5D = s`5Bi`5D; X t`5B++i - j`5D = 0; X X return t; X`7D /* strextract */ X`09 X X $ CALL UNPACK OPTIONS.C;1 138886437 $ create 'f' X/* Queue.C v1.02`09`09`09Spring 1991`09 X X`09MODULE NAME: Queue.C X`09AUTHOR: Belgarion (castillo@nauvax.ucc.nau.edu) X`09LAST REVISED: March 3, 1991 X X`09This contains all the functions that implement the circular queue`20 X ADT. The broadcast messages are contained in a fixed`20 X`09length (array) circular queue known as brdcst_buf. `20 X The individual messages are of msg_type, which is a fixed length`20 X`09string descriptor. X X*/ X X#include "ctrap.h" X X/* ---------------queue manipulation functions------------------------- */ X Xvoid setqueue(queue *q) X/* setqueue sets front pointer to the top (0), the rear as the bottom X (LIMIT -1), and numitems as 0. The queue is thus circular. X*/ X`7B X`09q->numitems = 0; X`09q->front = 1; X`09q->rear = LIMIT - 1; X`7D /* setqueue */ X X Xint isempty(queue *q) X/* isempty tests to see if the queue is empty. If it is, it returns X logical TRUE (1) else logical FALSE (0). Empty is defined as the X numitems = 0. X*/ X`7B X`09return (q->numitems == 0); X`7D /* isempty */ X X Xint isfull(queue *q) X/* isfull tests to see if the queue is full. If it is, it returns X logical TRUE (1) else logical FALSE (0). Full is defined as`20 X the start pointer == the rear pointer. X*/ X`7B X`09return (q->numitems == LIMIT - 1); X`7D /* isfull */ X X Xvoid push(queue *q, msg_type m) X/* push attempts to push msg onto the queue. When q->rear is < LIMIT - 1, X q->rear is incremented by 1. when q->rear is equal to LIMIT -1, q-rear X is set to 1. That is, it makes the queue circular. Since the array`20 X rather large, this shouldnt happen too often. X*/ X`7B X`09msg_type temp; X X`09/* COPY temp to m, then set the pointer to temp. Without copying X`09 first, the pointer will always be at the last msg. X`09*/ X`09temp.length = m.length; X`09temp.dtype = m.dtype; X`09temp.class`09= m.class; X`09temp.ptr = (char *) malloc(81); X`09strcpy(temp.ptr,m.ptr); X`09q->rear = (q->rear % (LIMIT -1)) + 1; /* increment rear */ X`09q->queuearray`5Bq->rear`5D = temp; X`09q->numitems++; X`7D /* push */ X X Xint pop(queue *q, msg_type *m) X/* pop attempts to remove an item from the queue. If the queue is`20 X empty pop returns logical FALSE (0). If it is not empty, pop X places the msg pointed to by front into *msg, and returns logical X TRUE (1). X*/ X`7B X`09if (isempty(q)) X`09`09return 0; X X`09(*m) = q->queuearray`5Bq->front`5D; X`09q->front = (q->front % (LIMIT - 1)) + 1; X`09q->numitems--; X`09return 1; X X`7D /* pop */ X X/*---------------end of queue manipulation functions-----------------------* V/ X X Xvoid checkqueue(queue *q) X`7B X`09int i; X`09for (i = 1;i <= q->numitems; i++) X`09`09fprintf(stdout,"%d :> %s\n",i,q->queuearray`5Bi`5D.ptr); X`7D $ CALL UNPACK QUEUE.C;1 1191268798 $ v=f$verify(v) $ EXIT