@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             LIB042C
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YLIB042C
~S~M~OLIBRARY IMPLEMENTATION DESCRIPTION
~S~M~OSection 4 Version 2C
~S~OSection 4.2C Document Name Processing
~S~O1. General Description
~BThis module provides facilities for operating on the strings
which constitute document names.
~S~O2. Interfaces
~
Interface Procedures:~
   PROCESS.NAME(DOCUMENT.NAME)FILE.NAME~
   COPY.NAME(SOURCE,DEST)NAME~
~S~O2.1 PROCESS NAME(DOCUMENT.NAME)FILE.NAME
~BThis procedure scans the string passed as a parameter to identify
the type of document corresponding to it.  PW1 is set to the document
type, as follows:~
~T# 10 14
~
#0~ICurrent file (or current stream)~
#1~IFile~
#2~IProcess~
#3~IReply message (REPn*)~
#4~IStream number (STRn*)~
#5~IScratch output document (*)~
#6~IMessage channel (CHn*)~
~
Additional information is returned according to the type of
document.~
~T# 5 15 18
~
#File#-~IPWW1 contains the user name. The result of the procedure
call is a pointer to the filename (pathname).~
~
#Process#-~IPWW1 contains the process name component~
##~IPWW2 contains the machine name component.~
~
#Reply or#-~IPW2 holds the stream number, i.e. the 'n'~
#stream#~Icomponent of REPn*, STRn* or CHn*.~
~
Control characters appearing in the parameter delimit the name
so that, for example, leading and trailing spaces are discarded.
~S~O2.2 COPY.NAME(SOURCE,DEST)NAME
~BThis procedure copies a name from the source vector to the
destination vector, returning a pointer to the name as a result.
If the source is larger than the destination vector, the name is
truncated.
~S~O3. Implementation
~BSee flowcharts.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                LIB042C
~V9 -1
~F
@TITLE LIB04(2C,11)

@COL 1S-4R
@FLOW 1-4
@BOX 1.0
DOCUMENT NAME PROCESSING
@BOX 4.0
PROCEDURES IN SUB-SECTION
   1 PROCESS NAME
   2 COPY NAME
@BOX 1.1
::DOCUMENT NAME PROCESSING SUB MODULE
@BOX 4.1
#LIB04.1
#LIB04.2
**IN -1
@END


@TITLE LIB04/1(2C,11)

@COL 1S

@BOX 1.0
DOCUMENT NAME PROCESSING PSPECS
@BOX 1.1
LSPEC PROCESS.NAME (ADDR [LOGICAL8]) / ADDR [LOGICAL8];
PSPEC COPY.NAME (ADDR [LOGICAL8], ADDR [LOGICAL8]) / ADDR [LOGICAL8];
**IN -1
@END


@TITLE LIB04.1(2C,11)

@COL 13R-14R-15R-16R-17N
@COL 1S-2R-3T-4T-5R-6T-7T-8T-9T-10R-11N-12F
@COL 18R-19R-20R-21N

@ROW 13-7
@ROW 4-18
@ROW 17-11-21

@FLOW 1-2-3NO-4NO-5-6NO-7NO-8NO-9NO-10-11-12
@FLOW 3YES-18-21-11
@FLOW 4YES-19-20-21
@FLOW 6YES-13-17-11
@FLOW 7YES-14-17
@FLOW 8YES-15-17
@FLOW 9YES-16-17

@BOX 1.0
PROCESS NAME (DOCUMENT)
@BOX 2.0
PRODUCE POINTER TO VALID
PART OF DOCUMENT NAME
@BOX 3.0
CURRENT FILE?
@BOX 4.0
FILE NAME?
@BOX 5.0
GENERATE PROCESS OR STREAM
NAME IN PWW1
@BOX 6.0
DISCARD?
@BOX 7.0
MESSAGE CHANNEL?
@BOX 8.0
REPLY STREAM?
@BOX 9.0
NUMBERED STREAM?
@BOX 10.0
RETURN VALUE 2
FOR MESSAGE STREAM
@BOX 12.0
END
@BOX 13.0
RETURN VALUE 5
FOR DISCARD STREAM
@BOX 14.0
RETURN VALUE 6
FOR MESSAGE CHANNEL
@BOX 15.0
RETURN VALUE 3 AND
NUMBER OF REPLY STREAM
@BOX 16.0
RETURN VALUE 4 AND
NUMBER OF DEFINED STREAM
@BOX 18.0
RETURN VALUE 0
FOR CURRENT FILE
@BOX 19.0
RETURN VALUE 1
FOR NAMED FILE
@BOX 20.0
DIVIDE DOCUMENT NAME INTO
USERNAME AND FILENAME COMPONENTS
@BOX 1.1
PROC PROCESS.NAME (DOC);
INTEGER I, J, S;
ADDR [LOGICAL8] PTR;
LOGICAL32 N, N1, N2;
LITERAL / ADDR [LOGICAL8] NIL =;
@BOX 2.1
SIZE (DOC) => S;
-1 => I => J;
WHILE 1 +> I < S AND
   DOC^ [I] =< %20 DO OD
WHILE 1 +> J + I < S AND
   DOC^ [I + J] > %20 < %7F DO OD
IF J = 0 OR
   J = 1 AND DOC^ [I] = "0" THEN
   NIL => PROCESS.NAME;
   0 => J;
ELSE
   PART (DOC, I, I + J - 1) => PTR => PROCESS.NAME;
FI
0 => PWW1 => PWW2 => PW2;
@BOX 3.1
IF J = 0
@BOX 4.1
-1 => S;
WHILE 1 +> S < J AND
   PTR^ [S] /= "*" DO OD
IF S = J
@BOX 5.1
-1 => I;
WHILE 1 +> I < S DO
   PWW1 <<- 8 ! PTR^ [I] => PWW1;
OD
IF 1 +> S /= J AND PTR^ [S] = "/" THEN
   WHILE 1 +> S < J DO
      PWW2 <<- 8 ! PTR^ [S] => PWW2;
   OD
FI
@BOX 6.1
IF I = 0
@BOX 7.1
PWW1 => N;
PWW1 ->> 8 => N1;
PWW1 ->> 16 => N2;
IF N1 = "CH"
@BOX 8.1
IF N1 = "REP" OR N2 = "REP"
@BOX 9.1
IF N1 = "STR" OR N2 = "STR"
@BOX 10.1
2 => PW1;
@BOX 12.1
END
@BOX 13.1
5 => PW1;
@BOX 14.1
6 => PW1;
N & %F => PW2;
@BOX 15.1
3 => PW1;
N & %F => PW2;
IF N2 = "REP" THEN
   N1 & %F * 10 +> PW2;
FI
@BOX 16.1
4 => PW1;
N & %F => PW2;
IF N2 = "STR" THEN
   N1 & %F * 10 +> PW2;
FI
@BOX 18.1
0 => PW1;
@BOX 19.1
1 => PW1;
@BOX 20.1
-1 => S;
WHILE 1 +> S < J AND
   PTR^ [S] /= ":" DO OD
IF S /= J THEN
   -1 => I;
   WHILE 1 +> I < S DO
      PWW1 <<- 8 ! PTR^ [I] => PWW1;
   OD
   IF 1 +> S = J THEN
      NIL => PROCESS.NAME;
   ELSE
      PART (PTR, S, J - 1) => PROCESS.NAME;
   FI
FI
@END



@TITLE LIB04.2(2C,11)

@COL 1S-2R-3R-4F

@FLOW 1-2-3-4

@BOX 1.0
COPY NAME (SOURCE, DEST) NAME
@BOX 2.0
FIND SIZE OF NAME
@BOX 3.0
COPY CHARACTERS OF NAME
@BOX 4.0
END
@BOX 1.1
PROC COPY.NAME (SRC, DEST);
INTEGER S, I;
@BOX 2.1
IF SIZE (SRC) => S > SIZE (DEST) THEN
   SIZE (DEST) => S;
FI
@BOX 3.1
FOR I < S DO
   SRC^ [I] => DEST^ [I];
OD
MAKE (LOGICAL8, S, BYTE (DEST)) => COPY.NAME;
@BOX 4.1
END
@END



