home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / ME22-OS2.ZIP / MACROS.ZIP / FINDFUNC.M < prev    next >
Text File  |  1989-02-04  |  6KB  |  207 lines

  1. /*****************************************************************************\
  2.  *                                                                           *
  3.  * FINDFUNC.C                                                                *
  4.  *   This macro will traverse the current buffer (assumed to contain a C     *
  5.  * source file or even an ME macro file) and will look for all function      *
  6.  * definitions. It will then display a menu with all of the function names   *
  7.  * in it. You can move through the menu using the UP and DOWN arrow keys,    *
  8.  * and when you get to a function that you want to go to, you press the      *
  9.  * ENTER key. The menu will vanish and the cursor will move to that function *
  10.  * definition.                                                               *
  11.  *                                                                           *
  12.  * This macro is invoked by pressing the ALT F key.                          *
  13.  *                                                                           *
  14.  * This macro was suggested by John Herbold of CompuCom Inc.                 *
  15.  *                                                                           *
  16.  * Written by Marc Adler of Magma Systems on 2/4/89                          *
  17.  *                                                                           *
  18. \*****************************************************************************/
  19.  
  20. #include mekeys.h
  21.  
  22. #define CFUNC_PATTERN   "^[a-zA-Z_]?*(?*)$"
  23.  
  24. #define HORIZ     1
  25. #define VERT      2
  26. #define TOP_LEFT  3
  27. #define TOP_RIGHT 4
  28. #define BOT_LEFT  5
  29. #define BOT_RIGHT 6
  30.  
  31. string BoxChars[10];
  32.  
  33.  
  34. init()
  35. {
  36.   assign_key("FindFunction", ALT_F);
  37. }
  38.  
  39. FindFunction()
  40. {
  41.   nfuncs = 0;
  42.   linenum = 0;
  43.  
  44.   /* Save the current position and go to the first line of the file */
  45.   save_position();
  46.   gobof();
  47.  
  48.   /* Create a temp buffer which will hold the function definitions */
  49.   orig_buf = currbuf();
  50.   temp_buf = create_buffer("FUNCTION LIST");
  51.  
  52.   /* Go thru the source code, looking for a function definition */
  53.   while (fsearch(CFUNC_PATTERN))
  54.   {
  55.     /* record the line number where we found this function */
  56.     cln = currlinenum();
  57.  
  58.     /* get rid of everything except the function name */
  59.     funcdef = rtrim(substr(currline(), 1, index(currline(), "(") - 1));
  60.     while ((i = index(funcdef, " ")) > 0)
  61.       funcdef = substr(funcdef, i+1, 100);
  62.     while ((i = index(funcdef, "*")) > 0)
  63.       funcdef = substr(funcdef, i+1, 100);
  64.  
  65.     /* 
  66.        Insert the function name into the temp buffer,
  67.        followed by the line number in column 50
  68.     */
  69.     setcurrbuf(temp_buf);
  70.     insert(funcdef);
  71.     setcol(50);
  72.     insert(sprintf("%d", cln));
  73.     append_line();
  74.     nfuncs++;
  75.     setcurrbuf(orig_buf);
  76.     if (!down())  break;
  77.   }
  78.  
  79.   /* Move back to the original position in the buffer */
  80.   restore_position();
  81.  
  82.   if (!nfuncs)
  83.     get_tty_str("No functions were found");
  84.   else
  85.   {
  86.     /* 
  87.        Display the list of functions in a nice menu. The return value 
  88.        is "" if the user pressed ESC, or the menu line if the user    
  89.        pressed ENTER.
  90.     */
  91.     if ((line = show_file(temp_buf)) != "")
  92.       linenum = atoi(substr(line, 50, 8));
  93.   }
  94.  
  95.   /* Get rid of the temp buffer and move to the line which the user chose */
  96.   delete_buffer(temp_buf);
  97.   show_buffer(orig_buf);
  98.   if (linenum > 0)
  99.     goline(linenum);
  100. }
  101.  
  102.  
  103. show_file(buf_id)
  104. {
  105.   int  filecolor;
  106.  
  107.   /* Get rid of the trailing newline in the function list */
  108.   setcurrbuf(buf_id);
  109.   goeof();
  110.   delline();
  111.   gobof();
  112.  
  113.   filecolor = 0x07;
  114.  
  115.   /* Create the menu and attach the function listing to it */
  116.   win_id = create_window(8, 20, 15, 60, filecolor);
  117.   attach_window(win_id, buf_id);
  118.   DrawBox(6, 19, 15, 61, filecolor);
  119.   display(15, 25, 52, filecolor, " Press UP, DN, ENTER or ESC ");
  120.  
  121.   /* Let the user interact with the menu */
  122.   return MenuProcess();
  123. }
  124.  
  125.  
  126. /* ------------------------- MENU PROCESSING ------------------------- */
  127.  
  128. MenuProcess()
  129. {
  130.   markline();
  131.  
  132.   while ((c = get_tty_char()) != '\r' && c != ESC)
  133.   {
  134.     switch (c)
  135.     {
  136.       case _UP  :
  137.         MenuUp();
  138.         break;
  139.       case _DOWN :
  140.         MenuDown();
  141.         break;
  142.       default   :
  143.         bell();
  144.         break;
  145.     }
  146.   }
  147.   
  148.   if (c == '\r')
  149.     return currline();
  150.   else
  151.     return "";
  152. }
  153.  
  154.  
  155. MenuUp()
  156. {
  157.   if (currlinenum() > 1)
  158.   {
  159.     clear_mark();
  160.     up();
  161.     markline();
  162.   }
  163. }
  164.  
  165. MenuDown()
  166. {
  167.   if (currlinenum() < lastlinenum())
  168.   {
  169.     clear_mark();
  170.     down();
  171.     markline();
  172.   }
  173. }
  174.  
  175.  
  176. DrawBox(row1, col1, row2, col2, color)
  177. {
  178.   BoxChars[HORIZ]     = "═";
  179.   BoxChars[VERT]      = "║";
  180.   BoxChars[TOP_LEFT]  = "╔";
  181.   BoxChars[TOP_RIGHT] = "╗";
  182.   BoxChars[BOT_LEFT]  = "╚";
  183.   BoxChars[BOT_RIGHT] = "╝";
  184.   
  185.   start_row = row1;
  186.   start_col = col1;
  187.   end_row   = row2;
  188.   end_col   = col2;
  189.  
  190.   width = col2 - col1 + 1;
  191.   horiz_line = repstr(BoxChars[HORIZ], width - 2);
  192.   blank_line = repstr(" ", width - 2);
  193.  
  194.   display(row1, col1 + 1, col1 + width - 1,  color, horiz_line);
  195.   display(row2, col1 + 1, col1 + width - 1,  color, horiz_line);
  196.   for (r = row1+1;  r < row2;  r++)
  197.   {
  198.     display(r, col1, col1, color, BoxChars[VERT]);
  199.     display(r, col2, col2, color, BoxChars[VERT]);
  200.   }
  201.   display(row1, col1, col1,  color, BoxChars[TOP_LEFT]);
  202.   display(row1, col2, col2,  color, BoxChars[TOP_RIGHT]);
  203.   display(row2, col1, col1,  color, BoxChars[BOT_LEFT]);
  204.   display(row2, col2, col2,  color, BoxChars[BOT_RIGHT]);
  205. }
  206.  
  207.