home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0020 - 0029 / ibm0020-0029 / ibm0028.tar / ibm0028 / GRLF-C-2.ZIP / GFUNC / STRWD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-30  |  2.8 KB  |  141 lines

  1. /*
  2.  * strwd.c
  3.  * contains: strwd(),strwdlf(),strwdrt()
  4.  *
  5.  *   Copyright (C)1987-1990 Greenleaf Software Inc. All Rights Reserved.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include "gfuncts.h"
  11.  
  12. int GF_CONV strwc(),GF_CONV strmove(),GF_CONV strwd();
  13. int GF_CONV strwdlf(),GF_CONV strwdrt();
  14.  
  15. /*
  16.  *  int
  17.  * strwd(str,start,num)
  18.  *
  19.  * ARGUMENT
  20.  *  (char *)    str    -    pointer to string
  21.  *  (int)    start    -    first word to delete (leftmost==0)
  22.  *  (int)    num    -    number of words to delete
  23.  *     
  24.  * DESCRIPTION
  25.  *  Zero or more words are deleted and the string is shortened.  Words
  26.  *  to be deleted start with start in str. "num" words are deleted unless
  27.  *  the count of words is less than that in which case the string is set
  28.  *  to a null string.
  29.  *
  30.  * RETURNS
  31.  *  Number of characters deleted.
  32.  */
  33. int GF_CONV strwd(ps,start,num)
  34. char *ps;
  35. int start, num;
  36. {
  37.     int curword,words,chs,inword,stop,delon, delrt,last;
  38.     char *pt;
  39.  
  40.     words=strwc(ps);
  41.     if(start<=0)
  42.         start=1;
  43.     if(start>words||num<=0)
  44.         return 0;
  45.     if ((start+num)>(words+1)) {
  46.         chs=strlen(ps);
  47.         *ps='\0';
  48.         return chs;
  49.     } else {
  50.         stop=start+num;
  51.         if (start+num-1==words) 
  52.             delrt=1;
  53.         else 
  54.             delrt=0;
  55.         pt=ps;
  56.         last=inword=chs=curword=delon=0;
  57.         while (1) {
  58.             if(!*ps) {
  59.                 last=1;
  60.                 inword=0;
  61.             }
  62.             if (gisspace(*ps)) {
  63.                 if(delrt&&curword==(start-1)) {    
  64.                     *ps='\0';
  65.                     return chs;
  66.                 }
  67.                 if(inword) 
  68.                     inword=0;
  69.                 else 
  70.                     goto point1;
  71.             } else if(!inword) {
  72.                 inword=1;
  73.                 ++curword;
  74.                 if(curword==start) {
  75.                     delon=1;
  76.                     pt=ps;
  77.                 }
  78.                 else if(curword==stop) {
  79.                     strmove(pt,ps);
  80.                     return chs;
  81.                 }
  82.             }
  83.             if(last)
  84.                 return(chs);
  85. point1:
  86.             if (delon) 
  87.                 ++chs;
  88.             ++ps;
  89.         }
  90.     }
  91. }
  92.  
  93. /*
  94.  *  int
  95.  * strwdlf(str,num)
  96.  *
  97.  * ARGUMENT
  98.  *  (char *)    str    -    pointer to string
  99.  *  (int)    num    -    number of words to delete
  100.  *     
  101.  * DESCRIPTION
  102.  *  Zero or more words are deleted starting at the left side of string (str)
  103.  *  "num" words are deleted unless the count of words is less than that in 
  104.  *  which case the string is set to a null string.
  105.  *
  106.  * RETURNS
  107.  *  Number of characters deleted.
  108.  */
  109. int GF_CONV strwdlf(ps,num)
  110. char *ps;
  111. int num;
  112. {
  113.     return strwd(ps,1,num);
  114. }
  115.  
  116. /*
  117.  *  int
  118.  * strwdrt(str,num)
  119.  *
  120.  * ARGUMENT
  121.  *  (char *)    str    -    pointer to string
  122.  *  (int)    num    -    number of words to delete
  123.  *     
  124.  * DESCRIPTION
  125.  *  Zero or more words are deleted starting at the right side of string (str)
  126.  *  "num" words are deleted unless the count of words is less than that in 
  127.  *  which case the string is set to a null string.
  128.  *
  129.  * RETURNS
  130.  *  Number of characters deleted.
  131.  */
  132. int GF_CONV strwdrt(ps,num)
  133. char *ps;
  134. int num;
  135. {
  136.     int start;
  137.  
  138.     start=strwc(ps)-num+1;
  139.     return strwd(ps,start,num);
  140. }
  141.