HPlogo MPE XL Native Language Programmer's Guide: 900 Series HP 3000 Computer Systems > Appendix F Example Programs

Compare Character Strings from an SPL Program

» 

Technical documentation

Complete book in PDF
» Feedback

 » Table of Contents

 » Index

The example shows a new KSAM/3000 file built programmatically. This new KSAM/3000 file is built with a language attribute. This means the keys are sorted according to the collating sequence of this language. After building the file, it is filled with 15 hard-coded data records.

Perform a generic FFINDBYKEY with a partial key of length1 containing "E". This should position the KSAM/3000 file pointer to the very first record whose key starts with any kind of "E".

After locating this record, read all subsequent records in the file sequentially and call NLKEYCOMPARE to check whether the key found is what was requested. If the result returned by NLKEYCOMPARE is 3, there are no more records starting with any kind of "E".

  1   $CONTROL USLINIT

  2   BEGIN

  3      LOGICAL ARRAY

  4         L'ERROR      (0:1),

  5         L'KSAM'PARAM (0:79),

  6         L'PRINT      (0:39),

  7         L'RECORD     (0:4),

  8         COLL'TABLE   (0:399);

  9

 10      BYTE ARRAY

 11         FILENAME     (0:7),

 12         GEN'KEY      (0:4),

 13         KEY          (0:4),

 14         B'KSAM'PARAM(*) = L'KSAM'PARAM,

 15         B'PRINT(*)      = L'PRINT,

 16         B'RECORD(*)     = L'RECORD;

 17

 18      DOUBLE ARRAY

 19         D'KSAM'PARAM(*) = L'KSAM'PARAM;

 20

 21      BYTE POINTER

 22         BP'PRINT;

 23

 24      INTEGER

 25         I,

 26         LGTH,

 27         FNUM,

 28         RESULT,

 29         LANGNUM;

 30

 31      LOGICAL

 32         FOPTIONS,

 33         AOPTIONS;

 34
 35      LOGICAL ARRAY

 36         L'DATA(0:74) :=

 37

 38                 <<  |key |  >>

 39                  "014hBBeZZZ",

 40                  "011EZqrzyx",

 41                  "001ABCDXXX", << This is the data, to>>

 42                  "007EdCDxyx", << be written to the   >>

 43                  "012IzzAzzz", << KSAM file.          >>

 44                  "015iABDYZY", << The key starts in   >>

 45                  "005eLDFyxy", << column 4 and is 4   >>

 46                  "002BBCdxxx", << characters long.    >>

 47                  "003EaBCXXX",

 48                  "008\\aaYZZ",

 49                  "004eABCYYY",

 50                  "006EabcYYY",

 51                  "009Ayzz",

 52                  "010eaxfxyz",

 53                  "013FGHIzqs";

 54

 55   << The following DEFINE statement defines the layout of

 56      the KSAM parameter array; necessary to build a KSAM

 57      file programmatically.>>

 58

 59      DEFINE

 60         KEY'FILE     = L'KSAM'PARAM#,

 61         KEY'FILE'SIZ = D'KSAM'PARAM(2)#,

 62         KEY'DEV      = L'KSAM'PARAM(6)#,

 63         LANGUAGE     = L'KSAM'PARAM(10)#,

 64         FLAGWORD     = L'KSAM'PARAM(15)#,

 65         NUM'OF'KEYS  = L'KSAM'PARAM(16)#,

 66         KEY'TYPE     = L'KSAM'PARAM(17).(0:4)#,

 67         KEY'LENGTH   = L'KSAM'PARAM(17).(4:12)#,

 68         KEY'LOCATION = L'KSAM'PARAM(18)#,

 69         DUP'FLAG     = L'KSAM'PARAM(19).(0:1)#,

 70         KEY'BLOCK    = L'KSAM'PARAM(19).(1:15)#,

 71         RANDOM'FLAG  = L'KSAM'PARAM(20).(8:1)#;

 72

 73      DEFINE

 74

 75         RECORD       = L'DATA (I * 5)#,

 76

 77         ERROR'CHECK  = IF L'ERROR(0) <> 0 THEN

 78                           QUIT #,

 79

 80         CCNE         = IF <> THEN

 81                           QUIT #,

 82

 83         DISPLAY      = MOVE B'PRINT := #,

 84
 85         ON'STDLIST   = ,2;

 86                        @BP'PRINT := TOS;

 87                        LGTH := LOGICAL(@BP'PRINT) -

 88                                LOGICAL(@B'PRINT);

 89                        PRINT(L'PRINT, -LGTH, 0) #;

 90

 91      INTRINSIC

 92         FOPEN,

 93         FREAD,

 94         FWRITE,

 95         FCLOSE,

 96         FFINDBYKEY,

 97         FGETKEYINFO,

 98         PRINTFILEINFO,

 99         NLINFO,

100         NLKEYCOMPARE,

101         FCLOSE,

102         PRINT,

103         QUIT,

104         READ;

105

106   << Initializing the arrays.>>

107

108      MOVE L'KSAM'PARAM     := " ";

109      MOVE L'KSAM'PARAM(1)  := L'KSAM'PARAM(0),(79);

110

111      MOVE GEN'KEY          := "    ";

112

113      MOVE KEY              := "    ";

114

115   << Hard-code the language used to 8 (GERMAN).>>

116

117      LANGNUM := 8;

118

119   << Call in the collating sequence table.

120      This is done by calling NLINFO ITEM 11.>>

121

122      NLINFO (11, COLL'TABLE, LANGNUM, L'ERROR);

123      IF L'ERROR(0) THEN

124         QUIT(1000 + L'ERROR(0));

125

126   << Build a new KSAM file with the data file name

127      KD008. The key file has the name KK008.>>

128

129   << Set the values for KSAM parameter array.>>

130

131      MOVE FILENAME := "KD008   ";  << KSAM data file>>

132      MOVE KEY'FILE := "KK008   ";  << KSAM key  file>>

133
134      NUM'OF'KEYS      := 1;        << Num of keys = 0   >>

135      LANGUAGE         := LANGNUM;  << Set the language  >>

136      FLAGWORD.(11:1)  := 1;        << Indicates that    >>

137                                    << language is set   >>

138      KEY'FILE'SIZ     := 200D;     << Max. 200 entries  >>

139      KEY'TYPE         := 1;        << Byte key          >>

140      KEY'LENGTH       := 4;        << 4 byte length     >>

141      KEY'LOCATION     := 4;        << Key start at col.4>>

142      DUP'FLAG         := 1;        << Allow dupl. keys  >>

143      KEY'BLOCK        := 10;       << Keys per block 10 >>

144

145      FOPTIONS         := %4000;    << KSAM file         >>

146      AOPTIONS         := %5;       << Update            >>

147

148      FNUM := FOPEN(FILENAME,FOPTIONS,AOPTIONS,-10,,

149                                      B'KSAM'PARAM);

150      IF <> THEN

151         BEGIN

152            PRINTFILEINFO(FNUM);

153            QUIT(2000);

154         END;

155

156   << Copy the hard-coded data into the KSAM file.>>

157      I := -1;

158      WHILE (I := I + 1) < 15 DO

159      BEGIN

160         FWRITE(FNUM, RECORD, -10, %0);

161         IF <> THEN

162            BEGIN

163               PRINTFILEINFO(FNUM);

164               QUIT(3000);

165            END;

166      END;

167

168   << Perform a generic FFINDBYKEY with a partial         >>

169   << key of length 1 and value "E". The realtional       >>

170   << operator will be 2 (greater or equal).              >>

171   << FFINDBYKEY will position the KSAM pointer at the    >>

172   << first record starting with any kind of "E".         >>

173

174      MOVE GEN'KEY := "E";

175

176      FFINDBYKEY(FNUM, GEN'KEY, 0, 1, 2);

177      IF <> THEN

178         BEGIN

179            PRINTFILEINFO(FNUM);

180            QUIT(4000);

181         END;

182
183   << Read the subsequent entries and check by            >>

184   << using NLKEYCOMPARE whether an exact match was found.>>

185   << When NLKEYCOMPARE returns a 3 as a result, the      >>

186   << program is beyond the range of valid keys.          >>

187   << If an exact match was found, the record is printed. >>

188

189      RESULT := 0;

190      DISPLAY

191      "THE FOLLOWING RECORDS MATCH GEN-KEY (E) EXACTLY:"

192      ON'STDLIST;

193      WHILE RESULT <> 3 DO

194      BEGIN

195         FREAD(FNUM,L'RECORD,-10);

196         IF <> THEN

197            BEGIN

198               PRINTFILEINFO(FNUM);

199               QUIT(5000);

200            END;

201

202         MOVE KEY := B'RECORD(3),(4);

203         NLKEYCOMPARE(GEN'KEY, 1, KEY, 4, RESULT, LANGNUM,

204                                     L'ERROR, COLL'TABLE);

205         ERROR'CHECK(9000 + L'ERROR(0));

206         IF RESULT = 0 THEN           << exact hit >>

207            BEGIN

208               DISPLAY B'RECORD,(10) ON'STDLIST;

209            END;

210      END;

211

212   << Close the KSAM file and purge it.                     >>

213

214      FCLOSE(FNUM, 4, 0);

215

216   END.

Executing the program results in the following:

:RUN PROGRAM



THE FOLLOWING RECORDS MATCH GEN-KEY (E) EXACTLY:

003EaBCXXX

007EdCDxyx

011EZqrzyx



END OF PROGRAM

:
Feedback to webmaster