home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 10 / tricks / search.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-07-12  |  6.9 KB  |  196 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      SEARCH.PAS                        *)
  3. (*   Dateisuchroutinen unter spezieller Berücksichtigung  *)
  4. (*   der BGI-Treiber                                      *)
  5. (*          (c) 1989  Frank Jürgensen  &  TOOLBOX         *)
  6. (* ------------------------------------------------------ *)
  7. UNIT search;
  8.  
  9. INTERFACE
  10.  
  11. USES Graph, Dos;
  12.                  { Graph kann entfallen, wenn man auf die  }
  13.                  { automatische Bestimmung eines benötigten}
  14.                  { BGI-Treibers verzichten will            }
  15.  
  16. FUNCTION DriverPath(searchfile : STRING) : PathStr;
  17.  
  18.   { Sucht den zu "searchfile" passenden Pfad. Der Dateiname}
  19.   { ist nicht Teil der zurückgegebenen Pfadangabe.         }
  20.   { Ist searchfile = '' wird angenommen, daß der passende  }
  21.   { BGI-Treiber gesucht werden soll.                       }
  22.   { Zuerst wird im DOS-PATH gesucht, dann auf dem gesamten }
  23.   { aktiven Datenträger. Bei Mißerfolg wird ''             }
  24.   { zurückgegeben und driverpath_ok = FALSE.               }
  25.  
  26. FUNCTION MyFsearch(searchfile    : PathStr;
  27.                    dostime, size : LONGINT;
  28.                    dirlist       : STRING) : PathStr;
  29.  
  30.   { Fsearch aus UNIT Dos kann Datum und Zeit bei der Suche }
  31.   { nicht berücksichtigen. MyFsearch arbeitet genau wie    }
  32.   { Fsearch, wenn dostime = notime und size = nosize       }
  33.   { (also unwirksam) sind, ansonsten prüft es auch         }
  34.   { Dateigröße und/oder Datum. Den Wert für dostime erhält }
  35.   { man durch packtime aus der UNIT DOS. Der Sekundenanteil}
  36.   { ist nicht relevant: bei der Suche wird eine Toleranz   }
  37.   { von 60 s (timetol*2=Toleranz in Sekunden) eingeräumt.  }
  38.   { Wegen Kompatibilität mit Fsearch gehört der Dateiname  }
  39.   { zum zurückgegebenen Pfad.                              }
  40.  
  41. VAR
  42.   driverpath_ok : BOOLEAN;
  43.   drivertime    : LONGINT;
  44.   driversize    : LONGINT;
  45.                { Zusätzliche Suchkriterien für Driverpath. }
  46.  
  47. CONST
  48.   timetol = 30;          { Toleranz bei Zeitangaben:       }
  49.                          { timetol*2=Toleranz in Sekunden  }
  50.   notime  = -1;
  51.   nosize  = -1;          { Flag: Zeit und Größe beliebig   }
  52.  
  53. IMPLEMENTATION
  54.  
  55.   FUNCTION Upper(s : STRING) : STRING;
  56.   VAR
  57.     i : BYTE;
  58.   BEGIN
  59.     FOR i := 1 TO Length(s) DO
  60.       CASE s[i] OF
  61.         'ä' : s[i] := 'Ä';
  62.         'ö' : s[i] := 'Ö';
  63.         'ü' : s[i] := 'Ü';
  64.         ELSE  s[i] := UpCase(s[i]);
  65.       END;
  66.     Upper := s;
  67.   END;
  68.  
  69. FUNCTION MyFsearch(searchfile    : PathStr;
  70.                    dostime, size : LONGINT;
  71.                    dirlist       : STRING) : PathStr;
  72. VAR
  73.   f           : searchrec;
  74.   currentpath : pathstr;
  75.   sempos      : BYTE;
  76. BEGIN
  77.   currentpath := '.';
  78.   searchfile  := Upper(searchfile);
  79.   REPEAT
  80.     FindFirst(currentpath + '\*.*', anyfile, f);
  81.     WHILE DosError = 0 DO BEGIN
  82.       IF (f.name=searchfile) AND ((dostime = notime) OR
  83.          (Abs(f.time-dostime)<timetol)) AND
  84.          ((size = nosize) OR (f.size = size)) THEN BEGIN
  85.         IF currentpath[Length(currentpath)] <> '\' THEN
  86.           currentpath := currentpath + '\';
  87.         MyFsearch   := currentpath + searchfile;
  88.         Exit;
  89.       END;
  90.       FindNext(f);
  91.     END;
  92.     WHILE (Length(dirlist)>0) AND (dirlist[1] IN [';',' '])
  93.       DO Delete(dirlist,1,1);
  94.     sempos := Pos(';', dirlist);
  95.     IF sempos = 0 THEN
  96.       sempos := Length(dirlist) + 1;               { Trick }
  97.     currentpath := Copy(dirlist, 1, sempos - 1);
  98.     dirlist := Copy(dirlist, sempos + 1, Length(dirlist));
  99.   UNTIL Length(currentpath) = 0;
  100.   myfsearch := '';                       { nichts gefunden }
  101. END;
  102.  
  103. FUNCTION DriverPath(searchfile : STRING) : PathStr;
  104. CONST
  105.   BGIname : ARRAY[1..10]OF STRING[8] =
  106.           ('CGA',     'CGA',  'EGAVGA', 'EGAVGA', 'EGAVGA',
  107.            'IBM8514', 'HERC', 'ATT',    'EGAVGA', 'PC3270');
  108.   BGItimerec : datetime =
  109.                          (Year : 1988; Month : 10; Day : 10;
  110.                           Hour : 5;    Min   : 0;  Sec : 0);
  111.  
  112.   { Dieses Datum gilt für die Treiber, die Graph in        }
  113.   { Turbo-5 braucht. Die Unterscheidung ist wichtig - denn }
  114.   { Turbo Prolog z.B. hat Treiber gleichen Namens, die     }
  115.   { aber nicht passen                                      }
  116.  
  117. VAR
  118.   gd, gm           : INTEGER;
  119.   dospath          : STRING;
  120.   test, scanresult : PathStr;
  121.   scansuccess      : BOOLEAN;
  122.  
  123.   PROCEDURE Scan(scanpath : PathStr);
  124.      { Sucht scanpath mit allen Unterverzeichnissen nach   }
  125.      { der Datei searchfile ab. Der gefundene Pfad landet  }
  126.      { in scanresult und scansuccess ist dann TRUE.        }
  127.      { Scansuccess muß vor dem Aufruf auf FALSE gesetzt    }
  128.      { worden sein.                                        }
  129.   VAR
  130.     doserr : INTEGER;
  131.     f      : searchrec;
  132.   BEGIN
  133.     FindFirst(scanpath + '*.*', anyfile, f);
  134.     doserr := DosError;
  135.     WHILE doserr = 0 DO BEGIN
  136.       IF (f.attr = directory) AND
  137.                            (Pos('.', f.name) = 0) THEN BEGIN
  138.         Scan(scanpath + f.name + '\');
  139.         IF scansuccess THEN Exit;
  140.       END ELSE
  141.         IF (f.name = searchfile) AND
  142.            ((drivertime = notime) OR
  143.            (Abs(f.time - drivertime) < timetol)) AND
  144.            ((driversize = nosize) OR
  145.            (f.size = driversize)) THEN BEGIN
  146.           scansuccess := TRUE;
  147.           IF (Length(scanpath) > Pos(':', scanpath) + 1) AND
  148.              (scanpath[Length(scanpath)]='\') THEN
  149.             Dec(BYTE(scanpath[0]));
  150.           scanresult := scanpath;
  151.           Exit;
  152.         END;
  153.       FindNext(f);  doserr := DosError;
  154.     END;
  155.   END;
  156.  
  157. BEGIN { driverpath }
  158.    driverpath_ok := TRUE;           { zuerst normale Suche }
  159.    IF searchfile = '' THEN BEGIN
  160.         { den benötigten BGI-Treibernamen selbst festlegen }
  161.      DetectGraph(gd, gm);
  162.      searchfile := BGIname[gd] + '.BGI';
  163.      PackTime(BGItimerec, drivertime);
  164.      driversize := nosize;
  165.    END ELSE
  166.         { es wird nach irgendeinem anderen Treiber gesucht }
  167.      searchfile := Upper(searchfile);
  168.                     { Erste Suchstufe: im Dos-Pfad suchen: }
  169.    dospath := getenv('PATH');
  170.    test := MyFsearch(searchfile, drivertime,
  171.                      driversize, dospath);
  172.    IF Length(test) > 0 THEN BEGIN
  173.      driverpath := Copy(test, 1, Pos(searchfile, test) - 2);
  174.      drivertime := notime;
  175.      driversize := nosize;                       { default }
  176.      Exit;
  177.    END;
  178.     { Zweite Suchstufe: den gesamten Datenträger absuchen: }
  179.    scansuccess := FALSE;
  180.    scan('\');                     { Ab Root alles abgrasen }
  181.    IF scansuccess THEN
  182.      driverpath := scanresult
  183.    ELSE BEGIN
  184.      driverpath    := '';
  185.      driverpath_ok := FALSE;
  186.    END;
  187.    drivertime := notime;
  188.    driversize := nosize;
  189. END; { driverpath }
  190.  
  191. BEGIN
  192.   drivertime := notime; driversize := nosize; { default: }
  193. END.
  194. (* ------------------------------------------------------ *)
  195. (*                  Ende von SEARCH.PAS                   *)
  196.