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

  1. /*
  2. CTAGS
  3. This macro implements ME's CTAGS capability. It assumes that you have
  4. generated a TAGS file using the CTAGS.EXE utility provided. Pressing the
  5. <CTRL T> key will invoke this macro.
  6.  
  7. See the chapter on CTAGS in the ME user's manual for a description of how
  8. this function works.
  9. */
  10.  
  11. #include mekeys.h
  12.  
  13. #define HORIZ     1
  14. #define VERT      2
  15. #define TOP_LEFT  3
  16. #define TOP_RIGHT 4
  17. #define BOT_LEFT  5
  18. #define BOT_RIGHT 6
  19.  
  20. string BoxChars[10];
  21.  
  22.  
  23. string tag_pattern;
  24.  
  25.  
  26. init()
  27. {
  28.   assign_key("tags", CTRL_T);
  29. }
  30.  
  31. tags()
  32. {
  33.   string funcname, fname;
  34.  
  35.   funcname = get_tty_str("What function? (Press <ENTER> for list) ");
  36.  
  37.   /*
  38.     Get the name of the file which contains the chosen function
  39.   */
  40.   if ((fname = search_for_tag(funcname)) == "")
  41.     return;
  42.     
  43.   /*
  44.     Read the file
  45.   */
  46.   old_buf = currbuf();
  47.   if (!(new_buf = find_buffer(fname)))
  48.     new_buf = setcurrbuf(create_buffer(fname));
  49.  
  50.   /*
  51.     Search the file for the fucntion definition
  52.   */
  53.   normalize_tagpat();
  54.   gobof();
  55.   if (fsearch(tag_pattern))
  56.     show_buffer(new_buf);
  57.   else
  58.   {
  59.     show_buffer(old_buf);
  60.     get_tty_str("Sorry - can't find function %s", tag_pattern);
  61.     bell();
  62.   }
  63. }
  64.  
  65.  
  66. search_for_tag(funcname)
  67.   string funcname;
  68. {
  69.   string tag_filename;
  70.  
  71.   /*
  72.     Read the TAGS file into a buffer
  73.   */
  74.   old_buf = currbuf();
  75.   tag_buf = create_buffer("TAGS");
  76.   setcurrbuf(tag_buf);
  77.  
  78.   /* No TAGS file ? */
  79.   if (currline() == "")
  80.   {
  81.     setcurrbuf(old_buf);
  82.     delete_buffer(tag_buf);
  83.     get_tty_str("There is no TAGS file");
  84.     bell();
  85.     return "";
  86.   }
  87.   
  88.   tag_filename = "";
  89.  
  90.   /*
  91.     The user wants to see a list of all functions.... Show it!
  92.   */
  93.   if (funcname == "")
  94.   {
  95.     funcname = show_all_tags();
  96.     if (funcname == "")
  97.     {
  98.       setcurrbuf(old_buf);
  99.       delete_buffer(tag_buf);
  100.       return "";
  101.     }
  102.   }
  103.  
  104.  
  105.   /*
  106.     Search the tags file for the function which the user requested
  107.   */
  108.   if (fsearch(strcat("^", funcname)))
  109.   {
  110.     while (!is_eol() && currchar() != '\t')
  111.       right();
  112.     while (!is_eol() && currchar() == '\t')
  113.       right();
  114.     tag_filename = getword(0);
  115.     tag_pattern  = getword(1);
  116.   }
  117.   else
  118.   {
  119.     bell();
  120.     get_tty_str("Sorry - can't find function %s", funcname);
  121.   }
  122.  
  123.   /*
  124.     Get rid of the TAGS buffer
  125.   */
  126.   setcurrbuf(old_buf);
  127.   delete_buffer(tag_buf);
  128.   return tag_filename;
  129. }
  130.  
  131.  
  132. show_all_tags()
  133. {
  134.   string fname;
  135.  
  136.   tag_buf = currbuf();
  137.   tmp_buf = create_buffer("FUNCTION LIST");
  138.   setcurrbuf(tag_buf);
  139.  
  140.   while (!is_eof())
  141.   {
  142.     /*
  143.       Extract the first word (the function name)
  144.     */
  145.     tabpos = index(line = currline(), "\t");
  146.     if (tabpos > 0)
  147.       fname = substr(line, 1, tabpos-1);
  148.     else if ((tabpos = index(line = currline(), " ")) > 0)
  149.       fname = substr(line, 1, tabpos-1);
  150.     else
  151.       fname = "<*** ERROR - NO TAB OR SPACE IN LINE ***>";
  152.  
  153.     setcurrbuf(tmp_buf);
  154.     gobol();
  155.     fast_insert(fname);  insert("\n");
  156.     message("Processed [%s]", fname);
  157.     setcurrbuf(tag_buf);
  158.     if (!down())  break;
  159.   }
  160.  
  161.   /*
  162.     Get rid of the last blank line
  163.   */
  164.   setcurrbuf(tmp_buf);
  165.   goeof();
  166.   delline();
  167.   gobof();
  168.  
  169.   fname = show_file(tmp_buf);
  170.   goto xxx;
  171.  
  172.  
  173.   /*
  174.     Show the function list in a full-screen window
  175.   */
  176.   show_buffer(tmp_buf);
  177.   explode_window();
  178.   markline();   /* highlite the first entry */
  179.  
  180.   /*
  181.     Let the user choose a function
  182.   */
  183.   while ((c = get_tty_char()) != ESC && c != '\r')
  184.   {
  185.     if (c == _UP)
  186.       up_entry();
  187.     else if (c == _DOWN)
  188.       down_entry();
  189.   }
  190.   clear_mark();
  191.  
  192.   if (c == '\r')
  193.     fname = currline();
  194.  
  195.   /*
  196.     Get rid of the listing buffer
  197.   */
  198.   unexplode_window();
  199.  
  200. xxx:
  201.   delete_buffer(tmp_buf);
  202.   setcurrbuf(tag_buf);
  203.   gobof();
  204.  
  205.   if (c == ESC)                 /* we didn't choose a file */
  206.     return "";
  207.   else                          /* we chose a file to edit */
  208.     return fname;
  209. }
  210.  
  211.  
  212. up_entry()
  213. {
  214.   if (currlinenum() > 1)
  215.   {
  216.     clear_mark();
  217.     up();
  218.     markline();
  219.   }
  220. }
  221.  
  222. down_entry()
  223. {
  224.   if (currlinenum() < lastlinenum())
  225.   {
  226.     clear_mark();
  227.     down();
  228.     markline();
  229.   }
  230. }
  231.  
  232.  
  233. /* normalize_tagpat - since '*' is a metachar, we must change a tag pattern */
  234. /*   like "^char *foo()" to "^char ?foo()".  Kludgy, but it works!          */
  235. normalize_tagpat()
  236. {
  237.   while ((i = index(tag_pattern, "*")) > 0)
  238.   {
  239.     tag_pattern = sprintf("%s?%s",
  240.                  substr(tag_pattern, 1, i-1), substr(tag_pattern, i+1, 100));
  241.   }
  242. }
  243.  
  244. /*
  245. A typical line of the TAGS file looks like this :
  246. AllocPage[\t]VM.C[\t]/^PAGE *AllocPage()$/
  247. */
  248. getword(eat_rest_of_line)
  249. {
  250.   /* Go past initial blanks */
  251.   while (!is_eol() && (currchar() == '\t' || currchar() == ' '))
  252.     right();
  253.   if (currchar() == '?' || currchar() == '/')
  254.     right();
  255.  
  256.   word = "";
  257.   while (!is_eol() && (eat_rest_of_line || !isspace(currchar())))
  258.   {
  259.     word = strcat(word, chr(currchar()));
  260.     right();
  261.   }
  262.   left();
  263.   if (currchar() == '?' || currchar() == '/')
  264.     word = substr(word, 1, strlen(word)-1);
  265.   right();
  266.   return word;
  267. }
  268.  
  269.  
  270.  
  271. show_file(buf_id)
  272. {
  273.   int  filecolor;
  274.  
  275.   /* Get rid of the trailing newline in the function list */
  276.   setcurrbuf(buf_id);
  277.   goeof();
  278.   delline();
  279.   gobof();
  280.  
  281.   filecolor = 0x07;
  282.  
  283.   /* Create the menu and attach the function listing to it */
  284.   win_id = create_window(8, 20, 15, 60, filecolor);
  285.   attach_window(win_id, buf_id);
  286.   DrawBox(6, 19, 15, 61, filecolor);
  287.   display(15, 25, 52, filecolor, " Press UP, DN, ENTER or ESC ");
  288.  
  289.   /* Let the user interact with the menu */
  290.   return MenuProcess();
  291. }
  292.  
  293.  
  294. /* ------------------------- MENU PROCESSING ------------------------- */
  295.  
  296. MenuProcess()
  297. {
  298.   markline();
  299.  
  300.   while ((c = get_tty_char()) != '\r' && c != ESC)
  301.     if (c == _UP || c == _DOWN || c == PGUP || c == PGDN)
  302.       MenuMove(c);
  303.     else
  304.       bell();
  305.   
  306.   if (c == '\r')
  307.     return currline();
  308.   else
  309.     return "";
  310. }
  311.  
  312. MenuMove(key)
  313. {
  314.   clear_mark();
  315.   command(key);
  316.   markline();
  317. }
  318.  
  319. DrawBox(row1, col1, row2, col2, color)
  320. {
  321.   BoxChars[HORIZ]     = "═";
  322.   BoxChars[VERT]      = "║";
  323.   BoxChars[TOP_LEFT]  = "╔";
  324.   BoxChars[TOP_RIGHT] = "╗";
  325.   BoxChars[BOT_LEFT]  = "╚";
  326.   BoxChars[BOT_RIGHT] = "╝";
  327.   
  328.   start_row = row1;
  329.   start_col = col1;
  330.   end_row   = row2;
  331.   end_col   = col2;
  332.  
  333.   width = col2 - col1 + 1;
  334.   horiz_line = repstr(BoxChars[HORIZ], width - 2);
  335.   blank_line = repstr(" ", width - 2);
  336.  
  337.   display(row1, col1 + 1, col1 + width - 1,  color, horiz_line);
  338.   display(row2, col1 + 1, col1 + width - 1,  color, horiz_line);
  339.   for (r = row1+1;  r < row2;  r++)
  340.   {
  341.     display(r, col1, col1, color, BoxChars[VERT]);
  342.     display(r, col2, col2, color, BoxChars[VERT]);
  343.   }
  344.   display(row1, col1, col1,  color, BoxChars[TOP_LEFT]);
  345.   display(row1, col2, col2,  color, BoxChars[TOP_RIGHT]);
  346.   display(row2, col1, col1,  color, BoxChars[BOT_LEFT]);
  347.   display(row2, col2, col2,  color, BoxChars[BOT_RIGHT]);
  348. }
  349.