home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / apisearc / apisearc.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-01-10  |  11.3 KB  |  466 lines

  1. (* ====================================================== *)
  2. (*                     APISEARCH.PAS                      *)
  3. (* ------------------------------------------------------ *)
  4. (*                WINDOWS - API-SEARCH 1.1                *)
  5. (*      (C) 1992 eurologic, innovative Software GmbH      *)
  6. (*            freigegeben fⁿr DOS toolbox 2'92            *)
  7. (*                   Autor:   Uwe Chalas                  *)
  8. (*      Compiler: Turbo Pascal fⁿr Windows V. 1.0         *)
  9. (* ====================================================== *)
  10. {$A+,B-,D+,F-,G-,I+,L+,N-,R-,S+,V+,W+,X+}
  11. {$M 8192,8192}
  12.  
  13. PROGRAM APISearch;
  14. USES
  15.   WinDos, WObjects, WinTypes, WinProcs,
  16.   StdWnds, StdDlgs,
  17.   BWCC, Strings;
  18.  
  19. {$R APISEARC.RES}
  20.  
  21. CONST
  22.   ID_Start     = 200;
  23.   ID_Ende      = 201;
  24.   ID_About     = 202;
  25.   ID_Search    = 211;
  26.   ID_Found     = 212;
  27.   ID_CheckAPI  = 213;
  28.   ID_CheckType = 214;
  29.   ID_CheckWObj = 216;
  30.   ID_Count     = 215;
  31.  
  32.   TypeFilename = 'TYPES.DAT';
  33.   APIFilename  = 'API.DAT';
  34.   WObjFileName = 'WObject.Dat';
  35.   HelpFile     = 'TPW.HLP';
  36.  
  37. TYPE
  38.   tApiApp = OBJECT(tApplication)
  39.               PROCEDURE InitMainWindow; VIRTUAL;
  40.             END;
  41.  
  42.   pApiSearchWindow = ^tApiSearchWindow;
  43.   tApiSearchWindow = OBJECT(tDlgWindow)
  44.     FoundBox    : pListbox;
  45.     Search      : pEdit;
  46.     ApiCheck    : pCheckBox;
  47.     TypesCheck  : pCheckBox;
  48.     WObjCheck   : pCheckBox;
  49.     CountStat   : pStatic;
  50.     Count       : Word;
  51.     BreakFlag   : BOOLEAN;
  52.     Breakok     : BOOLEAN;
  53.     CONSTRUCTOR Init(AParent: pWindowsObject; ATitle:pChar);
  54.     PROCEDURE   SetupWindow; VIRTUAL;
  55.     FUNCTION    GetClassName: pChar; VIRTUAL;
  56.     PROCEDURE   GetWindowClass(VAR AWndClass: tWndClass);
  57.                                VIRTUAL;
  58.     PROCEDURE   DefWndProc(VAR Msg: tMessage); VIRTUAL;
  59.     PROCEDURE   Start;
  60.     PROCEDURE   Quit(VAR Msg: tMessage);
  61.                      VIRTUAL ID_First + ID_Ende;
  62.     PROCEDURE   About(VAR Msg: tMessage);
  63.                       VIRTUAL ID_First + ID_About;
  64.     PROCEDURE   SearchFile(Filename: STRING);
  65.     PROCEDURE   ShowHelp;
  66.     FUNCTION    CanClose: BOOLEAN; VIRTUAL;
  67.     PROCEDURE   WMCommand(VAR Message: tMessage);
  68.                           VIRTUAL WM_First + wm_Command;
  69.   END;
  70.  
  71.  
  72. FUNCTION RMatch(VAR S, P: STRING;
  73.                     i, j: BYTE): BOOLEAN; ASSEMBLER;
  74. (* ------------------------------------------------------ *)
  75. (*    Vergleich  einschl. Joker '*' und Platzhalter '?'   *)
  76. (* ------------------------------------------------------ *)
  77. ASM
  78.   PUSH  DS
  79.   MOV   CH, 1
  80.   LDS   SI, S
  81.   LES   DI, P
  82.   CMP   BYTE Ptr ES:[DI], 0
  83.   JE    @out
  84.   @Repeat:
  85.      MOV    DL, i
  86.      MOV    CL, j
  87.      CMP    DL, DS:[SI]
  88.      JBE    @weiter1
  89.      CMP    CL, ES:[DI]
  90.      JA     @out
  91.    @weiter1:
  92.      CMP    CL, ES:[DI]
  93.      JBE    @weiter2
  94.      XOR    CH, CH
  95.      JMP    @out
  96.    @weiter2:
  97.      XOR    BH, BH
  98.      MOV    BL, CL
  99.      MOV    AL, ES:[DI+BX]
  100.      CMP    AL, '*'
  101.      JNE    @StarOut
  102.      MOV    DH, DL
  103.      CMP    CL, ES:[DI]
  104.      JE     @out
  105.    @repeat1:
  106.      XOR    AH, AH
  107.      PUSH   DX
  108.      PUSH   DS
  109.      PUSH   SI
  110.      PUSH   ES
  111.      PUSH   DI
  112.      MOV    AL, DH
  113.      INC    AL
  114.      PUSH   AX
  115.      MOV    AL, j
  116.      INC    AL
  117.      PUSH   AX
  118.      CALL   RMatch
  119.      POP    DX
  120.      INC    DH
  121.      CMP    AL, 0
  122.      JNE    @Endloop     (* RMatch = TRUE? - Raus hier *)
  123.      CMP    DH, DS:[SI]  (* k > Length(s)? - Raus hier *)
  124.      JBE    @Repeat1
  125.    @EndLoop:
  126.      JMP    @out
  127.    @StarOut:
  128.      XOR    BH, BH
  129.      MOV    BL, j
  130.      MOV    AH, ES:[DI + BX]
  131.      CMP    AH, '?'
  132.      JE     @weiter3
  133.      MOV    BL, i
  134.      MOV    AL, DS:[SI + BX]
  135.      CMP    AH, 'Z'
  136.      JA     @weiter5
  137.      CMP    AH, 'A'
  138.      JB     @UEnde
  139.      OR     AH, 32
  140.      JMP    @UEnde
  141.    @weiter5:
  142.      CMP    AH, 'ⁿ'
  143.      JB     @UEnde
  144.      CMP    AH, '▄'
  145.      JNE    @Umlaut1
  146.      MOV    AH, 'ⁿ'
  147.      JMP    @UEnde
  148.    @Umlaut1:
  149.      CMP    AH, '─'
  150.      JNE    @Umlaut2
  151.      MOV    AH, 'Σ'
  152.      JMP    @UEnde
  153.    @Umlaut2:
  154.      CMP    AH, '╓'
  155.      JNE    @UEnde
  156.      MOV    AH, '÷'
  157.    @UEnde:
  158.      CMP    AL, 'Z'
  159.      JA     @weiter51
  160.      CMP    AL, 'A'
  161.      JB     @UEnde1
  162.      OR     AL, 32
  163.      JMP    @UEnde1
  164.    @weiter51:
  165.      CMP    AL, 'ⁿ'
  166.      JB     @UEnde1
  167.      CMP    AL, '▄'
  168.      JNE    @Umlaut11
  169.      MOV    AL, 'ⁿ'
  170.      JMP    @UEnde1
  171.    @Umlaut11:
  172.      CMP    AL, '─'
  173.      JNE    @Umlaut21
  174.      MOV    AL, 'Σ'
  175.      JMP    @UEnde1
  176.    @Umlaut21:
  177.      CMP    AL, '╓'
  178.      JNE    @UEnde1
  179.      MOV    AL, '÷'
  180.    @UEnde1:
  181.      CMP    AH, AL
  182.      JE     @weiter3
  183.      XOR    CH, CH
  184.      JMP    @out
  185.    @weiter3:
  186.      INC    i
  187.      INC    j
  188.      JMP    @Repeat
  189. @out:
  190.   MOV   AL, CH
  191.   POP   DS
  192. END;
  193.  
  194. FUNCTION Trim(Str: STRING): STRING; ASSEMBLER;
  195. (*------------------------------------------------------- *)
  196. (* Entfernen der fⁿhrenden und nachgestellten Leerzeichen *)
  197. (*------------------------------------------------------- *)
  198. ASM
  199.   PUSH  DS
  200.   CLD
  201.   XOR   CX, CX
  202.   LES   DI, @Result
  203.   MOV   ES:[DI], CX
  204.   MOV   BX, DI
  205.   LDS   SI, Str
  206.   LODSB
  207.   CMP   AL, 0
  208.   JZ    @Exit
  209.   MOV   CL, AL
  210. @DoLoop:
  211.   LODSB
  212.   CMP   AL, ' '
  213.   JNE   @DoMove
  214.   LOOP  @DoLoop
  215. @DoMove:
  216.   CMP   CL, 0
  217.   JZ    @Exit
  218.   DEC   SI
  219.   MOV   AL, CL
  220.   MOV   DL, CL
  221.   STOSB
  222.   REP   MOVSB
  223.   STD
  224.   DEC   DI
  225.   MOV   CL, DL
  226.   MOV   AL, ' '
  227.   REPE  SCASB
  228.   INC   CL
  229.   MOV   ES:[BX], CL
  230.   CLD
  231. @Exit:
  232.   POP   DS
  233. END;
  234.  
  235. FUNCTION UpStr(Str: STRING): STRING; ASSEMBLER;
  236. (* ------------------------------------------------------ *)
  237. (*      Konvertiert den String in Gro▀buchstaben          *)
  238. (* ------------------------------------------------------ *)
  239. ASM
  240.   PUSH  DS
  241.   LDS   SI,Str
  242.   LES   DI,@Result
  243.   CLD
  244.   LODSB
  245.   STOSB
  246.   MOV   CL,AL
  247.   XOR   CH,CH
  248.   JCXZ  @UpDone
  249.   @DoLoop:
  250.     LODSB
  251.     CMP   AL,'a'
  252.     JB    @IsUp
  253.     CMP   AL,'{'
  254.     JB    @IsLo
  255.     CMP   AL,'Σ'
  256.     JNZ   @Up2
  257.     MOV   AL,'─'
  258.     JMP   @IsUp
  259.   @Up2:
  260.     CMP   AL,'÷'
  261.     JNZ   @Up3
  262.     MOV   AL,'╓'
  263.     JMP   @IsUp
  264.   @Up3:
  265.     CMP   AL,'ⁿ'
  266.     JNZ   @IsUp
  267.     MOV   AL,'▄'
  268.     JMP   @IsUp
  269.   @IsLo:
  270.     AND   AL,223
  271.   @IsUp:
  272.     STOSB
  273.   LOOP  @DoLoop
  274. @UpDone:
  275.   POP  DS
  276. END;
  277.  
  278.  
  279. CONSTRUCTOR tApiSearchWindow.Init(AParent: pWindowsObject;
  280.                                   ATitle:  pChar);
  281. (* ------------------------------------------------------ *)
  282. (*       Implementierung des Objects tApiSearchWindow     *)
  283. (* ------------------------------------------------------ *)
  284. BEGIN
  285.   tDlgWindow.Init(AParent, ATitle);
  286.   New(FoundBox,   InitResource(@self, ID_Found));
  287.   New(Search,     InitResource(@self, ID_Search, 50));
  288.   New(APICheck,   InitResource(@self, ID_CheckAPI));
  289.   New(TypesCheck, InitResource(@self, ID_CheckType));
  290.   New(WObjCheck,  InitResource(@self, ID_CheckWObj));
  291.   New(CountStat,  InitResource(@self, ID_Count, 4));
  292.   BreakFlag := FALSE;
  293.   BreakOk := tRUE;
  294. END;
  295.  
  296. PROCEDURE tApiSearchWindow.SetupWindow;
  297. BEGIN
  298.   tDlgWindow.SetupWindow;
  299.   APICheck^.Setcheck(1);
  300. END;
  301.  
  302. FUNCTION tApiSearchWindow.GetClassName: pChar;
  303. BEGIN
  304.   GetClassName := 'BorDlgWin';
  305. END;
  306.  
  307. PROCEDURE tApiSearchWindow.GetWindowClass(
  308.           VAR AWndClass: tWndClass);
  309. BEGIN
  310.   tDlgWindow.GetWindowClass(AWndClass);
  311.   AWndClass.HIcon := LoadIcon(HInstance, 'MyIcon');
  312. END;
  313.  
  314. PROCEDURE tApiSearchWindow.DefWndProc(VAR Msg: tMessage);
  315. BEGIN
  316.   WITH Msg DO
  317.     Result := BWCCDefDlgProc(0, Message, wParam, lParam);
  318. END;
  319.  
  320. PROCEDURE tApiSearchWindow.SearchFile(Filename: STRING);
  321. VAR
  322.   F   : Text;
  323.   S   : STRING;
  324.   Se  : STRING;
  325.   msg : tMsg;
  326. BEGIN
  327.   BreakOk := FALSE;
  328.   Search^.GetText(@SE[1], 255);
  329.   IF StrLen(@Se[1]) < 2 THEN Exit;
  330.   Se[0] := Char(StrLen(@se[1]));
  331.   Assign(F, FileName);
  332.   Reset(f);
  333.   IF IOResult <> 0 THEN BEGIN
  334.     S := Filename + ' nicht gefunden!' + #0;
  335.     BWCCMessageBox(HWindow, @s[1], 'Fehler', mb_IconStop);
  336.     Exit;
  337.   END;
  338.   IF SE[1] <> '*' THEN SE := '*'+SE;
  339.   IF SE[Length(Se)] <> '*' THEN SE := SE + '*';
  340.   WHILE NOT EoF(f) AND NOT BreakFlag DO BEGIN
  341.     ReadLn(F, S);
  342.     S := #32 + S;
  343.     IF RMatch(S, SE, 1, 1) THEN BEGIN
  344.       IF PeekMessage(Msg, 0, 0, 0, pm_Remove) THEN
  345.         DispatchMessage(Msg);
  346.       S := S + #0;
  347.       FoundBox^.AddString(@s[1]);
  348.       Inc(Count);
  349.       Str(Count, S);
  350.       IF PeekMessage(Msg, 0, 0, 0, pm_Remove) THEN
  351.         DispatchMessage(Msg);
  352.       S := S + #0;
  353.       CountStat^.SetText(@s[1]);
  354.       S := '';
  355.     END;
  356.   END;
  357.   Close(f);
  358.   BreakOK := TRUE;
  359. END;
  360.  
  361. PROCEDURE tApiSearchWindow.Start;
  362. VAR
  363.   OldCursor : WORD;
  364. BEGIN
  365.   OldCursor := SetClassWord(HWindow, gcw_hCursor,
  366.                             LoadCursor(0, idc_Wait));
  367.   BreakFlag := FALSE;
  368.   EnableWindow(GetDlgItem(HWindow,ID_Start), FALSE);
  369.   FoundBox^.ClearList;
  370.   Count := 0;
  371.   CountStat^.SetText('0');
  372.  
  373.   IF APICheck^.Getcheck <> 0 THEN SearchFile(APIFilename);
  374.   IF TypesCheck^.Getcheck <> 0 THEN
  375.     SearchFile(TypeFilename);
  376.   IF WObjCheck^.GetCheck <> 0 THEN SearchFile(WObjFileName);
  377.  
  378.   EnableWindow(GetDlgItem(HWindow, ID_Start), TRUE);
  379.   BreakOk := TRUE;
  380.   SetFocus(FoundBox^.HWindow);
  381.   FoundBox^.SetSelIndex(0);
  382.   SetClassWord(HWindow, gcw_hCursor, OldCursor);
  383. END;
  384.  
  385. PROCEDURE tApiSearchWindow.Quit(VAR Msg: tMessage);
  386. BEGIN
  387.   IF CanClose THEN PostQuitMessage(0);
  388. END;
  389.  
  390. PROCEDURE TApiSearchWindow.About(VAR Msg: tMessage);
  391. BEGIN
  392.   Application^.ExecDialog(New(PDialog,
  393.                           Init(@Self, 'About')));
  394. END;
  395.  
  396. FUNCTION tApiSearchWindow.CanClose: BOOLEAN;
  397. BEGIN
  398.   BreakFlag := TRUE;
  399.   CanClose := BreakOK;
  400. END;
  401.  
  402. PROCEDURE tApiSearchWindow.ShowHelp;
  403. VAR
  404.   S : STRING;
  405.   i : WORD;
  406. BEGIN
  407.   FoundBox^.GetSelString(@S[1], 255);
  408.   S[0] := Char(StrLen(@s[1]));
  409.   S := Trim(s);
  410.   IF (POS('FUNCTION', UpStr(S)) <> 0) THEN BEGIN
  411.     Delete(S, 1, Pos(#32, s));
  412.     IF Pos('(', s) <> 0 THEN
  413.       S := Copy(S, 1, Pos('(', s) - 1)
  414.     ELSE
  415.       S := Copy(S, 1, Pos(':', s) - 1)
  416.   END ELSE IF (POS('PROCEDURE',UpStr(S)) <> 0) THEN BEGIN
  417.     Delete(S, 1, Pos(#32, s));
  418.     IF Pos('(', s) <> 0 THEN
  419.       S := Copy(S, 1, Pos('(', s) - 1)
  420.     ELSE
  421.       S := Copy(S, 1, Pos(';', s) - 1)
  422.   END ELSE BEGIN
  423.     IF Pos('_', S) > 0 THEN BEGIN
  424.       i := Pos('_', S);
  425.       WHILE (I > 0) AND (s[i] <> #32) DO Dec(i);
  426.       S := Copy(S, I + 1, Pos('_', S) - i) + 'xxxx';
  427.     END ELSE S := Trim(Copy(S, 1, Pos(#32, s)));
  428.   END;
  429.   S := S + #0;
  430.   WinHelp(HWindow, HelpFile, Help_Key, LongInt(@s[1]));
  431. END;
  432.  
  433. PROCEDURE tApiSearchWindow.wmCommand(VAR Message: tMessage);
  434. BEGIN
  435.   IF Message.WParam = ID_Start THEN
  436.     IF GetFocus <> FoundBox^.HWindow THEN Start
  437.                                      ELSE ShowHelp;
  438.   tDlgWindow.WMCommand(Message);
  439.   IF Message.lParamHi = cbn_DblClk THEN ShowHelp;
  440. END;
  441.  
  442. PROCEDURE tApiApp.InitMainWindow;
  443. (* ------------------------------------------------------ *)
  444. (*             Applikation initialisieren                 *)
  445. (* ------------------------------------------------------ *)
  446. BEGIN
  447.   MainWindow := New(PApiSearchWindow,
  448.                     Init(NIL, 'APISEARCH'));
  449. END;
  450.  
  451. VAR
  452.   ApiApp    : tApiApp;
  453.   LibHandle : tHandle;
  454.  
  455. BEGIN
  456.   LibHandle :=  LoadLibrary('WorkLib2.dll');
  457.   ApiApp.Init('');
  458.   ApiApp.Run;
  459.   ApiApp.Done;
  460.   FreeLibrary(LibHandle);
  461. END.
  462.  
  463. (* ====================================================== *)
  464. (*               Ende von APISEARCH.PAS                   *)
  465. (* ====================================================== *)
  466.