home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / vos2-121.zip / v / texted / fmtc.cpp next >
C/C++ Source or Header  |  1998-10-01  |  5KB  |  219 lines

  1. //===========================>>> vTextEditor::formatC <<<=====================
  2.  int vTextEditor::formatC(long count)
  3.   {
  4.     /* format C code according to Bruce's style */
  5.  
  6.     int oldef, i, ij, ik, spaces, tabs, prev_key;
  7.     long prev_lnum;
  8.  
  9.     char prev_line[40];
  10.     char prev_prev_line[40];
  11.  
  12.     oldef = state.echof;
  13.     if ( curlin >= _nextLine-1)    /* can't do last line */
  14.     return 0;
  15.  
  16.     if (count > 1)
  17.     state.echof = 0;
  18.  
  19.     for (i = 1 ; i <= count ; ++i, lineDownBeg((long)1))
  20.       {
  21.     if ((prev_lnum = get_prev(prev_line,curlin)) <= 0)    /* get the previous line */
  22.         continue;            /* handle 1st line of file! */
  23.  
  24.     (void) get_prev(prev_prev_line,prev_lnum);    /* and the line before it */
  25.  
  26.     if (*prev_line != ' ' && *prev_line != '\t')    /* funny line */
  27.       {
  28.         lineDownBeg((long)1);
  29.         break;            /* give up */
  30.       }
  31.  
  32.     /* count previous tabs/spaces */
  33.     tabs = spaces = 0;
  34.     for (ij = 0 ; ij < 38 ; ++ij)
  35.       {
  36.         if (prev_line[ij] == '\t')
  37.           {
  38.         spaces = 0;        /* skip embedded spaces */
  39.         ++tabs;
  40.           }
  41.         else if (prev_line[ij] == ' ')
  42.         ++spaces;
  43.         else
  44.         break;            /* break on first non tab non blank */
  45.       }
  46.     if (tabs == 0 && spaces <= 2)
  47.       {
  48.         lineDownBeg((long) 1);
  49.         break;            /* give up on function heads */
  50.       }
  51.  
  52.     /* now process current line */
  53.     beglin((long)1);        /* start at beginning of line */
  54.  
  55.     if (curlin >= _nextLine-1)
  56.         break;        /* done */
  57.  
  58.     /* don't fix blank lines */
  59.  
  60.     if (GCh(curchr) != ' ' && GCh(curchr) != '\t' )
  61.       {
  62.         lineDownBeg((long) 1);
  63.         break;        /* break on line I don't know about */
  64.       }
  65.  
  66.     while (GCh(curchr) == ' ' || GCh(curchr) == '\t')
  67.         delnxt((long)1);        /* delete them */
  68.  
  69.     if (GCh(curchr) == '\n')
  70.         continue;        /* skip blank lines */
  71.  
  72.     /* determine spacing of current line based on prev line */
  73.  
  74.     prev_key = 0;
  75.     if (is_key_word(&prev_line[ij],1))    /* a kew word! */
  76.       {
  77.         prev_key = 1;            /* last line was key */
  78.         if (GCh(curchr) == '{')
  79.         spaces += 2;
  80.         else
  81.         spaces += 4;
  82.       }
  83.     else if (prev_line[ij] == '{')
  84.       {
  85.         spaces += 2;
  86.       }
  87.     else if (prev_line[ij] == '}')
  88.       {
  89.         spaces -= 2;
  90.       }
  91.  
  92.     if (has_key(bp+curchr), "else"))
  93.       {
  94.         if (prev_line[ij] != '}')
  95.         spaces -= 4;
  96.       }
  97.     else if (has_key(bp+curchr), "case") ||
  98.       has_key((bp+curchr), "default:"))
  99.       {
  100.         if (prev_line[ij] != '{')
  101.         spaces -= 4;
  102.       }
  103.     else if (!prev_key && prev_line[ij] != '{' && 
  104.       prev_line[ij] != '}' && is_key_word(prev_prev_line,0))
  105.         spaces -= 4;
  106.  
  107.     /* don't else next one, works with last else if */
  108.     if (GCh(curchr) == '}')    /* } */
  109.         spaces -= 2;
  110.  
  111.     /* fix tab/space counts */
  112.     if (spaces < 0)
  113.       {
  114.         if (--tabs < 0)
  115.         tabs = 0;
  116.         spaces = 8 + spaces;
  117.       }
  118.     while (spaces >= 8)
  119.       {
  120.         ++tabs;
  121.         spaces -= 8;
  122.       }
  123.  
  124.     for (ik = 0 ; ik < tabs ; ++ik)
  125.         charInsert('\t');
  126.     for (ik = 0 ; ik < spaces ; ++ik)
  127.         charInsert(' ');
  128.  
  129.       }    /* end of main for loop */
  130.  
  131.     state.echof = oldef;
  132.     if (oldef && count > 1)
  133.     verify();
  134.  
  135.     return 1;
  136.  
  137.   }
  138.  
  139. // =============================>>> vTextEditor::has_key <<<=======================
  140.   int vTextEditor::has_key(char *buff_ptr, char *key)
  141.   {
  142.     while (*key)
  143.       {
  144.     if (*buff_ptr++ != *key++)
  145.         return 0;
  146.       }
  147.     return 1;    /* buff_ptr matches key up to key's EOS */
  148.  
  149.   }
  150.  
  151. // ==========================>>> vTextEditor::is_key_word <<<====================== 
  152.   int vTextEditor::is_key_word(char *bf, int case_def)
  153.   {
  154.     char *strstr();
  155.  
  156.     while (*bf == ' ' || *bf == '\t')    /* skip leading white */
  157.     ++bf;
  158.     if (strstr(bf,"if(") == bf)
  159.     return 1;
  160.     if (strstr(bf,"if (") == bf)
  161.     return 1;
  162.     if (strstr(bf,"for(") == bf)
  163.     return 1;
  164.     if (strstr(bf,"for (") == bf)
  165.     return 1;
  166.     if (strstr(bf,"while(") == bf)
  167.     return 1;
  168.     if (strstr(bf,"while (") == bf)
  169.     return 1;
  170.     if (strstr(bf,"else") == bf)
  171.     return 1;
  172.     if (strstr(bf,"typedef ") == bf)
  173.     return 1;
  174.     if (strstr(bf,"struct ") == bf)
  175.     return 1;
  176.     if (strstr(bf,"switch(") == bf)
  177.     return 1;
  178.     if (strstr(bf,"switch (") == bf)
  179.     return 1;
  180.     if (case_def && strstr(bf,"case ") == bf)
  181.     return 1;
  182.     if (case_def && strstr(bf,"default:") == bf)
  183.     return 1;
  184.     return 0;
  185.   }
  186.  
  187. //=============================>>> vTextEditor::get_prev <<<======================
  188.   long vTextEditor::get_prev(TEXT *prev_buff, long start)
  189.   {    // Get previous non-blank line in text buffer (BEW: 10/1/98)
  190.     long pline;
  191.     int ix, blank_line;
  192.     BUFFPTR bi;
  193.  
  194.     *prev_buff = 0;            /* empty line for sure */
  195.     pline = start;
  196. GP_TOP:
  197.     --pline;                /* previous line */
  198.  
  199.     if (pline <= 1)
  200.     return 0;            /* there is no previous line */
  201.  
  202.     bi = GLine(pline);        /* first char of buffer */
  203.  
  204.     blank_line = 1;
  205.     for (ix = 0 ; ix < 38 ; ++ix)
  206.       {
  207.     if (GCh(bi+ix) == '\n')
  208.         break;
  209.     prev_buff[ix] = GCh(bi+ix);    /* copy the char */
  210.     if (prev_buff[ix] != ' ' || prev_buff[ix] != '\t')
  211.        blank_line = 0;        /* not a blank line */
  212.       }
  213.     prev_buff[ix] = 0;            /* terminate the string */
  214.     if (blank_line || prev_buff[0] == '#')
  215.     goto GP_TOP;            /* find previous non-blank line */
  216.  
  217.     return pline;
  218.   }
  219.