No announcement yet.

discussion for mutiple keyword search program in source code section

  • Filter
  • Time
  • Show
Clear All
new posts

  • discussion for mutiple keyword search program in source code section

    discussion for a keyword search with upto 3 addtional keywords close to primary keyword
    p purvis

  • #2
    i wanted to make some comments about this program.

    first, this program was created by altering a previous program that would search a file looking for all keywords on a single line.
    i needed a program that i could not find to the job i wanted to.

    the original program was one of my first powerbasic 32bit programs.
    i would not suggest altering this code much if one decided to but create another program.

    this program was altered to find keywords located close to one another in a file, display the briefly found results with a option to view the whole file.
    something that is needed when searching functions or anything else that would benefit a programmer, specially somebody learning code or wanting to copy code previously written.

    if there is a program to do what this program does please let me know about it, please.

    this program is acking to be a totally gui program.
    it would take me days to do this, but some of you i know can whip this out almost over a long lunch period.

    so in case i have any bitter, i want to pass on some information or suggestions if any body was to do so.

    not in any order.

    have a gui that does not require any command tail for it to run
    have a option to search subdirectories
    have any file searched to be read up at one time

    search the file for keywords then if all keywords found to this,replace all CRLF with LF then replace all LFLF with LF then replace all LF with CRLF.
    by doing above you can search and display files that have no CRLFs just LF and also remove blank lines.

    then add extra lines amounting to how much lines you are going to allow for the other keyword to be close to the primary keyword to the beginning of your file in memory and lines to the ending of the file in memory.
    these extra lines will help finding and displaying the found keywords if your primary keyword is at the most beginning or ending of the file.

    after you have located the matched primary keyword, read backwards the number of CRLFs till you have the number of extra lines you are going to allow the user to include in the block of lines additional keywords can be found in, make that location of the file in memory then read from there the size of of the whole block you want all keywords to be found in, and mark that location. mark, meaning a variable of course.
    then using maybe mid$ to get that information to possibly an array of your blocks size.

    then display that information in a textbox or listbox inside your dialog, i do not know which, but it would be nice to have keywords colored with the primary being colored in a different color that the additional keywords, i like green for the primary and yellow for secondary keywords.

    allow for some long lines, i used 500 characters, but i guess a really good programmer would allow the line length to be any length.

    i am in favor myself of having a different dialog or a program to display the whole file. then position of the cursor at the found primary keyword's location in the file.
    inside the viewer of the whole file, do not allow a user to make any changes or saves to the file, the viewer should be static and colors are really not that important in the whole file viewer.

    that is all there is to it.

    some goodies would be on the programs window where you specify the keywords, directories, search block,etc would be the files to find and the program should search by files in order of extension, so naturally prior to searching each file, you would build an array that include the files whole name, then step through each file in the array while searching.
    also a nice option to save the search parameters in a ini file that is read at program startup in which the program was started.
    also something to add would be to make the block size in which additional keywords are found in, would be rather than making the block line number oriented, make the block a certain number of characters from the primary keyword, then go backward until you found the beginning of line and doing the same for the number of characters after your primary keyword hit, but this time reading the full line till you get to the end of the line.

    i am sure that other programmer's have the same problems as myself.
    this program as most will see can be useful for a number of other purposes by itself or with little change.
    one such program might be where you have keywords in files that are linked to another file, although not the fastest way to search, but there would be no indexs needed, and the index files could simply be updated without somebody understanding sql or anything else, this could be a poor man's index on jpg files and other none text files, where a user can see what is in the index file file before reviewing the none text file.

    for a generic program, you could also allow for alternative programs to open the whole file.
    you may also want to change the way the viewer program runs, an asynchronously option would be nice too, specially to us programmers, which you can easily change in my program, but button to choose on a gui would be best.

    i just tried to outline my thoughts if somebody where to give this a go, to write another better program.
    if again i where to write it, i would try for the smallest gui displays i could get away with allowing for font increases and decrease, might as well be some transparency to the window as well, and trying to stay away from too many options on the screen.

    Last edited by Paul Purvis; 19 Mar 2008, 05:26 PM.
    p purvis


    • #3
      I use Gotcha ( the one bundled with SED) for all of my programing searches



      • #4
        Me too
        For a while - (The exe only - no source)
        Last edited by Pierre Bellisle; 19 Mar 2008, 06:49 PM.


        • #5
          gotcha is great program and is very useful, i would suggest to anybody that they get the program and like James, the altered Gotcha to Gotchaex is the one i like best.
          i do not understand in the first version, the one posted in the forum, why there is section of the dialog where i can see through it. i am sure there is a good reason, but not knowing for what reason, it mostly distracts my vision off the gotcha dialog.

          thanks both for the recommendations and Pierre thanks for the hard work of coding it and sharing it.

          Pierre you deserve a pat on the back for this program, so just reach over your should and do a couple for me with a big smile.

          programs like gotcha helps to reinforce why placing code in functions is much more useful because there are tools like gotcha that make it easy to junk to certain code in a program.

          i write and use other programs also.
          gotcha has mostly what i wanted in a program and most of these type programs should do nearly the same things, if the program has matured. Displaying gathered search results, speed, and displaying giving the user optional ways of looking at the results and different ways of viewing results is the big differences in these programs. Specific application to specific programming languages is a lot of hard work too in displaying and working with the certain languages, which Gotcha seems to be powerbasic orientated.

          this still though is not what i was looking for by what a great find, maybe others will find gotcha useful also.

          p purvis


          • #6
            on my quest to get to a program of my needs of searching file for multiple keywords and having the ability to bullet to those results, i have rewritten a program i call txt2wndw.
            i guess this is as good a place as any to post any code written while it is being produced.

            and because i have searched for my road blocks in creating this program and not been able to find solutions, i am just going to post them here, because it all relates back to the program i have already written or the code that is going to be written to make a better program than what was entered into the source code section that is referenced in the first post.

            this program in the end should help out with other projects other than powerbasic, and this is great when you are converting your code to powerbasic from another language.

            here is a program to use instead of notepad.
            you place the file on the command line and if you want to goto and highlight on line in the program, then add /L:##### to the command tail

            'compiled with pbwin 8.04
            'program reads a file then displays the contents in a window
            #COMPILE EXE
            #REGISTER NONE
            #DIM ALL
            #INCLUDE "Win32Api.Inc"
            #INCLUDE "COMDLG32.INC"   ' Common dialog declares
            #INCLUDE "PREVIEW.INC"    ' Preview dialog include from tutorials in the samples directory
            %IDC_BUTNOPEN   = 120     ' Control id's
            %IDC_BUTNVIEW   = 121
            %IDC_BUTNPAGE   = 122
            %IDC_BUTNFONT   = 123
            %IDC_BUTNFONT1  = 124
            %IDC_BUTNFONT2  = 125
            %IDC_BUTNFONT3  = 126
            %ListBox = 201
            GLOBAL datainthefile() AS STRING
            GLOBAL largestwidthline AS LONG
            GLOBAL gifontsize AS DWORD
            GLOBAL gibuttonfontsize AS DWORD
            GLOBAL gstext AS STRING
            GLOBAL glinecount AS LONG
            GLOBAL gcharactercount AS LONG
            GLOBAL glinestartcharactercount AS LONG
            GLOBAL hFont,hbuttonfont AS DWORD
            GLOBAL gifontbold AS LONG
            GLOBAL ghdlg AS WORD
            'FUNCTION DECLARATIONS---------------------------------------------------------------
            DECLARE FUNCTION findwidestpart(BYVAL a AS STRING) AS LONG
            DECLARE FUNCTION MakeFontEx (BYVAL FontName AS STRING, _
                                         BYVAL PointSize AS LONG, _
                                         BYVAL fBold AS LONG, _
                                         BYVAL fItalic AS LONG, _
                                         BYVAL fUnderline AS LONG) AS DWORD
            DECLARE FUNCTION SelectFontProc   (BYVAL hDlg AS DWORD, _
                                               BYVAL id AS LONG, _
                                               hFont AS DWORD, _
                                               pd AS PreviewData) AS LONG
            ' Open and return given file's contents as a string
              LOCAL ff   AS LONG
              LOCAL sBuf AS STRING
              IF LEN(DIR$(sFile)) = 0 THEN
                  MSGBOX "The file does not exist.", %MB_TASKMODAL, "Error"
                  EXIT FUNCTION
              END IF
              ff = FREEFILE
              OPEN sFile FOR BINARY ACCESS READ LOCK SHARED  AS ff LEN = 16000
                  IF ERR THEN  ' Always trap ev. errors on file open actions
                      MSGBOX ERROR$(ERR), %MB_TASKMODAL, "Error"
                      RESET : ERRCLEAR : EXIT FUNCTION
                  END IF
                  GET$ ff, LOF(ff), sBuf
              CLOSE ff
              FUNCTION = sBuf
            END FUNCTION
            FUNCTION findcharactercount() AS LONG
            LOCAL I AS QUAD
            FOR i=1 TO glinestart
               IF glinestart=i THEN
                EXIT FUNCTION
               END IF
               IF i=glinecount THEN EXIT FOR
            NEXT i
            END FUNCTION
            '  FUNCTION = SendMessage(hEdit, %EM_LINESCROLL, x, y)
            'END FUNCTION
            FUNCTION MakeFontEx (BYVAL FontName AS STRING, _
                                 BYVAL PointSize AS LONG, _
                                 BYVAL fBold AS LONG, _
                                 BYVAL fItalic AS LONG, _
                                 BYVAL fUnderline AS LONG) AS DWORD
            ' Create a desired font and return its handle.
              LOCAL hDC AS DWORD, CharSet AS LONG, CyPixels AS LONG
              IF gifontbold THEN fbold=700 ELSE fbold=400
              hDC = GetDC(%HWND_DESKTOP)
                CyPixels  = GetDeviceCaps(hDC, %LOGPIXELSY)
                EnumFontFamilies hDC, BYVAL STRPTR(FontName), CODEPTR(EnumCharSet), BYVAL VARPTR(CharSet)
              ReleaseDC %HWND_DESKTOP, hDC
              PointSize = 0 - (PointSize * CyPixels) \ 72
              FUNCTION = CreateFont(PointSize, 0, _  'height, width(default=0)
                         0, 0, _                     'escapement(angle), orientation
                         fBold, _                    'weight (%FW_DONTCARE = 0, %FW_NORMAL = 400, %FW_BOLD = 700)
                         fItalic, _                  'Italic
                         fUnderline, _               'Underline
                         %FALSE, _                   'StrikeThru
                         CharSet, %OUT_TT_PRECIS, _
                         %CLIP_DEFAULT_PRECIS, %DEFAULT_QUALITY, _
                         %FF_DONTCARE , BYCOPY FontName)
            END FUNCTION
                                  BYVAL FontType AS LONG, CharSet AS LONG) AS LONG
            ' Get type of character set - ansi, symbol, etc. A must for some fonts..
            ' Called from FUNCTION MakeFontEx.
              CharSet = elf.elfLogFont.lfCharSet
            END FUNCTION
            FUNCTION SelectFontProc (BYVAL hDlg AS DWORD, _
                                     BYVAL id AS LONG, _
                                     hFont AS DWORD, _
                                     pd AS PreviewData) AS LONG
            ' Use COMDLG32's Font dialog for font settings
              IF hFont THEN GetObject hFont, SIZEOF(lf), lf
              cf.lStructSize    = SIZEOF(CHOOSEFONTAPI)
              cf.hwndOwner      = hDlg
              cf.lpLogFont      = VARPTR(lf)
              cf.nFontType      = %SCREEN_FONTTYPE
              IF ChooseFont(cf) THEN
                 pd.FontName = lf.lfFaceName
                 pd.FontSize = cf.iPointSize / 10
                 pd.FontType = IIF&(lf.lfWeight < 500, 0, 1)
                 IF lf.lfItalic THEN pd.FontType = pd.FontType OR 2
                 IF lf.lfUnderline THEN pd.FontType = pd.FontType OR 4
                 IF hFont THEN DeleteObject hFont
                 hFont = MakeFontEx (pd.FontName, pd.FontSize, _
                                     lf.lfWeight, lf.lfItalic, lf.lfUnderline)
                 FUNCTION = %TRUE
              END IF
            END FUNCTION
            CALLBACK FUNCTION DlgProc
              LOCAL h, w, x, y AS LONG
              LOCAL i AS LONG
              CASE %WM_INITDIALOG  ' <- Received right before the dialog is shown
                  ' The main program is responsible for maintaining a Static or Global
                  ' PreviewData variable and calling InitPreviewDlg before the Print
                  ' Preview dialog in is used.
                  STATIC pd AS PreviewData  ' <- Defined in
                  InitPreviewDlg pd         ' <- Located in
                   IF LEN(gsText) THEN CONTROL SET TEXT CBHNDL, %listbox , gsText
                    IF hFont THEN DeleteObject hFont
                    hFont = MakeFontEx("Courier New", gifontsize, 0, 0, 0)
                    IF hFont THEN CONTROL SEND CBHNDL, %Listbox, %WM_SETFONT, hFont, 1
                   CONTROL  SET FOCUS ghdlg, %listbox
                    LISTBOX SELECT ghdlg, %listbox, 4&
                    '   CONTROL SEND ghDlg, %listbox , %Es_readonly, 1&,0&
                    IF gcharactercount THEN
                        IF glinecount>=glinestart THEN
                         CONTROL SEND ghDlg, %listbox , %EM_SETSEL, gcharactercount&, gcharactercount+glinestartcharactercount&
                         CONTROL SEND ghDlg, %listbox , %Es_readonly, 1&,0&
                        IF glinestart<=glinecount THEN CONTROL SEND CBHNDL, %LISTBOX, %EM_LINESCROLL,0, glinestart-10
                         CONTROL SEND ghDlg, %listbox , %EM_SETSEL, gcharactercount&, gcharactercount+glinestartcharactercount&
                         CONTROL SEND CBHNDL, %LISTBOX, %EM_LINESCROLL,0, glinecount
                        END IF
                    END IF
              CASE %WM_DESTROY ' <- Received right before the dialog is destroyed
                  IF hFont THEN DeleteObject hFont
               CASE %WM_COMMAND
                  ' Messages from the controls are handled here.
                  ' Example: Button clicks generates a %BN_CLICKED message
                  '          and menu clicks generates the value 1.
                  SELECT CASE AS LONG CBCTL
                  CASE %IDC_BUTNFONT
                      IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                          IF SelectFontProc (CBHNDL, %listbox, hFont, pd) THEN
                              CONTROL SEND CBHNDL, %listbox, %WM_SETFONT, hFont, 1
                          END IF
                      END IF
                   CASE %IDC_BUTNFONT1
                     IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                         IF gifontsize>5 THEN  gifontsize=gifontsize-1
                         IF hFont THEN DeleteObject hFont
                         hFont = MakeFontEx("Courier New", gifontsize, 0, 0, 0)
                         IF hFont THEN CONTROL SEND CBHNDL, %Listbox, %WM_SETFONT, hFont, 1
                         END IF
                    CASE %IDC_BUTNFONT2
                      IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                         IF gifontsize<72 THEN  gifontsize=gifontsize+1
                         IF hFont THEN DeleteObject hFont
                         hFont = MakeFontEx("Courier New", gifontsize, 0, 0, 0)
                         IF hFont THEN CONTROL SEND CBHNDL, %Listbox, %WM_SETFONT, hFont, 1
                      END IF
                     CASE %IDC_BUTNFONT3
                      IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                         IF hFont THEN DeleteObject hFont
                         IF gifontbold THEN gifontbold=0& ELSE gifontbold=1&
                         hFont = MakeFontEx("Courier New", gifontsize, 0, 0, 0)
                         IF hFont THEN
                             CONTROL SEND CBHNDL, %Listbox, %WM_SETFONT, hFont, 1
                          END IF
                      END IF
                  CASE %IDCANCEL      ' "Exit" button or the Esc-key was pressed
                      IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                          DIALOG END CBHNDL, 0
                      END IF
                  END SELECT
              CASE %WM_SIZE  ' is sent on resize - auto-size the TextBox
                  IF CBWPARAM <> %SIZE_MINIMIZED THEN  ' avoid minimized state
                      w = LO(WORD, CBLPARAM)      ' dialog client area's width in pixels
                      h = HI(WORD, CBLPARAM)      ' dialog client area's height in pixels
                      DIALOG PIXELS CBHNDL, w, h TO UNITS w, h  ' convert to dialog units
                      CONTROL GET LOC CBHNDL, %listbox TO x, y      ' we need top pos
                      CONTROL SET SIZE CBHNDL, %listbox, w, h - y   ' auto-size..
                  END IF
              END SELECT
            END FUNCTION
            FUNCTION findwidestpart(BYVAL a AS STRING) AS LONG
            LOCAL i AS LONG
            LOCAL j AS LONG
            LOCAL k AS LONG
            LOCAL l AS LONG
                IF j THEN
                    IF j-i>k THEN k=j-i
                    IF i<l THEN GOTO findagain
                END IF
                IF i<l  AND l-i>k THEN k=l-i
            END FUNCTION
            FUNCTION PBMAIN()
             LOCAL hDlg         AS DWORD
             LOCAL Root         AS STRING
             DIM  Datainthefile(0 TO 0) AS STRING
             LOCAL Filter       AS STRING
             LOCAL FileCount    AS DWORD
             LOCAL filename    AS STRING
             LOCAL I           AS DOUBLE
             LOCAL hfile2   AS LONG
             LOCAL aa       AS STRING
             LOCAL bb AS STRING
             LOCAL vscrollbarwidth AS LONG
             LOCAL vwindowsize AS LONG
             LOCAL hwindowsize AS LONG
            commandline$=" "+TRIM$(COMMAND$)+" "
              IF TEMP1 THEN
                 TEMP2=INSTR(TEMP1+3,UCASE$(commandline$)," ")-(TEMP1+3)
              END IF
            IF I THEN
               IF I THEN gstext=LEFT$(gstext,I-1&)
            END IF
            IF LEN(gstext)>0& THEN
                 SLEEP 10
                 IF glinestart THEN findcharactercount
                  gstext="The file is empty or"+$CRLF+"there is no file on "+$CRLF+_
                  "the command line."+$CRLF+_
                  "An option to start"+$CRLF+"viewing at a specific"+$CRLF+"line can be added"+$CRLF+_
                  "using /L:####"
            END IF
            IF vwindowsize>400& THEN vwindowsize=400&
            IF vwindowsize<100 THEN vwindowsize=100&
            IF hwindowsize>300& THEN hwindowsize=300&
            IF hwindowsize<100 THEN hwindowsize=100&
             DIALOG FONT "Courier New",FONTSIZE
             DIALOG NEW %HWND_DESKTOP, filename, , , vwindowsize, hwindowsize, _
                    %WS_CAPTION OR %WS_SYSMENU OR _
             SetClassLong hDlg, %GCL_HICON, LoadIcon(BYVAL %NULL, BYVAL %IDI_INFORMATION)
            ' CONTROL ADD LISTBOX, hDlg, %ListBox, Datainthefile(), 0,  10, vwindowsize, hwindowsize, %LBS_NOTIFY OR _
            CONTROL ADD TEXTBOX, hDlg, %listbox, "", 0,  10, vwindowsize, hwindowsize, _
                           %WS_VSCROLL , %WS_EX_CLIENTEDGE
            CONTROL SET COLOR hDlg,%listbox,-1,-1
            CONTROL SEND hDlg, %ListBox, %LB_SETHORIZONTALEXTENT, vscrollbarwidth+(fontsize*3&), 0
             CONTROL ADD BUTTON, hDlg, %IDC_BUTNFONT,  "Font",    1, 1, 18, 8
             CONTROL ADD BUTTON, hDlg, %IDC_BUTNFONT1,  "font",    21, 1, 18, 8
             CONTROL ADD BUTTON, hDlg, %IDC_BUTNFONT2,  "FONT",    41, 1, 18, 8
             CONTROL ADD BUTTON, hDlg, %IDC_BUTNFONT3,  "Bold",    61, 1, 18, 8
             CONTROL ADD BUTTON, hDlg, %IDCANCEL,      "E&xit",    81, 1, 18, 8
             hFont = MakeFontEx("Courier New", 10, 2, 0, 0)
             IF hFont THEN
                 CONTROL SEND hDlg, %Listbox, %WM_SETFONT, hFont, 1
            '     SLEEP 20
             END IF
             hbuttonFont = MakeFontEx("Courier New", gibuttonfontsize, 0, 0, 0)
             IF hbuttonFont THEN
                 CONTROL SEND hDlg, %Listbox, %WM_SETFONT, hbuttonfont, 1
             END IF
             DIALOG SHOW MODAL hDlg CALL DlgProc
            END FUNCTION
            p purvis


            • #7
              i have had some problems in working with a textbox but i did learn something the hard way.
              it makes no sense for a beginner programmer in windows to try to keep a certain line highlighted for viewing purposes, i am not sure if it is even possible.

              example, i wanted my program to load a file in a textbox and goto a certain line and highlight that line for the viewer, and i also wanted the viewer to be able to change lines in the viewed textbox for copying and pasting experience in doing that, forget about it. you have to highlight text in order to copy it to the clipboard. i have found no way to easily color the text in a textbox, maybe i made the wrong choice in trying to highlight a line when i should of been trying to color the text.

              i altered a previous program that was using textbox for displaying a text file, that was my other problem.
              programming to me like going to war, i that an experienced warrior will pick the right weapons to use. the more weapons he has and that he knows how to use them, and the pros and cons that come with using each weapon usually comes from the experience or the knowledge of others they have passed on.

              learning what is possible or not possible with a certain control type makes all the difference and also knowing what control types are available. before using a control type, try your best to identify all the possible needs your control will need now and in the future of that same program and do your best to find out whether or not the control supports your needs.

              i made some assumptions of what a control could do, or at least do easily without a tremendous amount of coding, that seemed to be my biggest mistake that cause a lot of stress and time to me. i will now look for a place on this forum that list the pros and cons of certain control types.

              p purvis


              • #8
                sorry about posting in the wrong section
                the txt2wndw program is a gui program and not a console program

                the source listing from above with just small code change
                compiled with pbwin 9.04
                i just wanted to upload the exe long with the source
                Attached Files
                Last edited by Paul Purvis; 19 Mar 2010, 03:20 PM.
                p purvis