From: SMTP%"DSJ@WKUVX1.WKU.EDU" 9-APR-1994 15:26:33.74 To: EVERHART CC: Subj: FEBRUARY94.PHONE Message-Id: <9404091921.AA24037@uu7.psi.com> X-Fileserver: Digital Systems Journal File Server Date: Sat, 09 Apr 1994 14:22:20 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: FEBRUARY94.PHONE To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : PHONE $! By : Hunter Goatley $! Date : 7-FEB-1994 07:38:48.75 $! 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. PHONE.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' X X#include`20 X#include`20 X#include`20 X#include`20 X#include`20 X Xstruct`20record`7B X`20`20`20long`20number; X`20`20`20char`20`20`20string`5B248`5D; X`20`20`20`7D; X Xstruct`20record`20record1; X X#define`20MAX_PH_NUM`209999999999 X Xmain90 X`7B X X`20`20int`20`20`20ret,i.fd; X`20`20long`20`20num X`20`20FILE`20`20*fp; X`20`20struct`20record`20*p; X X`20`20fd=open("phone_data",O_RDWRIO_CREAT,0644); X`20`20if(fd<0) X`20`20`7B X`20`20`20`20`20`20`20`20fprintf(stderr,"open`20of`20database`20failed`20with V`20error`20%d`5Cn", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20errno); X`20`20`20`20`20`20`20`20exit(errno); X`20`20`7D X X`20`20/*`20create`20sparse`20file`20large`20enough`20to`20contain`20the`20data V*/ X`20`20ret=lseek(fd,(size_t)MAX_PH_NUM*`20sizeof(struct`20record),`20SEEK_SET; V X`20`20if`20(ret<0) X`20`20`7B X`20`20`20`20`20`20`20`20`20`20fprintf(stderr,"seek`20on`20database`20fd`20retu Vrned`20errno`20%d`5Cn", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20errno); X`20`20`20`20`20`20`20`20`20`20exit(errno); X`20`20`7D X X/* X`20*`20this`20will`20always`20zero`20out`20the`20last`20record,`20but`20for`20 Vthe`20purposes X`20*`20of`20this`20test,`20we`20don't`20care`20--`20the`20write`20insures`20th Vat`20the`20ssparse X`20*`20file`20created`20is`20large`20enough`20to`20handle`20the`20size`20of`20 Vthe`20region`20we X`20*`20want`20to`20map X`20*/ X X`20`20`20ret=write(fd,`26record1,sizeof(record1)); X`20`20`20if`20(ret`20!=sizeof(record1)) X`20`20`20`7B X`20`20`20fprintf(stderr,"write`20of`20database`20returned`20%d`5Cn",ret); X`20`20`20fprint(stderr,"errno`20on`20write=%d`5Cn",errno); X`20`20`20`7D X X X/* X`20*`20Now`20we`20mmap`20the`20file`20for`20shared`20access,`20using`20the`20f Vile`20to`20page X`20*`20against. X`20*/ X`20`20p=(struct`20record*)mmap((caddr_t)`20NULL, X`20`20`20`20`20`20`20`20`20(size_t)(MAX_PH_NUM+1)*sizeof(struct`20record), X`20`20`20`20`20`20`20`20`20PROT_READ`7CPROT_WRITE, X`20`20`20`20`20`20`20`20`20MAP_FILE`5CMAP_SHARED`7CMAP_VARIABLE,fd,(off_t)0); V X`20`20if`20((caddr_t)p==(caddr_t)-1 X`20`20`7B X`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,"mmap`20failed,errno`20=`20%d V`5Cn",errno); X`20`20`20`20`20`20`20`20`20`20`20exit(errno); X`20`20`7D X X/* X`20*`20Loop`20until`20the`20number`200`20is`20entered.`20Some`20nice`20input V`20functions X`20*`20would`20be`20nice`20here,`20and`20maybe`20a`20curses`20interface,`20but V`20the`20object X`20*`20is`20to`20demonstrate`20the`2064`20bit`20mmap,`20so`20a`20minimal`20int Verface`20is X`20*`20included.`20Enter`20the`20phone`20number`20as`20a`20straight`20number, V`20e.g. X`20*`201234567890`20or`2010.`20No`20spaces,`20hyphens,`20or`20parenthesis. X`20* X`20*`20If`20the`20number`20member`20of`20the`20struct`20is`20empty,`20the`20re Vcord`20is X`20*`20assumed`20to`20be`20uninitialized,`20and`20data`20is`20entered.`20If`20 Vthe X`20*`20number`20member`20is`20non-zero,`20the`20record`20is`20recovered`20from V`20the`20file X`20*`20and`20reprinted.`20The`20record`20for`20MAX_PH_NUM`20is`20always`20rzer Voed`20on X`20*`20program`20startup`20time,`20but`20all`20others`20will`20survive`20in`20 Vthe`20data X`20*`20file`20across`20program`20startup`20and`20initialization. X`20*/ X X`20`20do X`20`20`7B X`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20printf("Enter`20the`20number`20to`20process-> V"); X`20`20`20`20`20`20`20`20`20`20`20scanf("%ld%*c",`26num); X`20`20`20`20`20`20`20`20`20`20`20if`20(num) X`20`20`20`20`20`20`20`20`20`20`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(p`5Bnum`5D.number) V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("r Vecord`20for`20%.10d`20is`20%s`5Cn", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20num,p`5Bnum`5D.string); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p`5Bnum`5D.numb Ver=num; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20printf("please V`20enter`20a`20record`20for`20%.10d->", X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20p`5Bnum`5D.number); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20scanf("%`5B`5E V`5Cn`5D%*c",p`5Bnum`5D.string; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20`20`20`20`20`7D X`20`20`7Dwhile`20(num); X`7D X X*eot/eof $ call unpack PHONE.DSJ;1 1616477579 "" 6 1 1 $ v=f$verify(v) $ exit