From: SMTP%"DSJ@WKUVX1.WKU.EDU" 21-DEC-1993 10:52:50.93 To: EVERHART CC: Subj: AUGUST93.TEXTIO X-FileServer: Digital Systems Journal File Server Date: Tue, 21 Dec 1993 09:54:56 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: AUGUST93.TEXTIO To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : TEXTIO $! By : Hunter Goatley $! Date : 12-AUG-1993 12:31:34.50 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! 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. TEXTIO.DESC;1 $! 2. TEXTIO.DSJ;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ 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, P3=attributes,P4=size $ 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: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' XThis`20file`20offers`20code`20originally`20published`20in`20the`20July/August V`201993`20issue`20of XDigital`20Systems`20Journal.`20It`20was`20first`20run`20as`20part`20of`20Dan V`20Heller's`20article X"Handling`20Input`20for`20the`20Motif`20Text`20Widget,"`20found`20on`20page`20 V5.`20It`20focuses`20on Xmonitoring`20and`20changing`20text`20input`20on`20the`20fly`20in`20the`20Motif V`20Text`20Widget. $ call unpack TEXTIO.DESC;1 1125278444 "" 1 1 2 $! $ create 'f' XExample`201: XThis`20callback`20is`20useful`20if`20you`20plan`20on`20monitoring`20or`20chang Ving Xthe`20user's`20input`20before`20it`20actually`20gets`20inserted`20into`20a`20T Vext`20widget. X X/*`20Written`20by`20Dan`20Heller.`20`20Copyright`201991,`20O'Reilly`20`26`26 V`20Associates. X`20*`20This`20program`20is`20freely`20distributable`20without`20licensing`20fe Ves`20and X`20*`20is`20provided`20without`20guarantee`20or`20warrantee`20expressed`20or V`20implied. X`20*`20This`20program`20is`20-not-`20in`20the`20public`20domain.`20`20This`20p Vrogram`20is`20from X`20*`20The`20Motif`20Programming`20Manual. X`20*/ X X/*`20allcaps.c`20--`20demonstrate`20the`20XmNmodifyVerifyCallback`20for X`20*`20Text`20widgets`20by`20using`20one`20to`20convert`20all`20typed`20input V`20to X`20*`20capital`20letters. X`20*/ X#include`20 X#include`20 X#include`20 X#include`20 X Xvoid`20allcaps(); X Xmain(argc,`20argv) Xint`20argc; Xchar`20*argv`5B`5D; X`7B X`20`20`20`20Widget`20`20`20`20`20`20`20`20toplevel,`20text_w,`20rowcol; X`20`20`20`20XtAppContext`20`20app; X X`20`20`20`20toplevel`20=`20XtVaAppInitialize(`26app,`20"Demos", X`20`20`20`20`20`20`20`20NULL,`200,`20`26argc,`20argv,`20NULL,`20NULL); X X`20`20`20`20rowcol`20=`20XtVaCreateWidget("rowcol", X`20`20`20`20`20`20`20`20xmRowColumnWidgetClass,`20toplevel, X`20`20`20`20`20`20`20`20XmNorientation,`20XmHORIZONTAL, X`20`20`20`20`20`20`20`20NULL); X X`20`20`20`20XtVaCreateManagedWidget("Enter`20Text:", X`20`20`20`20`20`20`20`20xmLabelGadgetClass,`20rowcol,`20NULL); X`20`20`20`20text_w`20=`20XtVaCreateManagedWidget("text_w", X`20`20`20`20`20`20`20`20xmTextWidgetClass,`20rowcol,`20NULL); X X`20`20`20`20XtAddCallback(text_w,`20XmNmodifyVerifyCallback,`20allcaps,`20NULL V); X X`20`20`20`20XtManageChild(rowcol); X`20`20`20`20XtRealizeWidget(toplevel); X`20`20`20`20XtAppMainLoop(app); X`7D X Xvoid Xallcaps(text_w,`20unused,`20cbs) XWidget`20`20`20`20`20`20text_w; XXtPointer`20`20`20unused; XXmTextVerifyCallbackStruct`20*cbs; X`7B X`20`20`20`20int`20len; X X`20`20`20`20if`20(cbs->text->ptr`20==`20NULL)`20`20/*`20backspace`20*/ X`20`20`20`20`20`20`20`20return; X X`20`20`20`20/*`20convert`20all`20input`20to`20upper-case`20if`20necessary`20*/ V X`20`20`20`20for`20(len`20=`200;`20len`20<`20cbs->text->length;`20len++) X`20`20`20`20`20`20`20`20if`20(islower(cbs->text->ptr`5Blen`5D)) X`20`20`20`20`20`20`20`20`20`20`20`20cbs->text->ptr`5Blen`5D`20=`20toupper(cbs- V>text->ptr`5Blen`5D); X`7D X X`0C X Xtypedef`20struct`20`7B X`20`20`20`20int`20`20`20`20`20`20reason; X`20`20`20`20XEvent`20`20*event; X`20`20`20`20Boolean`20`20doit; X`20`20`20`20long`20`20`20`20`20currInsert; X`20`20`20`20long`20`20`20`20`20newInsert; X`20`20`20`20long`20`20`20`20`20startPos; X`20`20`20`20long`20`20`20`20`20endPos; X`20`20`20`20XmTextBlock`20`20`20text; X`7D`20XmTextVerifyCallbackStruct; X X`0C X XExample`202:`20A`20Text`20widget`20that`20checks`20for`20a`20ZIP`20code. X Xvoid Xcheck_zip(text_w,`20unused,`20cbs) XWidget`20`20`20`20`20`20text_w; Xcadr_t`20`20`20`20`20`20unused; XXmTextVerifyCallbackStruct`20*cbs; X`7B X`20`20`20`20int`20len`20=`200; X X`20`20`20`20if`20(cbs->startPos`20<`20cbs->currInsert)`20`20/*`20backspace`20* V/ X`20`20`20`20`20`20`20`20return; X X`20`20`20`20len`20=`20XmTextGetLastPosition(text_w); X X`20`20`20`20if`20(len`20==`205)`20`7B X`20`20`20`20`20`20`20`20cbs->doit`20=`20False; X`20`20`20`20`20`20`20`20return; X`20`20`20`20`7D X`20`20`20`20/*`20check`20that`20the`20new`20additions`20won't`20put`20us`20ove Vr`205`20*/ X`20`20`20`20if`20(len`20+`20cbs->text->length`20>`205)`20`7B X`20`20`20`20`20`20`20`20cbs->text->ptr`5B5`20-`20len`5D`20=`200; X`20`20`20`20`20`20`20`20cbs->text->length`20=`20strlen(cbs->text->ptr); X`20`20`20`20`7D X`20`20`20`20for`20(len`20=`200;`20len`20<`20cbs->text->length;`20len++)`20`7B V X`20`20`20`20`20`20`20`20/*`20make`20sure`20all`20additions`20are`20digits.`20* V/ X`20`20`20`20`20`20`20`20if`20(!isdigit(cbs->text->ptr`5Blen`5D))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20/*`20not`20a`20digit--`20move`20all`20char Vs`20down`20one`20and X`20`20`20`20`20`20`20`20`20`20`20`20`20*`20decrement`20cbs->text->length. X`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20int`20i; X`20`20`20`20`20`20`20`20`20`20`20`20for`20(i`20=`20len;`20(i+1)`20<`20cbs->tex Vt->length;`20i++) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20cbs->text->ptr`5Bi`5D`20=`20cb Vs->text->ptr`5Bi+1`5D; X`20`20`20`20`20`20`20`20`20`20`20`20cbs->text->length--; X`20`20`20`20`20`20`20`20`20`20`20`20len--; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`20`20if`20(cbs->text->length`20==`200) X`20`20`20`20`20`20`20`20cbs->doit`20=`20False; X`7D X X`0C X XExample`203:`20Prompting`20for`20a`20password. X X/*`20Written`20by`20Dan`20Heller.`20`20Copyright`201991,`20O'Reilly`20`26`26 V`20Associates. X`20*`20This`20program`20is`20freely`20distributable`20without`20licensing`20fe Ves`20and X`20*`20is`20provided`20without`20guarantee`20or`20warrantee`20expressed`20or V`20implied. X`20*`20This`20program`20is`20-not-`20in`20the`20public`20domain.`20`20This`20p Vrogram`20is`20from X`20*`20The`20Motif`20Programming`20Manual. X`20*/ X X/*`20passwd.c`20--`20prompt`20for`20a`20passwd.`20`20Meaning,`20all`20input`20 Vlooks`20like X`20*`20a`20series`20of`20*'s.`20`20Store`20the`20actual`20data`20typed`20by`20 Vthe`20user`20in X`20*`20an`20internal`20variable.`20`20Don't`20allow`20paste`20operations.`20 V`20Handle X`20*`20backspacing`20by`20deleting`20all`20text`20from`20insertion`20point`20t Vo`20the X`20*`20end`20of`20text. X`20*/ X#include`20 X#include`20 X#include`20 X#include`20 X Xvoid`20check_passwd(); Xchar`20*passwd;`20/*`20store`20user-typed`20passwd`20here.`20*/ X Xmain(argc,`20argv) Xint`20argc; Xchar`20*argv`5B`5D; X`7B X`20`20`20`20Widget`20`20`20`20`20`20`20`20toplevel,`20text_w,`20rowcol; X`20`20`20`20XtAppContext`20`20app; X X`20`20`20`20toplevel`20=`20XtVaAppInitialize(`26app,`20"Demos", X`20`20`20`20`20`20`20`20NULL,`200,`20`26argc,`20argv,`20NULL,`20NULL); X X`20`20`20`20rowcol`20=`20XtVaCreateWidget("rowcol", X`20`20`20`20`20`20`20`20xmRowColumnWidgetClass,`20toplevel, X`20`20`20`20`20`20`20`20XmNorientation,`20XmHORIZONTAL, X`20`20`20`20`20`20`20`20NULL); X X`20`20`20`20XtVaCreateManagedWidget("Password:", X`20`20`20`20`20`20`20`20xmLabelGadgetClass,`20rowcol,`20NULL); X`20`20`20`20text_w`20=`20XtVaCreateManagedWidget("text_w", X`20`20`20`20`20`20`20`20xmTextWidgetClass,`20rowcol,`20NULL); X X`20`20`20`20XtAddCallback(text_w, X`20`20`20`20`20`20`20`20XmNmodifyVerifyCallback,`20check_passwd,`20NULL); X`20`20`20`20XtAddCallback(text_w, X`20`20`20`20`20`20`20`20XmNactivateCallback,`20check_passwd,`20NULL); X X`20`20`20`20XtManageChild(rowcol); X`20`20`20`20XtRealizeWidget(toplevel); X`20`20`20`20XtAppMainLoop(app); X`7D X Xvoid Xcheck_passwd(text_w,`20unused,`20cbs) XWidget`20`20`20`20`20`20`20`20text_w; XXtPointer`20`20`20`20`20unused; XXmTextVerifyCallbackStruct`20*cbs; X`7B X`20`20`20`20char`20*new; X`20`20`20`20int`20len; X X`20`20`20`20if`20(cbs->reason`20==`20XmCR_ACTIVATE)`20`7B X`20`20`20`20`20`20`20`20printf("Password:`20%s`5Cn",`20passwd); X`20`20`20`20`20`20`20`20return; X`20`20`20`20`7D X X`20`20`20`20if`20(cbs->text->ptr`20==`20NULL)`20`7B`20/*`20backspace`20*/ X`20`20`20`20`20`20`20`20cbs->endPos`20=`20strlen(passwd);`20/*`20delete`20from V`20here`20to`20end`20*/ X`20`20`20`20`20`20`20`20passwd`5Bcbs->startPos`5D`20=`200;`20/*`20backspace--t Verminate`20*/ X`20`20`20`20`20`20`20`20return; X`20`20`20`20`7D X X`20`20`20`20if`20(cbs->text->length`20>`201)`20`7B X`20`20`20`20`20`20`20`20cbs->doit`20=`20False;`20/*`20don't`20allow`20"paste" V`20operations`20*/ X`20`20`20`20`20`20`20`20return;`20/*`20make`20the`20user`20*type*`20the`20pass Vword!`20*/ X`20`20`20`20`7D X X`20`20`20`20new`20=`20XtMalloc(cbs->endPos`20+`202);`20/*`20new`20char`20+`20N VULL`20*/ X`20`20`20`20if`20(passwd)`20`7B X`20`20`20`20`20`20`20`20strcpy(new,`20passwd); X`20`20`20`20`20`20`20`20XtFree(passwd); X`20`20`20`20`7D`20else X`20`20`20`20`20`20`20`20new`5B0`5D`20=`20NULL; X`20`20`20`20passwd`20=`20new; X`20`20`20`20strncat(passwd,`20cbs->text->ptr,`20cbs->text->length); X`20`20`20`20passwd`5Bcbs->endPos`20+`20cbs->text->length`5D`20=`200; X X`20`20`20`20for`20(len`20=`200;`20len`20<`20cbs->text->length;`20len++) X`20`20`20`20`20`20`20`20cbs->text->ptr`5Blen`5D`20=`20'*'; X`7D $ call unpack TEXTIO.DSJ;1 541988246 "" 11 2 2 $ v=f$verify(v) $ exit