home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / PHONE.ZIP / PHONE.PAS
Encoding:
Pascal/Delphi Source File  |  1987-01-27  |  14.4 KB  |  498 lines

  1. (*   THIS PROGRAM PUROSES ARE :
  2.           1. READ IN A TEXT FILE (INFILE) AND SORT IT
  3.           2. READ IN A SEARCH FILE (SEARCH)
  4.           3. IF GIVEN A NAME OR A TELEPHONE NUMBER, SEARCH
  5.              IT TO SEE IF THE NAME OR NUMBER EXIST.
  6.           4. PRINT THE ANSWER IN AN OUTPUT FILE (OUTFILE)
  7.  
  8.       THE PROGRAM ITSELF IS DIVIDED INTO 11 DIFFERENT PARTS.
  9.  
  10.    PROCEDURE 1 : THIS IS A BINARY SEARCH FUNCTION THAT SEARCHES FOR NAMES.
  11.    (SEARCHER)
  12.    PROCEDURE 2 : THIS PROCEDURE STORES PHONE NUMBERS.
  13.    (INSERTPHONE)
  14.    PROCEDURE 3 : THIS PROCEDURE INSERTS LAST NAMES.
  15.    (INSERTLN)
  16.    PROCEDURE 4 : THIS PROCEDURE INSERTS FIRST NAMES.
  17.    (INSERTFN)
  18.    PROCEDURE 5 : THIS PROCEDURE READS THE DATA FROM THE INPUT FILE (INFILE).
  19.    (READTEXT)
  20.    PROCEDURE 6 : THIS PROCEDURE READS IN THE NAMES FROM THE SEARCH
  21.    (READNAME)         FILE (SEARCH).
  22.    PROCEDURE 7 : THIS PROCEDURE PRINTS OUT THE SEARCHED INFORMATIONS TO
  23.    (WRITEOUT)         AN OUTPUT FILE (OUTFILE).
  24.    PROCEDURE 8 : THIS PROCEDURE IS A FUNCTION THAT SEARCHES FOR FIRST NAME.
  25.    (FIRSTSEARCH)
  26.    PROCEDURE 9 : THIS PROCEDURE IS A FUNCTION THAT SEARCHES FOR TELEPHONE
  27.    (PHONESEARCH)      NUMBER.
  28.    PROCEDURE 10 : THIS PROCEDURE CHECKS THE FIRST CHARACTER OF THE SEARCH
  29.    (WORDNUMSEARCH)     FILE AND SENDS THEM TO EITHER
  30.                        PROCEDURE 8 OR PROCEDURE 9.
  31.    PROCEDURE 11 : THIS IS THE MAIN PROCEDURE.
  32.  
  33.  
  34.    NOTE : THIS WORK WITH BERKELEY PASCAL. (HAVE NOT TRY THIS WITH TURBO) *)
  35.  
  36.  
  37. PROGRAM TELEPHONE(INFILE,OUTFILE,SEARCH);
  38.  
  39. CONST
  40.   BLANK           = ' ';
  41.   MAX             = 20;
  42.   MAXLASTNAME     = 20;
  43.   MAXLASTNAMES    = 30;
  44.   MAXSAMELASTNAME = 20;
  45.   MAXFIRSTNAME    = 20;
  46.   MAXSTREET       = 45;
  47.   MAXCITY         = 20;
  48.   MAXSTATE        = 2;
  49.   MAXPHONE        = 200;
  50.  
  51. TYPE
  52.   LASTNAMEHOLDER  = PACKED ARRAY[1..MAXLASTNAME] OF CHAR;
  53.   FIRSTNAMEHOLDER = PACKED ARRAY[1..MAXFIRSTNAME] OF CHAR;
  54.   STREETHOLDER    = PACKED ARRAY[1..MAXSTREET] OF CHAR;
  55.   CITYHOLDER      = PACKED ARRAY[1..MAXCITY] OF CHAR;
  56.   STATEHOLDER     = PACKED ARRAY[1..MAXSTATE] OF CHAR;
  57.   ONEPERSON = RECORD
  58.                 FIRSTNAME : FIRSTNAMEHOLDER;
  59.                 STREET   : STREETHOLDER;
  60.                 CITY      : CITYHOLDER;
  61.                 STATE     : STATEHOLDER;
  62.                 ZIPCODE   : INTEGER;
  63.                 PHINDEX   : INTEGER
  64.               END;
  65.  
  66.    LASTNAMES = RECORD
  67.                  LASTNAME       : LASTNAMEHOLDER;
  68.                  LASTENTRY      : INTEGER;
  69.                  SAMELASTNAME   : ARRAY[1..MAXSAMELASTNAME] OF ONEPERSON
  70.                END;
  71.  
  72.    STRUCTURE = ARRAY[1..MAXLASTNAMES] OF LASTNAMES;
  73.    PHONEBLOCK = RECORD
  74.                   PHONE         : INTEGER;
  75.                   LASTINDEX     : INTEGER;
  76.                   FIRSTINDEX    : INTEGER
  77.                 END;
  78.  
  79.    PHONES = ARRAY[1..MAXPHONE] OF PHONEBLOCK;
  80.    WORDS = SET OF CHAR;
  81.  
  82. VAR
  83.   DIRECTORY : STRUCTURE;
  84.   BUFFER    : ONEPERSON;
  85.   PHONELIST : PHONES;
  86.   INFILE    ,
  87.   OUTFILE   ,
  88.   SEARCH    : TEXT;
  89.   TEMPFIRST : FIRSTNAMEHOLDER;
  90.   TEMPLAST  : LASTNAMEHOLDER;
  91.   CH        : CHAR;
  92.   PH          ,
  93.   I           ,
  94.   RPH         ,
  95.   NAMECOUNTER ,
  96.   PHONECOUNT  ,
  97.   FIRSTINDEX  ,
  98.   LASTINDEX   ,
  99.   INDEX       : INTEGER;
  100.   CHARACTERS  : WORDS;
  101.  
  102. (*                 FUNCTION SEARCH                         *)
  103.  
  104. FUNCTION SEARCHER(NAMECOUNTER:INTEGER;TEMPLAST:LASTNAMEHOLDER):INTEGER;
  105.  
  106. VAR
  107.   POINT      ,
  108.   LEFTSIDE   ,
  109.   RIGHTSIDE  : INTEGER;
  110.   FINISH     : BOOLEAN;
  111.  
  112. BEGIN
  113.   LEFTSIDE  := 1;
  114.   RIGHTSIDE := NAMECOUNTER;
  115.   FINISH    := FALSE;
  116.   WHILE (LEFTSIDE <= RIGHTSIDE) AND (NOT FINISH) DO
  117.    BEGIN
  118.      POINT := (LEFTSIDE + RIGHTSIDE) DIV 2;
  119.      IF DIRECTORY[POINT].LASTNAME = TEMPLAST
  120.        THEN FINISH := TRUE
  121.        ELSE IF DIRECTORY[POINT].LASTNAME > TEMPLAST
  122.               THEN RIGHTSIDE := POINT - 1
  123.               ELSE LEFTSIDE := POINT + 1
  124.    END;
  125.   IF LEFTSIDE < RIGHTSIDE
  126.     THEN SEARCHER := POINT
  127.     ELSE SEARCHER := 0
  128. END;
  129.  
  130. (*                 PROCEDURE STORE PHONE NUMBERS            *)
  131.  
  132. PROCEDURE INSERTPHONE(VAR PHONECOUNT:INTEGER;VAR LASTINDEX,FIRSTINDEX:
  133.                       INTEGER;PH : INTEGER);
  134.  
  135. VAR
  136.   I     ,
  137.   J     ,
  138.   COUNT : INTEGER;
  139.   FINISH : BOOLEAN;
  140.  
  141. BEGIN
  142.   COUNT := PHONECOUNT;
  143.   FINISH := FALSE;
  144.   WHILE (COUNT >= 1) AND (NOT FINISH) DO
  145.     IF PHONELIST[COUNT].PHONE < PH
  146.       THEN FINISH := TRUE
  147.       ELSE BEGIN
  148.              PHONELIST[COUNT + 1] := PHONELIST[COUNT];
  149.              I := PHONELIST[COUNT + 1].FIRSTINDEX;
  150.              J := PHONELIST[COUNT + 1].LASTINDEX;
  151.              DIRECTORY[J].SAMELASTNAME[I].PHINDEX := COUNT + 1;
  152.              COUNT := COUNT - 1
  153.            END;
  154.    PHONELIST[COUNT + 1].PHONE := PH;
  155.    PHONELIST[COUNT + 1].LASTINDEX := LASTINDEX;
  156.    DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].PHINDEX := COUNT + 1;
  157.    PHONELIST[COUNT + 1].FIRSTINDEX := FIRSTINDEX;
  158.    PHONECOUNT := PHONECOUNT + 1
  159. END;
  160.  
  161. (*                 PROCEDURE INSERT LAST NAME              *)
  162.  
  163. PROCEDURE INSERTLN(VAR NAMECOUNTER:INTEGER;BUFFER : ONEPERSON;
  164.                    TEMPLAST : LASTNAMEHOLDER;VAR LASTINDEX : INTEGER);
  165.  
  166. VAR
  167.   J      ,
  168.   COUNT  ,
  169.   COUNTER : INTEGER;
  170.   FINISH  : BOOLEAN;
  171.  
  172. BEGIN
  173.   COUNT := NAMECOUNTER;
  174.   FINISH := FALSE;
  175.   WHILE (COUNT >= 1) AND (NOT FINISH) DO
  176.     IF DIRECTORY[COUNT].LASTNAME < TEMPLAST
  177.       THEN FINISH := TRUE
  178.       ELSE BEGIN
  179.              DIRECTORY[COUNT + 1] := DIRECTORY[COUNT];
  180.              FOR COUNTER := 1 TO DIRECTORY[COUNT + 1].LASTENTRY DO
  181.                BEGIN
  182.                  J := DIRECTORY[COUNT + 1].SAMELASTNAME[COUNTER].PHINDEX;
  183.                  PHONELIST[J].LASTINDEX := COUNT + 1
  184.                END;
  185.              COUNT := COUNT - 1
  186.            END;
  187.    DIRECTORY[COUNT + 1].LASTNAME := TEMPLAST;
  188.    DIRECTORY[COUNT + 1].SAMELASTNAME[1] := BUFFER;
  189.    DIRECTORY[COUNT + 1].LASTENTRY := 1;
  190.    LASTINDEX := COUNT + 1;
  191.    NAMECOUNTER := NAMECOUNTER + 1
  192. END;
  193.  
  194. (*                 PROCEDURE INSERT FIRST NAME             *)
  195.  
  196. PROCEDURE INSERTFN(INDEX : INTEGER; BUFFER : ONEPERSON;
  197.                    VAR FIRSTINDEX : INTEGER);
  198.  
  199. VAR
  200.   POINT   ,
  201.   COUNT   : INTEGER;
  202.   FINISH  : BOOLEAN;
  203.  
  204. BEGIN
  205.   POINT := DIRECTORY[INDEX].LASTENTRY;
  206.   FINISH := FALSE;
  207.   WHILE (POINT >= 1) AND (NOT FINISH) DO
  208.     IF DIRECTORY[INDEX].SAMELASTNAME[POINT].FIRSTNAME < BUFFER.FIRSTNAME
  209.       THEN FINISH := TRUE
  210.       ELSE BEGIN
  211.              DIRECTORY[INDEX].SAMELASTNAME[POINT + 1] :=
  212.                DIRECTORY[INDEX].SAMELASTNAME[POINT];
  213.              COUNT := DIRECTORY[INDEX].SAMELASTNAME[POINT + 1].PHINDEX;
  214.              PHONELIST[COUNT].FIRSTINDEX := POINT + 1;
  215.              POINT := POINT - 1
  216.            END;
  217.   DIRECTORY[INDEX].LASTENTRY := DIRECTORY[INDEX].LASTENTRY + 1;
  218.   FIRSTINDEX := POINT + 1;
  219.   DIRECTORY[INDEX].SAMELASTNAME[POINT + 1] := BUFFER
  220. END;
  221.  
  222. (*                 PROCEDURE  READ TEXT                    *)
  223.  
  224. PROCEDURE READTEXT(VAR BUFFFER:ONEPERSON;
  225.                    VAR TEMPLAST : LASTNAMEHOLDER; VAR PH :INTEGER);
  226.  
  227. CONST
  228.   BLANK = ' ';
  229.  
  230. VAR
  231.   J, COUNTER : INTEGER;
  232.  
  233. BEGIN
  234.   J := 0;
  235.   IF NOT EOF(INFILE)
  236.     THEN BEGIN
  237.            FOR COUNTER := 1 TO MAX DO
  238.              BEGIN
  239.                TEMPLAST[COUNTER]         := BLANK;
  240.                BUFFER.FIRSTNAME[COUNTER] := BLANK;
  241.                BUFFER.CITY[COUNTER]      := BLANK
  242.              END;
  243.            FOR COUNTER := 1 TO MAXSTREET DO
  244.              BUFFER.STREET[COUNTER] := BLANK;
  245.            BUFFER.STATE := '  ';
  246.            REPEAT
  247.              J := J + 1;
  248.              READ(INFILE,TEMPLAST[J])
  249.            UNTIL (TEMPLAST[J] = BLANK) OR (J = MAXLASTNAME);
  250.            CH := BLANK;
  251.            IF (TEMPLAST[J] <> BLANK) AND (J= MAXLASTNAME)
  252.              THEN REPEAT
  253.                     READ(INFILE,CH)
  254.                   UNTIL CH = BLANK;
  255.            WHILE CH = BLANK DO
  256.              READ(INFILE,CH);
  257.            J := 1;
  258.            BUFFER.FIRSTNAME[J] := CH;
  259.            WHILE NOT EOLN(INFILE) DO
  260.              BEGIN
  261.                J := J + 1;
  262.                READ(INFILE,BUFFER.FIRSTNAME[J])
  263.              END;
  264.            READLN(INFILE);
  265.            J := 0;
  266.            WHILE NOT EOLN(INFILE) DO
  267.              BEGIN
  268.                J := J +  1;
  269.                READ(INFILE,BUFFER.STREET[J])
  270.              END;
  271.            READLN(INFILE);
  272.            J := 0;
  273.            WHILE NOT EOLN(INFILE) DO
  274.              BEGIN
  275.                J := J + 1;
  276.                READ(INFILE,BUFFER.CITY[J])
  277.              END;
  278.            READLN(INFILE);
  279.            J := 0;
  280.            WHILE NOT EOLN(INFILE) DO
  281.              BEGIN
  282.                J := J + 1;
  283.                READ(INFILE,BUFFER.STATE[J])
  284.              END;
  285.            READLN(INFILE);
  286.            READLN(INFILE,BUFFER.ZIPCODE);
  287.            READLN(INFILE,PH,CH,RPH);
  288.            PH := PH * 1000 + RPH
  289.          END
  290.      ELSE PH := 0
  291.  END;
  292.  
  293. (*                 PROCEDURE READ NAMES                    *)
  294.  
  295. PROCEDURE READNAME(VAR TEPLST : LASTNAMEHOLDER;
  296.                    VAR TEMPFIRST : FIRSTNAMEHOLDER);
  297.  
  298. VAR
  299.   J : INTEGER;
  300.  
  301. BEGIN
  302.   I := 0;
  303.   FOR J := 1 TO MAX DO
  304.     BEGIN
  305.       TEMPLAST[J] := BLANK;
  306.       TEMPFIRST[J] := BLANK
  307.     END;
  308.   REPEAT
  309.     I := I + 1;
  310.     READ(SEARCH,TEMPLAST[J])
  311.   UNTIL (TEMPLAST[J] = BLANK) OR (I = MAXLASTNAME);
  312.   CH := BLANK;
  313.   IF (TEMPLAST[I] <> BLANK) AND ( I = MAXLASTNAME)
  314.     THEN REPEAT
  315.            READ(SEARCH,CH)
  316.          UNTIL CH = BLANK;
  317.   WHILE CH = BLANK DO
  318.     READ(SEARCH,CH);
  319.   I := 1;
  320.   TEMPFIRST[I] := CH;
  321.   WHILE NOT EOLN(SEARCH) DO
  322.     BEGIN
  323.       I := I + 1;
  324.       READ(SEARCH,TEMPFIRST[I])
  325.     END
  326. END;
  327.  
  328. (*                 PROCEDURE WRITE OUT TEXT                *)
  329.  
  330. PROCEDURE WRITEOUT(J : INTEGER);
  331.  
  332. BEGIN
  333.   IF J = 0
  334.     THEN BEGIN
  335.  
  336.   WRITELN(OUTFILE,'SEARCHING PHONE UMBER => ',PH:8);
  337.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].LASTNAME);
  338.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].FIRSTNAME);
  339.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].STREET);
  340.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].CITY);
  341.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].STATE);
  342.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].ZIPCODE:5)
  343.  
  344.          END
  345.     ELSE BEGIN
  346.  
  347.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].LASTNAME);
  348.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].FIRSTNAME);
  349.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].STREET);
  350.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].CITY);
  351.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].STATE);
  352.   WRITELN(OUTFILE,DIRECTORY[LASTINDEX].SAMELASTNAME[FIRSTINDEX].ZIPCODE:5);
  353.   WRITELN(OUTFILE,PHONELIST[J].PHONE)
  354.  
  355.           END
  356. END;
  357.  
  358. (*                 PROCEDURE FIRST NAME SEARCH             *)
  359.  
  360. FUNCTION FIRSTSEARCH(TEMPLAST : FIRSTNAMEHOLDER;POINT1 : INTEGER):INTEGER;
  361.  
  362. VAR
  363.   I, J, POINT,
  364.   LEFTSIDE,
  365.   RIGHTSIDE : INTEGER;
  366.   FINISH    : BOOLEAN;
  367.  
  368. BEGIN
  369.   I := DIRECTORY[POINT1].LASTENTRY;
  370.   LEFTSIDE := 1;
  371.   RIGHTSIDE := 1;
  372.   FINISH := FALSE;
  373.   WHILE (LEFTSIDE <= RIGHTSIDE) AND (NOT FINISH) DO
  374.    BEGIN
  375.      POINT := (LEFTSIDE + RIGHTSIDE) DIV 2;
  376.      IF DIRECTORY[POINT].SAMELASTNAME[POINT].FIRSTNAME = TEMPFIRST
  377.        THEN FINISH := TRUE
  378.        ELSE IF DIRECTORY[POINT1].SAMELASTNAME[POINT].FIRSTNAME < TEMPFIRST
  379.               THEN LEFTSIDE := POINT + 1
  380.               ELSE RIGHTSIDE := POINT - 1
  381.    END;
  382.   IF LEFTSIDE > RIGHTSIDE
  383.     THEN FIRSTSEARCH := 0
  384.     ELSE BEGIN
  385.            FIRSTSEARCH := POINT;
  386.            J := DIRECTORY[POINT1].SAMELASTNAME[POINT].PHINDEX;
  387.            WRITEOUT(J)
  388.          END
  389. END;
  390.  
  391. (*                 FUNCTION PHONE SEARCH                   *)
  392.  
  393. FUNCTION PHONESEARCH(PH, PHONECOUNT : INTEGER):INTEGER;
  394.  
  395. VAR
  396.   J, POINT,
  397.   LEFTSIDE,
  398.   RIGHTSIDE : INTEGER;
  399.   FINISH    : BOOLEAN;
  400.  
  401. BEGIN
  402.   J := 0;
  403.   LEFTSIDE := 1;
  404.   RIGHTSIDE := PHONECOUNT - 1;
  405.   FINISH := FALSE;
  406.   WHILE (LEFTSIDE <= RIGHTSIDE) AND ( NOT FINISH) DO
  407.    BEGIN
  408.      POINT := ( LEFTSIDE + RIGHTSIDE) DIV 2;
  409.      IF PHONELIST[POINT].PHONE = PH
  410.        THEN FINISH := TRUE
  411.        ELSE IF PHONELIST[POINT].PHONE > PH
  412.               THEN RIGHTSIDE := POINT - 1
  413.               ELSE LEFTSIDE := POINT + 1
  414.    END;
  415.   IF LEFTSIDE > RIGHTSIDE
  416.     THEN PHONESEARCH := 0
  417.     ELSE BEGIN
  418.            PHONESEARCH := POINT;
  419.            FIRSTINDEX := PHONELIST[POINT].FIRSTINDEX;
  420.            LASTINDEX  := PHONELIST[POINT].LASTINDEX;
  421.            WRITEOUT(J)
  422.          END
  423. END;
  424.  
  425. (*           PROCDURE WORDS AND NUMBER SEARCH              *)
  426.  
  427. PROCEDURE WORDNUMSEARCH;
  428.  
  429. VAR
  430.   POINT1, POINT2, PHONEPT : INTEGER;
  431.  
  432. BEGIN
  433.   RESET(SEARCH);
  434.   REWRITE(OUTFILE);
  435.   WHILE NOT EOF(SEARCH) DO
  436.     BEGIN
  437.       IF SEARCH^ IN ['A'..'Z','a'..'z']
  438.         THEN BEGIN
  439.                READNAME(TEMPLAST,TEMPFIRST);
  440.                POINT1 := SEARCHER(NAMECOUNTER,TEMPLAST);
  441.                IF POINT1 <> 0
  442.                  THEN POINT2 := FIRSTSEARCH(TEMPFIRST,POINT1);
  443.                IF (POINT1 = 0) OR (POINT2 = 0)
  444.                  THEN WRITELN(OUTFILE,TEMPLAST,TEMPFIRST,' IS NOT LISTED.');
  445.                WRITELN(OUTFILE);
  446.                READLN(SEARCH)
  447.              END
  448.         ELSE BEGIN
  449.                READ(SEARCH,PH,CH,RPH);
  450.                READLN(SEARCH);
  451.                PH := PH * 1000 + RPH;
  452.                PHONEPT := PHONESEARCH(PH,PHONECOUNT);
  453.                IF PHONEPT = 0
  454.                  THEN BEGIN
  455.                         WRITE(OUTFILE,'TELEPHONE NUMBER ');
  456.                         WRITELN(OUTFILE,PH:8,' IS NOT LISTED.')
  457.                       END;
  458.                WRITELN(OUTFILE)
  459.              END
  460.   END
  461. END;
  462.  
  463. (*                     MAIN PROGRAM                        *)
  464.  
  465. BEGIN
  466.   RESET(INFILE);
  467.   READTEXT(BUFFER,TEMPLAST,PH);
  468.   DIRECTORY[1].LASTNAME := TEMPLAST;
  469.   DIRECTORY[1].LASTENTRY := 1;
  470.   BUFFER.PHINDEX         := 1;
  471.   DIRECTORY[1].SAMELASTNAME[1] := BUFFER;
  472.   PHONELIST[1].PHONE := PH;
  473.   PHONELIST[1].LASTINDEX := 1;
  474.   PHONELIST[1].FIRSTINDEX := 1;
  475.   PHONECOUNT := 1;
  476.   WHILE PH <> 0 DO
  477.     BEGIN
  478.       INDEX := SEARCHER(NAMECOUNT,TEMPLAST);
  479.       IF INDEX <> 0
  480.         THEN BEGIN
  481.                LASTINDEX := INDEX;
  482.                INSERTFN(INDEX,BUFFER,FIRSTINDEX)
  483.              END
  484.         ELSE BEGIN
  485.                INSERTLN(NAMECOUNTER,BUFFER,TEMPLAST,LASTINDEX);
  486.                FIRSTINDEX := 1
  487.              END;
  488.       INSERTPHONE(PHONECOUNT,LASTINDEX,FIRSTINDEX,PH);
  489.       FOR I := 1 TO MAX DO
  490.         BEGIN
  491.           BUFFER.FIRSTNAME[I] := BLANK;
  492.           TEMPLAST[I] := BLANK
  493.         END;
  494.       READTEXT(BUFFER,TEMPLAST,PH)
  495.     END;
  496.     WORDNUMSEARCH
  497. END.
  498.