TITLE DMLVOK SEARCH COPYRT SALL ; This software is furnished under a license and may only be used ; or copied in accordance with the terms of such license. COPYRIGHT (C) 1974, 1984 BY DIGITAL EQUIPMENT COPRORATION, MAYNARD, MASS. ; ******************************************************************* ; NOTE!!! This module is shared by the COBOL and DBMS products. Any ; modification by either group should be immediately reflected in the ; copy of the other group. ; ******************************************************************* ; **** ;Append TOPS20==0 to beginning of module for COBOL68/74-12B ; **** SEARCH GENDCL,DMLSYM,STRING,DBSDCL SEGMEN IFNDEF $COB,<$COB==0> ;DEFAULT FOR FORTRAN ;THIS MODULE CAN BE USED FROM EITHER COBOL OF FORTRAN ;ITS USEABILITY IS CONTROLLED BY THE ASSEMBLY SWITCH, $COB. IFE $COB,> IFN $COB,> IFN $COB, IFNDEF TOPS20, .COPYRIGHT ;Put standard copyright statement in REL file ENTRY DMLVOK,VOKINI ;;; MODULE REGS MREG(BMASK,6) MREG(CRU,7) ;CUR BLK OF RUN-UNIT MREG(OCC) ;FOR OCCURS MREG(SYMCOD) MREG(KEYTYP) ;[1114] VIA KEY TYPE FOR ALIAS CHECK ; FOR ERRORS ;;; DMLSSI ;SUB SCHEMA NAME INVALID ;;; DMLBDK ;BAD PRIVACY KEY ;;; DMLNSB ;NO SCHEMA BLOCK ;;; DMLCOS ;CANT OPEN SCHEMA ;;; DMLSAF ;SCHEMA ACCESS FAILURE ;;; DMLINP ;NON-DATA-BASE ITEM HAS NO PSEUDONYM ;;; DMLDUP ;V.3 WILL DETECT DUPLIC DB SYMBOLS ;;; DMLANN ;;; DMLNWP ;DATA-NAME(S) WITHOUT PSEUDONYM ENCOUNTERED DEFINE HOWPUT(FARGS.,CARGS.,OCC.)< IFNB , IFE $COB,> IFN $COB,> > DEFINE KEY(KEYARG),< [$$'KEYARG] > ;DEFINE PART OF SYMBOL NODES LOCAL TO SCHEMA PROCESSING SM.TYP==SM.USR## SM.NMID==SM.USR##+1 SYMLEN==SM.NMID+1 ;THIS IS KLUDGE--SEE DMLDCL FOR RIGHT WAY EXTERN $DBNAME,$IDENT,$DBID SUBTTL LOW-SEG STUFF IFN $COB,< DEFINE DATA(NAM,SIZ)< ;;BECAUSE OF COBOL'S IMPURE.MAC EXTERN NAM > DEFINE GDATA(NAM,SIZ)< ;;BECAUSE OF COBOL'S IMPURE.MAC EXTERN NAM > CURNAM==CURN2 DATA(NULLREC) DATA(SIZONL,2) ;FOR OCCURS CLAUSE DATA(CURREC,2) ;Ptr to current qualifier > IFE $COB,< ; [1101] DATA(CHRTMP) ; [1101] tmp flag for chr data > ; [1101] DATA(SIZAREA,2) DATA(LEVNO,2) ;STRING PTR FOR CURRENT LEVEL DATA(TMPNAM,2) ;A STRING PTR FOR SHORT TERM USAGE DATA(PICBP,2) ;PTS AT CURR PICTURE DATA(UNWIND) ;FOR HANDLING FATAL ERRORS DATA(FILENM) DATA(DASH) DATA(UNDIDX) DATA(TXTIDX) ;STRING VERSION OF ?L.NMID DATA(PSUNYM) DATA(A.TMP1) ;TEMPORARY FOR OLD ARG LISTS DATA(A.TMP2) DATA(VOKFLG) ;SET ON FIRST BIND OF BUF DATA-NAME A.PT1==A.TMP1 A.PT2==A.TMP2 IFE $COB,< ;;; SIZTXT IS SUBSTRING OF UNDEFP ASP (STACMN,^D20) ASP (UNDEFP,^D20,) SIZTXT: POINT 7,UNDEFP+2+1,6 0 ASTRSK: POINT 7,[ASCII/*/] ; [1101] used in VAR*N clause 1 ; [1101] only one character long SIZONL: POINT 7,UNDEFP+2+1,13 XWD ^D10,0 DATA(CURNAM,2) ;STRING PTR TO CURR DB SYMBOL ;;; ARG BLK TO MGRMEM MMDESC: 0 ;;;ONLY VARIABLE WORD SYMLEN ;AMOUNT TO ALLOC EACH TIME 200 ;AMOUNT TO GRAB WHEN RUN OUT > SUBTTL TEXT DATA FOR FORTRAN $FUNCT (VOKDUM) ;FORCE HISEG IFE $COB,< ; [1101] SYSCOC is the character data top half of SYSCOM STRIVRY (SYSCOC,< INTEGER SYSCOM(44),ERCNT,ERSTAT CHARACTER *30 ERAREA,ERREC,ERSET,RECNAM,ARNAM >) ; [1101] SYSCOI is the integer SYSCOM STRIVRY (SYSCOI,< INTEGER SYSCOM(44),ERCNT,ERSTAT INTEGER ERAREA(6),ERREC(6),ERSET(6),RECNAM(6),ARNAM(6) >) ; [1101] SYSCOM is the rest of it... STRIVRY (SYSCOM,< INTEGER DBKEY,ERDATA EQUIVALENCE (SYSCOM(1),ARNAM), 1 (SYSCOM(7),RECNAM), 1 (SYSCOM(13),ERSTAT), 1 (SYSCOM(14),ERSET), 1 (SYSCOM(20),ERREC), 1 (SYSCOM(26),ERAREA), 1 (SYSCOM(32),ERCNT), 1 (SYSCOM(33),DBKEY), 1 (SYSCOM(34),ERDATA) >) DBNULL: STRIPT < INTEGER DBNULL > SYS32: STRIPT STASB: STRIPT < CALL SBIND(> STABIND:STRIPT < CALL BIND(> EBIND: STRIPT < CALL EBIND(0,DBNULL) > LEV1: STRIPT <*01 > LEV2: STRIPT <* 02 > Q: STRIPT <'> INTEG: STRIPT < INTEGER > CHRTXT: STRIPT < CHARACTER > ; [1101] for fortran 77 REAL: STRIPT < REAL > REAL8: STRIPT < REAL*8 > COMPLEX: STRIPT < COMPLEX > COMMUN: STRIPT < COMMON> INCLUDE:STRIPT < INCLUDE '> ELEM1: POINT 7,ELEM1 ;0-LENGTH, CAN PT ANYWHERE EXP 0 SIZE2: STRIPT <(2> SIZE6: STRIPT <(6> SIZE30: STRIPT <30> ;[1101] Area-ID size for /CHARACTER SLASH: POINT 7,[ASCII\/\] XWD 0,1 DOTSUB: STRIPT <.SUB' > NOLIST: STRIPT <.SUB/NOLIST' > > ;END IFE $COB SUBTTL TEXT DATA FOR COBOL IFN $COB,< STRIVRY (SYSCOM,< 01 SYSCOM. 02 AREA-NAME, PIC X(30) USAGE DISPLAY-7. 02 RECORD-NAME, PIC X(30) USAGE DISPLAY-7. 02 ERROR-STATUS, PIC 9(5) USAGE DISPLAY-7. 02 ERROR-SET, PIC X(30) USAGE DISPLAY-7. 02 ERROR-RECORD, PIC X(30) USAGE DISPLAY-7. 02 ERROR-AREA, PIC X(30) USAGE DISPLAY-7. 02 ERROR-COUNT, PIC 99, USAGE COMP. 02 DATA-BASE-KEY USAGE DBKEY. 02 ERROR-DATA PIC 9(10) USAGE COMP. >) DBNULL: STRIPT <01 DBMS-NULL PIC 99 USAGE COMP. > DBSECT: STRIPT < DBMS SECTION. > STASB: STRIPT < ENTER MACRO SBIND USING > STABIND:STRIPT < ENTER MACRO BIND USING > EBIND: STRIPT < ENTER MACRO EBIND USING 0,DBMS-NULL. > LEV1: STRIPT <01 > LEV2: STRIPT < 02 > Q: STRIPT <"> PICTUR: STRIPT < PIC > PIC.CP: STRIPT PIC.DC: STRIPT PICX30: STRIPT USCMP2: ;SAME IN COBOL USCOMP: STRIPT < USAGE COMP> USCMP1: STRIPT < USAGE COMP-1> USCMP3: STRIPT < USAGE COMP-3> USD6: STRIPT < USAGE DISPLAY-6> USD7: STRIPT < USAGE DISPLAY-7> USD9: STRIPT < USAGE DISPLAY-9> ALLKEY: STRIPT < USAGE DBKEY> ELEM1: STRIPT < (1)> OCCURS: STRIPT < OCCURS > L2FILL: STRIPT < 02 FILLER PIC X(1). > QUALIF: STRIPT < OF > ;Sep. for qualified datanames > ;END IFN SUBTTL TEXT DATA FOR ALL HOSTS NULSTR: POINT 7,ZERO 0 AZERO: STRIPT 0 SEP: STRIPT <,> C.RUN.C:STRIPT <,0,> LPAREN: STRIPT <(> RPAREN: STRIPT <)> DOTCRLF:STRIPT <. > CRLF: STRIPT < > SUBTTL INIT SYMBOL TABLE FOR COBOL IFN $COB,< DEFINE MAKASC(STRING) DEFINE MAKASK(STRING) DEFINE SYMBLK(TYPE,STRING)< GETLEN () EXP 0 POINT 7,SYMLEN ;;ACTUAL STRING ALWAYS IMMED AFTER BLK EXP LEN. 0 ;;SM.TYP...UNUSED BY COBOL RADIX 10 MAKASC(\<-$$'TYPE>) ;;SM.NMID...THE ASCII REPR OF THE ;; NUMERIC ENCODEMENT RADIX 8 MAKASK(STRING) ;;THE ACTUAL SYMBOL IFLE LEN.-5, IFLE LEN.-^D10, > KS.TAB: SYMBLK ONLY,ONLY KS.SIZ==.-KS.TAB SYMBLK SELECT,SELECTIVE SYMBLK FIRST,FIRST SYMBLK LAST,LAST SYMBLK PRIOR,PRIOR SYMBLK NEXT,NEXT SYMBLK DUPLIC,DUP SYMBLK ALL,ALL SYMBLK AREA,AREA SYMBLK RECORD,RECORD SYMBLK SET,SET SYMBLK UPDATE,UPDATE SYMBLK RETRIEV,RETRIEVAL SYMBLK RETRIEV,RETR SYMBLK RUNUNIT,RUN-UNIT SYMBLK PROT,PROTECTED SYMBLK PROT,PROT SYMBLK EXCL,EXCLUSIVE SYMBLK EXCL,EXCL SYMBLK CURR,CURRENT SYMBLK SHARED,SHARED KS.LAST: SYMBLK JOURNAL,JOURNAL KS.END==.-KS.TAB > ;END IFN $COB SUBTTL THE DBCS INTERFACE $FUNCT (VOKINI) ;;; THIS IS RATHER GROSS...U CANT WIN ALL THE TIME IFN $COB,< FUNCT BLDSY., ;31 IS ARBITRARY MOVEM R0,SYMTAB ;;; KLUDGE AWAY FUNCT ALCMEM, ;KLUDGE--DON'T WANT OFFSET OF 0 FUNCT ALCMEM,<[KS.END]> MOVEM R0,A.PT1 HRLI R0,KS.TAB MOVE R1,R0 BLT R0,KS.END-1(R1) COPI A.PT2,KS.LAST-KS.TAB(R1) FUNCT INISY., > RETURN $FUNCT (DMLVOK) ;SCH,SS,KEY PASSED AS GLOBS IFE $COB, ;FOR MGRMEM COPI UNDIDX,1 ;INIT UNDEF ARRAY SUBSCRIPT IFN $COB,< FUNCT OWRITE, ;FOR CLARITY IN LISTING ; IT'S SLOWER BUT MAKES THE REST EASIER ; COBOL PROVIDES THIS INFO IN SIXBIT ; FORDML IN ASCII -- AND THE CODE EXPECTS THE LATTER UTIL COPSIX, MOVEM R2,SCH.PT+1 UTIL COPSIX, MOVEM R2,SS.PT+1 UTIL COPSIX, MOVEM R2,KEY.PT+1 > SETZM BAS ;SYSTEM REG FOR SCHIO FUNCT OPEND%, ;A.TMP1 DUMMY ; FOR RET'D VAL OTSERR (,VOKFAIL) ;CAN'T OPEN SCHEMA FUNCT FINDR% ;THIS ENTRY POINT FINDS ROOT OF ; .SCH STRUCTURE OTSERR (,VOKFAIL) ;NO SCHEMA BLOCK IN .SCH FILE SKIPL INVSEE ;DO ONLY FOR INVOKE JRST VOKSSC COPY A.TMP1,SL.EDIT(R1) UTIL CNV.ZP ;CALL CNVSTR & ZEROPAD FUNCT OBJOUT, IFN $COB,< FUNCT OBJCNTN ;COBOL CONTINUATION BUG >;END IFN $COB VOKSSC: ;INVOKE SUB-SCHEMA CHOOSE FUNCT FIND3%, OTSERR (,VOKFAIL) ;INVALID SUB-SCHEMA NAME FOR THIS DB MOVEM R1,CRU COPI A.PT1,UL.NAM(CRU) FUNCT EQLSTR, JUMPE R0,VOKSSC ;KEEP LOOKING ;;; HAVING FOUND RIGHT ONE, GET THE USEFUL INFO OUT MOVE BMASK,UL.MASK(CRU) UTIL PARENAM, IFE $COB,< UTIL COPSIX, ;POOR NAME HAS GONE SIXBIT TO ; ASCII(STRIPPED) ;ASCII TO SIXBIT,TRUNC. & DASHES ; REMOVED ;SIXBIT TO ASCII HRRM R2,SIZONL+1 FUNCT CATSTR, FUNCT OWRITE, SKIPE VU.INCL ;LIST INCLUDE FILE? JRST [FUNCT OWRITE, ;YES JRST .+2] JRST [FUNCT OWRITE, ;NO JRST .+1] > SKIPL INVSEE ;NO BINDING FOR ACCESS STAT. JRST VOKFND MOVE R0,BMASK ;PUT OUT MASK INDEX TO IDENT SS JFFO R0,.+1 ;JUST WANT NUMBER, NO PATH SPLIT MOVEM R1,A.TMP1 ;USES REGISTER PAIR UTIL CNV.ZP ;CALL CNVSTR & ZEROPAD FUNCT OBJOUT, FUNCT OBJFLUSH ;INCLUDE AND SBIND NOW OUT VOKFND: SKIPE UL.LOK(CRU) ;IS THERE A LOCK? JRST [SKIPN R1,KEY.PT+1 ;IS LEN NON-ZERO USRERS (DMLBDK##,VOKFAIL) ;BAD KEY IN EFFECT--NOT PRES. CAILE R1,LOKMAX ;TRUNCATE IF NECES MOVEI R1,LOKMAX MOVEM R1,KEY.PT+1 COPY A.TMP1,UL.LOK(CRU) SETZM A.TMP2 ;GUARAN ASCIZ FUNCT EQLSTR, JUMPE R0,[USRERR (DMLBDK##,VOKFAIL)] JRST .+1] IFE $COB,< ;FOR COBOL, FILE TO OPEN INDEP OF SS NAME FUNCT BLDVOK, JUMPE R0,VOKFAIL COPY VOKHDR,VOKCHAN+RING FUNCT BUFINI, FUNCT VWRITE, SETOM CHRTMP ; [1101] set char indic to false SKIPG CHRFLG ; [1101] using fortran 77 char stuff? JRST [FUNCT VWRITE, ; [1101] /NOCHARACTER spec'd or ; defaulted JRST .+2] ; [1101] go write rest of SYSCOM JRST [FUNCT VWRITE, ; [1101] /CHARACTER spec'd or ; defaulted JRST .+1] ; [1101] go write rest of SYSCOM FUNCT VWRITE, ; [1101] put out rest of SYSCOM > IFN $COB,> ; [1101]no choice if cobol UTIL RECWALK ;WRITE OUT INDIV NAMES ;[1117] SETZM VOKFLG YOYO OTHNAMES ;RESOLVE JNBUF IF DATANAME VOKDON: ; GENERATE INDEXES FOR AREAS FUNCT FIND3%, JUMPE R0,VD.XIT ;YES, NOW DO TRANSACTIONS MOVEM R1,CRU TDNN BMASK,AL.SS(CRU) ;IN SUB-SCHEMA? JRST VOKDON ;NO YOYO NBUFDN ;RESOLVE AL.NBUF=DATANAME UTIL SYMALC, JRST VOKDON VD.XIT: SKIPGE INVSEE ;ACCESS OR INVOKE? SKIPN VOKFLG ; FINISH BUF DATANAME BIND JRST VOK.TR ; ACCESS OR DO NOTHING FUNCT OBJFLUSH ; THE FINAL ")" VOK.TR: ;NOW GENERATE INDICES FOR TRANSACTIONS FUNCT FIND3%, ;GET NEXT EB BLK JUMPE R0,VOK.D1 ;...DONE MOVEM R1,CRU TDNN BMASK,EL.SS(CRU) ;IN SS? JRST VOK.TR ;...NO UTIL SYMALC, JRST VOK.TR VOK.D1: FUNCT VWRITE, IFE $COB,< FUNCT VWRITE, SOSE UNDIDX ;UNDIDX REPRESENTS START PT. OF NEXT ;VAR TO GO IN UNDEF. ;SO IN TERMS OF STORAGE ALLOC IT ;IS ONE TOO BIG JRST [FUNCT CNVSTR, FUNCT VWRITE, WARN (DMLNWP##) ;DATA-NAME(S) WITHOUT PSU ENCOUNTERED JRST .+1] > SKIPGE INVSEE ;ONLY IF ACTU INVOKE JRST [FUNCT OWRITE, ;TELL RUN-TIME SYS ALL DONE BINDING JRST .+1] FUNCT VWRITE, ;MAKES COBOL HAPPY FUNCT BUFINI, IFE $COB,< ;FORDML CASE RELEAS VOKCHN, >;END $COB IFN $COB,< ;COBOL CASE IFE TOPS20,< ;12B SAME AS FORDML RELEAS VOKCHN, >;END TOPS20 >;END $COB FUNCT CLOSD%, SETO R0, ;NOTE SUCCESS RETURN VOKFAIL: MOVE P,UNWIND ;BE SAFE--UNWIND STACK TO KNOWN ; CORRECT POS FUNCT CLOSD%, ;CLEANUP BEFORE DIEING SETZ R0, RETURN SUBTTL THE LOOP THRU THE DATA NAMES $UTIL RECWALK SRLOOP: IFN $COB,< SETOM NULLREC ;START OUT WITH NULL RECORD (IE NO 02'S) > FUNCT FIND3%, JUMPE R0,LEAVE MOVEM R0,R2 ;SAVE TEMPORARILY MOVEM R1,CRU TDNN BMASK,RL.SS(CRU) ;THIS ITEM IN RBUF (GOTTEN BY GET) ;IS A MASK OF WHICH SUBS THIS REC IS IN JRST SRLOOP ;NOT THIS ONE LD R0, RL,TID,(CRU) ;IS IT SYSTEM REC CAIN R0,SYSTID JRST [SKIPL INVSEE ;YES, SHOULD WE BIND TO IT? JRST ROLOOP ;NO, OBV NO DATANAMES & SUCH, BUT DO ; PUT SETNAMES IN SYMBOL TABLE FUNCT OBJOUT, JRST ROLOOP] UTIL SYMALC, IFN $COB,< DCOPY CURREC,CURNAM ;Save qualifier name > ;;; AT THIS PT TXTIDX CONTAINS NUMERIC ID FOR RECNAM FUNCT VWRITE, SKIPE INVSEE ;IF SEEN INVOKE PUT OUT BIND JRST [FUNCT OBJOUT, ;FOR THE BIND JRST .+1] LD R1, RL,LM,(CRU) SAVE ;SAVE AWAY SINCE MAYBE SOON BYE-BYE DCOPY LEVNO,LEV2 RDLOOP: FUNCT FIND3%, JUMPE R0,RD.END MOVEM R1,CRU TDNN BMASK,DL.SS(CRU) ;DEFINED FOR THIS SCHEMA JRST RDLOOP IFN $COB, ;;; DECODE DATA NAME, POSSIBLE PSUNYM LD R1, DL,NLEN,(CRU) MOVEI R0,DL.STRING(CRU) HRLI R0,440700 DMOVEM R0,CURNAM FUNCT RELSTR, LD R1, DL,SLEN,(CRU) DMOVEM R0,TMPNAM UTIL TSTONLY UTIL DETDCL ;CALC DATTYP&SIZE DTLOOP: FUNCT FIND3%, JUMPE R0,RDLOOP MOVEM R1,CRU TDNN BMASK,TL.SS(CRU) JRST DTLOOP COPI A.PT1,TL.TEXT(CRU) FUNCT VWRITE, ;TEXT IS DATA VARYING STRING JRST DTLOOP RD.END: IFN $COB,< SKIPE NULLREC ;01 NAME. WITHOUT 02'S IS ILLEGAL ; COBOL...FUDGE IT JRST [FUNCT VWRITE, JRST .+1] > ;;; NOW THE RECORD EXTERNAL STUFF DCOPY LEVNO,LEV1 ;THE REC INDEP STUFF ;;; PUT OUT REC ASSOC VARIABLES, IF ANY ;;; IE. AREA-ID AND/OR DIRECT KEY ;;; WILL BE POINTED TO DIRECTLY BY RECBLK IF THEY EXIST RESTOR JUMPE CRU,RD.EN2 ;[1101] Skip if no Area-ID UTIL REFGET ;[1101] Get symbol JUMPN R0,RD.EN2 ;[1101] DON'T REDCL--DUPLIC OR NO PSUNYM MOVE OCC,ZERO ;[1101] Do HOWPUT by hand to allow ;[1101] for /CHARACTER in FORTRAN IFN $COB,< ;[1101] COBOL specific UTIL PUTDCL, ;[1101] >; END IFN $COB ;[1101] IFE $COB,< ;[1101] FORTRAN specific SKIPN CHRFLG ;[1101] If not /CHARACTER JRST RD.EN1 ;[1101] Use INTEGER declaration SETZM CHRTMP ;[1101] Mark as character type UTIL PUTDCL, ;[1101] CHARACTER *30 JRST RD.EN2 ;[1101] Return to common code RD.EN1: UTIL PUTDCL, ;[1101] INTEGER (6) >; END IFE $COB ;[1101] RD.EN2: RESTOR ;RL.LOC & RL.LM CAIN R1,LM.DIR JRST [UTIL REFGET JUMPN R0,.+1 ;DON'T REDCL--DUPLIC OR NO PSUNYM HOWPUT ,,ZERO JRST .+1] ;CONTINUED ; IF THIS RECORD IS OWNER OF SOME SET AND ; ANY OF ITS MEMBERS SOS IS LOC MODE OF OWNER, ; THE MEMBER MAY DEFINE AN ALIAS FOR USE IN FINDING ITS OWNER ROLOOP: FUNCT FIND3%, JUMPE R0,RD.FLU ;ASSOC WITH NO MORE SETS MOVEM R1,CRU TDNN BMASK,OL.SS(CRU) ;IS THIS SET IN CURR S-S JRST ROLOOP ; PUT SET NAMES AND INDEXES IN SYMBOL TABLE ; THIS INHERENTLY WORKS SINCE NO MEMBER RECORD CAN BE OWNED BY ; MORE THAN ONE OWNER; AND IN THIS PARTICULAR CASE THE OWNER-BLOCKS ; ARE ALL OWNED BY SOME RECORD-BLOCK UTIL SYMALC, ; NOW CONTINUE WITH ALIAS PROCESSING ALIAS2: FUNCT FIND3%, JUMPE R0,ROLOOP ;CAN'T BE A CONTROL(ALIAS) BLK UNDER ; A MEM BLK ;UNLESSTHERE IS A MEM BLK FUNCT (FIND4%,<[$R.M],KEY SET>) ;SUPPRESS CSET CURR UPDATE OTSERR (DMLSAF##,VOKFAIL) TDNN BMASK,RL.SS(R1) JRST ALIAS2 ;THIS MEM RECORD NOT IN SS ALIAS3: FUNCT FIND3%, JUMPE R0,ALIAS2 LD KEYTYP,VL,TYP,(R1) ;[1114] NEED KEY TYPE FOR LATER TEST ALIAS4: FUNCT FIND3%, JUMPE R0,ALIAS3 MOVEM R1,CRU SKIPN CL.ALIAS(CRU) ;DOES IT PT TO AN ALIAS? JRST ALIAS4 ;NO ALIAS IN THIS CB, GET ANOTHER ;;; GET ACTUAL TEXT & PUT IN PRESENTABLE FORM FUNCT FIND1%, OTSERR DMLSAF##,VOKFAIL MOVEM R1,CRU UTIL SETTST, ;;; NEW-SYMBOL (OR FOR F10 PSUNYM) ONLY THING POSSIB IF "SCHEMA" ;;; PROG OK JUMPG R0,[FILERR (,ALIAS4)] JUMPL R0,ALIAS4 ;NOTHING TO DECLARE IF NO PSEUDONYM ;[1114] SINCE THE CL FOR A DIRECT KEY ALIAS IS NOT A MEMBER OF A DC ;[1114] SET, THE FIND3% WILL NOT HAVE UPDATED DC SET CURR, SO ;[1114] HANDLE THE DBKEY ALIAS CHECK MANUALLY CAIN KEYTYP,VIA.DIR ;[1114] IF ALIAS OF DIRECT KEY JRST [HOWPUT ,,ZERO ;[1114] USAGE DBKEY JRST ALIAS4] ;[1114] FUNCT (FIND4%,<[$D.C],KEY SET>) ;SUPPR SET UPDATES OTSERR DMLSAF##,VOKFAIL ;[1114] MUST BE A DATA BLK MOVEM R1,CRU TDNN BMASK,DL.SS(CRU) ;IS THE DATA NAME ALIASED IN S-S ;;; ALIASED NAME NOT IN SS USRERS (,ALIAS4) UTIL DETDCL ;WILL APPLY TO THE DATA LK JUST GOTTEN JRST ALIAS4 ;MORE CTL BLKS FOR THIS MEM BLK? RD.FLU: SKIPL INVSEE ;NO OBJ TO FLUSH IF ACCESS JRST SRLOOP FUNCT OBJFLUSH JRST SRLOOP ;GET A NEW RECORD $YOYO (OTHNAMES) ; *** GENERATE DATA ITEM FOR JOURNAL BUFFERS ; *** BEFORE THE RECORD DEFINITIONS AND BIND IT. FUNCT FINDR% ;GET BACK TO SL OTSERR (,VOKFAIL) SKIPG CRU,SL.JNBUF(R1) ;WILL BE POS IF IS KEY OF IL JRST OTH.X ;NO, VALUE, HANDLED BY BIND SKIPGE INVSEE ;[1117] NO BIND IF ACCESS SKIPE VOKFLG ; ONLY ONE BIND STA FOR ALL BUF DN'S JRST OTH.1 FUNCT OBJOUT, SETOM VOKFLG ; REMEMBER OTH.1: UTIL REFGET HOWPUT ,,ZERO OTH.X: RETURN $YOYO (NBUFDN) ; BIND THE (BUFFER SIZE IS) DATANAME SAVE SKIPN AL.DNBUF(CRU) ; GET POSSIBLE DBK JRST NBXIT ; LOOP - NOT A DBK SKIPGE INVSEE ;[1117] NO BIND IF ACCESS SKIPE VOKFLG ; ONLY ONE BIND STA FOR ALL BUF DN'S JRST NB001 FUNCT OBJOUT, SETOM VOKFLG ; REMEMBER NB001: LD CRU,AL,DNBUF,(CRU) ; RESTORE NBUF DBK UTIL REFGET ; PUT OUT SEP AND DATANAME HOWPUT ,,ZERO NBXIT: RESTOR RETURN SUBTTL NAME PROCESSING $UTIL (REFGET) FUNCT FIND1%, OTSERR DMLSAF##,VOKFAIL MOVEM R1,CRU UTIL SETTST, RETURN $UTIL (SETTST,) ;;; COME HERE FOR DIRECT KEYS, AREA-IDS, AND ALIASES ;;; RETURNS R0: ;;; -1 IF NO PSEUDONYM (FORTRAN ONLY) ;;; 0 IF NEW SYMBOL (IE. UPDSYM INSERTED) ;;; + IF OLD SYMBOL (IE. UPDSYM FOUND RATHER THAN INSERTED) MOVEI R3,@NAM(AP) HRLI R3,440700 ;FINISH BUILDING NAME MOVE R4,-1(R3) ;GET LENGTH DMOVEM R3,CURNAM MOVEI R3,@PSU(AP) HRLI R3,440700 MOVE R4,-1(R3) DMOVEM R3,TMPNAM ;THE PSUNYM, IF ONE MOVEI SYMCOD,$IDENT ;SINCE A REFFED SYMBOL IFN $COB,< SETZM CURREC ;Don't qualify alias, etc. > JRST ST.MERG $UTIL (TSTONL) ;CURNAM & TMPNAM ALREADY SETUP MOVEI SYMCOD,$DBID ST.MERG: IFE $COB,< ;;; RULES ARE: ;;; IF PSUNYM PRESENT, USE IT ;;; ELSE...IF NAME SHORT ENOUGH JUST USE IT ;;; OTHERWISE PUT OUT UNDEF(XXX) SETOM PSUNYM ;PRESET SKIPE TMPNAM+1 ;PSUNYM OF ZERO LENGTH MEANS NONE JRST [DCOPY CURNAM,TMPNAM JRST SN.END] MOVE R4,CURNAM+1 CAIG R4,6 ;OUT OF RUNNING IMMED? SKIPE DASH ;CAN'T HAVE THESE EITHER JRST [UTIL UNDBLD UTIL PUTBIND SETOM R0 RETURN()] > SN.END: ;;; COME HERE DIRECTLY FOR COBOL, NO PSEUDONYM FANCY-FOOTWORK ;;; NECES OBVIOUSLY UTIL PUTBIND UTIL IDALC ;IDALC TAKES CURNAM AS ITS ARG RETURN ;TRANSIV RETURN R0 (MEANINGFUL ; ONLY FOR SETTST) IFE $COB,< $UTIL (UNDBLD) SETZM PSUNYM ;WOULDN'T BE HERE IF THIS WEREN'T TRUE CAIN SYMCOD,$IDENT JRST [UTIL IDALC ;SUPPRESS MSG IF ALREADY GIVEN JUMPN R0,UBID.EX ;RETURNS ADDR IF FOUND RATHER THAN ;CREATED SYMNODE WARN JRST UBID.EX] ;;; SIZONL IS SUBSTRING OF UNDEFP ALLOCATION FUNCT CNVSTR, FUNCT APPSTR, COPY CURNAM,UNDEFP ;GET RIGHT PTR HRRZ R0,UNDEFP+1 HRRZ R1,SIZONL+1 ADD R0,R1 MOVEM R0,CURNAM+1 RETURN ;NO NEED TO ALC SYM IF UNDEF UBID.EX: DCOPY CURNAM,AZERO ;UNREFERENCABLE ITEM GETS NO STORAGE RETURN > $UTIL (SYMALC,) ;EACH ACTUAL DB SYMBOL IS ASSOC WITH ; AN INDEX MOVEI R3,@NAMSYM(AP) HRLI R3,440700 MOVE R4,-1(R3) DMOVEM R3,CURNAM MOVEI SYMCOD,$DBNAME $UTIL (IDALC) ;EXPECTS IDALC & SYMCOD VALID IFE $COB,< ;;; SINCE CURNAM ALWAYS PTS INTO SCHEMA BUF ;;; STR.SV WILL COPY STRING TO PERM STRING AREA ;;; & ALTER CURNAM TO POINT THERE FUNCT STR.SV, FUNCT MGRMEM, MOVEM R0,A.PT2 > IFN $COB,< MOVE R1,CURNAM+1 IDIVI R1,5 ;GET NUM OF WHOLE WORDS INTO R1 ;JUST ASSUME NEED ONE MORE WORD ; FOR FRACT PART COPI A.PT2,SYMLEN +1(R1) ;SYMLEN SIZE OF BLK EXCLU OF STRING FUNCT ALCMEM, MOVEM R0,A.PT2 ADDI R0,SYMLEN ;START + NON-STRING-LEN=STRING ST. PT. MOVEM R0,TMPNAM FUNCT COPSTR, ;PUT IN THE PERM PLACE MOVE R0,TMPNAM ;GET IT BACK TO ALTER CURNAM ; TO SAFE PLACE HRLI R0,440700 MOVEM R0,CURNAM ;LENGTH IS OF COURSE CORRECT ALREADY > FUNCT UPDSYM, CAIN SYMCOD,$IDENT ;IF REFFED SYMBOL, DON'T PUT IN TABLE RETURN ;;; "SCHEMA" SHOULD PREVENT THIS FROM EVER OCCURRING JUMPN R0,[FILERR (,LEAVE)] LD R0, RL,NMID,(CRU) ;ANY NMID WILL DO MOVEM R0,A.TMP1 UTIL CNV.ZP MOVE R1,A.PT2 ;PUT IN SYMBOL NODE COPY SM.NMID(R1),TXTIDX COPY SM.TYP(R1),SYMCOD RETURN $UTIL (CNV.ZP) ;ZEROPAD FUNCT CNVSTR, RETURN IFE $COB,< ;COBOL NO NEED FORTRAN DEFS $UTIL (PUTDCL,) ; [1101] note that A.PT1==A.TMP1 and A.PT2==A.TMP2 ; [1101] in this module. Their global definitions, ; [1101] however, are different. SKIPN PSUNYM JRST [SETOM CHRTMP ; [1101] reset char flag RETURN] ; [1101] COPI A.PT2,@DATTYP(AP) COPI A.PT1,@DIMEN(AP) MOVE R1,CHRTMP ; [1101] is this a char type var? JUMPE R1,[ ; [1101] yes... SETOM CHRTMP ; [1101] don't use it twice SAVE ; [1101] save size COPI A.PT1,ASTRSK ; [1101] use string delimiter FUNCT VWRITE,<@A.PT2,@A.PT1> ; [1101] put out type * RESTOR ; [1101] get back size FUNCT VWRITE,<@A.PT1> ; [1101] and write it ; [1101] put a space followed by name COPY A.PT1,[ASCII/ /] ; [1101] get a space FUNCT VWRITE, ; [1101] write it out ; [1101] occurs clause? SKIPN R0,OCC ; [1101] OCC contains times-occurs JRST PD.CMN ; [1101] no, go exit MOVEM OCC,A.TMP2 ; [1101] yes...process it ; [1101] get size of occurs into ascii FUNCT CNVSTR, ; [1101] COPY A.PT2,[ASCII/)/] ; [1101] surround by parens MOVE R0,[ASCII/(/] ; [1101] MOVEM R0,A.PT1 ; [1101] FUNCT VWRITE, ; [1101] write it JRST PD.CMN] ; [1101] go to common exit ; [1101] here if NON-CHARACTER DATA ; [1101] about to write TYPE followed by NAME followed by "(". ; [1101] The actual process is to have A.PT1 pointing to the ; [1101] string "(NNN" where NNN is the size of the var. ; [1101] If the var is one-dimensional, A.PT1+1 will contain ; [1101] zero so that no left paren is written. FUNCT VWRITE,<@A.PT2,CURNAM,@A.PT1> ;;; WAS THERE AN OCCURS CLAUSE? ;;; IS TIMES-OCCURS IF GT 0 JUMPG OCC,[ MOVEM OCC,A.TMP2 FUNCT CNVSTR, COPY A.TMP2,[ASCII/)/] MOVE R1,A.PT1 MOVE R0,[ASCII/,/] ;PRESET FOR DIMEN-ED BLK CASE ;;; IF STRING'S LEN 0, JUST THE "OCCURS" DIMEN SKIPN 1(R1) MOVE R0,[ASCII/(/] MOVEM R0,A.TMP1 JRST .+2] JRST [HLLZS SIZONL+1 ;NOTE NO OCCURS MOVE R1,A.PT1 ;;; IDENT WILL BE UNDIM-ED IF THIS 0, SO SKIP VWRITE SKIPN 1(R1) JRST PD.CMN COPY A.TMP2,[ASCII/)/] JRST .+1] FUNCT VWRITE, PD.CMN: FUNCT VWRITE, RETURN > IFN $COB,< $UTIL (PUTDCL,) COPI A.PT2,@PICT(AP) COPI A.PT1,@USAG(AP) FUNCT VWRITE, SKIPE @A.PT2 ;NO PICTURE (DON'T PUT OUT KEYWORD ; PICTURE) JRST [FUNCT VWRITE, JRST .+1] FUNCT VWRITE,<@A.PT1> JUMPG OCC,[ MOVEM OCC,A.TMP1 FUNCT CNVSTR, FUNCT VWRITE, JRST .+1] FUNCT VWRITE, RETURN > $UTIL (PUTBIND) SKIPL INVSEE ;FOR ACCESS NO BIND CODE RETURN IFE $COB,< ;Only qualify COBOL references FUNCT OBJOUT, > ;End IFN IFN $COB,< ;Qualify COBOL references FUNCT OBJOUT, ;Seperate the data-names FUNCT OBJCNTN ;Each data-name on own line FUNCT OBJOUT, ;Data-name SKIPN CURREC ;Qualifier specified? JRST PUTBEX ;...No, go exit FUNCT OBJOUT, ;...Yes, put it out PUTBEX: > ;End IFN RETURN SUBTTL SPECIAL STRING PROCESSING REG(C1,R3) ;FOR VISUAL CLARITY $UTIL (COPSIX,) MOVEI R1,@SOURCE(AP) HRLI R1,440600 ;SET UP SOURCE BP MOVE R0,@DEST(AP) ;IS 1ST WORD OF STRPTR MOVE R4,@LENMAX(AP) SETZM R2 SETZM DASH COP.LP: ILDB C1,R1 JUMPE C1,LEAVE IFE $COB,< CAIN C1,'-' SETOM DASH > IFN $COB,< ;COBOL (UNBELIEVABLY) MAKES DASHES ; COLONS CAIN C1,':' JRST [SETOM DASH MOVEI C1,'-' JRST .+1] > ADDI C1,40 IDPB C1,R0 CAMGE R2,R4 ;MAXIMUM LEN OF SOURCE AOJA R2,COP.LP RETURN $UTIL PARENAM, SETZM @DEST(AP) ;IN CASE REAL SHORT MOVEI R0,@DEST(AP) HRLI R0,440600 MOVEI R4,6 MOVEI R1,@SOURCE(AP) ;A STRING PTR HRRZ R2,1(R1) MOVE R1,0(R1) PAR.LP: ILDB C1,R1 CAIN C1,"-" JRST PAR.E2 SUBI C1,40 ;ASC TO SIX IDPB C1,R0 SOSLE R4 PAR.E2: SOJG R2,PAR.LP ;TWO CONDS: IS DEST FULL? IS SOURCE ; EXHAUSTED? RETURN SUBTTL DATA TYPE AND SIZE PROCESSING DEFINE SETHOW< IFN $COB,< MOVEI R0,DL.STRING(CRU) HRLI R0,440700 MOVEM R0,PICBP LD R1, DL,NLEN,(CRU) LD R0, DL,SLEN,(CRU) ADD R1,R0 IBP PICBP SOJG R1,.-1 LD R0, DL,PLEN,(CRU) MOVEM R0,PICBP+1 > IFE $COB,< SETZM SIZTXT+1 ;;PRESET FOR NOT A STORAGE BLK SKIPL PSUNYM AOS UNDIDX ;IS NO PSUNYM, FOR NOW ASSUME ITEM 1 ; WORD LONG > > $UTIL (DETDCL) SETHOW LD OCC, DL,OCC,(CRU) ;FOR OCCURS CLAUSE CHKING SKIPE INVSEE ;DON'T PROCESS OCCURS FOR ACCESS JUMPG OCC,[ ;NECES TO BIND TO SUBSCRIPTED QUAN? FUNCT OBJOUT, ;YES JRST .+1] LD R2, DL,SIZ,(CRU) LD R1, DL,TYP,(CRU) CAILE R1,DT.MAX ;NUM OF DT-1 DD.LDR: DD.XBC: DD.XDC: DD.LDC: OTSERR DMLSAF##,VOKFAIL CASE R1, IFN $COB,< ;;; HERE IS "SIZE" PHRASE COPI R3,NULSTR ;DEFAULT FOR STRUCTURES LDB R0,[POINT 6,DL.OFF(CRU),11] ;GET BYTE SIZE TO DETERMINE ; USAGE MODE CAIN R0,6 ;SIXBIT? COPI R3,USD6 ;YES CAIN R0,7 ;NO, ASCII? COPI R3,USD7 ;YES CAIN R0,^D8 ;NO, EBCDIC? COPI R3,USD9 ;YES UTIL PUTDCL, ;PUT OUT NAME, OCCURS, RETURN ;...AND A POSSIBLE USAGE MODE DD.XBR: UTIL PUTDCL, RETURN DD.XDR: ;;; COMP-3 IS FIXED DEC REAL UTIL PUTDCL, RETURN DD.LBR: CAILE R2,1 ;IS IT REAL OR REAL*8 JRST DD.LBC ;TREAT LIKE COMPLEX UTIL PUTDCL, RETURN DD.LBC: ;;; ENCODE F10 COMPLEX UTIL PUTDCL, ;DOUBLE COMP=S9(18) RETURN DD.D6: UTIL PUTDCL, RETURN DD.D7: UTIL PUTDCL, RETURN DD.D9: UTIL PUTDCL, RETURN DD.DBK: UTIL PUTDCL, RETURN > IFE $COB,< ;;; PROCESS "SIZE" PHRASE ON FALL-THRU LDB R0,[POINT 6,DL.OFF(CRU),11] ;GET SIZE BYTE CAIN R0,^D36 MOVEI R1,1 CAIN R0,^D9 MOVEI R1,4 CAIN R0,7 MOVEI R1,5 CAIN R0,6 MOVEI R1,5 ;KEEP WITH CONVERSION POTENTIAL ; PHILOSOPHY SKIPE CHRFLG ; [1101] using char data stuff? CAIE R0,7 ; [1101] is this display 7? SKIPA ; [1101] JRST DD.CH ; [1101] use char data handler UTIL DISPSIZ ; [1101] determine size UTIL PUTDCL, ; [1101] write it RETURN ; [1101] DD.XBR: CAILE R2,1 ;DOUBLE PREC JRST [UTIL PUTDCL, ;YES RETURN()] UTIL PUTDCL, RETURN DD.XDR: ;;; COBOL COMP-3 MOVEI R1,4 ;LIKE DISP-9 UTIL DISPSIZ UTIL PUTDCL, RETURN DD.LBR: CAILE R2,1 JRST [UTIL PUTDCL, RETURN()] UTIL PUTDCL, RETURN DD.LBC: UTIL PUTDCL, RETURN DD.D6: MOVEI R1,CPW UTIL DISPSIZ UTIL PUTDCL, RETURN DD.D7: MOVE R1,CHRFLG ; [1101] did he specify or default ; [1101] character text? JUMPG R1,DD.CH ; [1101] if so, process as character MOVEI R1,CPW ; [1101] set up for dispsiz UTIL DISPSIZ ; [1101] set up sizes UTIL PUTDCL, ; [1101] else proceed normally RETURN ; [1101] DD.CH: SETZM CHRTMP ; [1101] flag as character for later LD R2, DL,SIZ,(CRU) ; [1101] get size MOVEM R2,A.TMP2 ; [1101] ; [1101] put size in ascii into SIZONL FUNCT CNVSTR, ; [1101] UTIL PUTDCL, ; [1101] put out CHARACTER instead ; [1101] of INTEGER RETURN ; [1101] DD.D9: ;;; EBCDIC IS 4 CHARS PER WORD MOVEI R1,4 UTIL DISPSIZ UTIL PUTDCL, RETURN DD.DBK: UTIL PUTDCL, RETURN $UTIL (DISPSIZ) LD R2, DL,SIZ,(CRU) IDIV R2,R1 SKIPE R3 ADDI R2,1 ;A REMAINDER MEANS NEED PART OF NXT WD CAIG R2,1 ;SUBSCRIPT? RETURN ;DON'T BOTHER WITH SHORT STRING SKIPL PSUNYM JRST [SKIPE OCC ;IF NO OCCURS, SIZE ALREADY OK IMUL R2,OCC ;IF N BLKS SIZE IS OBV. BLKSIZ*HOW-MANY ADDM R2,UNDIDX ;MAK UNDEF ARRAY BIGGER SOS UNDIDX ;UNDO THE AOS AT TOP RETURN] MOVEM R2,A.TMP2 FUNCT CNVSTR, HRRZ R0,SIZONL+1 ;INCLUDE "(" BY PROP SUBSUM SIZONL ; UNDER SIZTXT ADDI R0,1 MOVEM R0,SIZTXT+1 RETURN > ;END IFE $COB END