home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / recio213.zip / rstr.c < prev    next >
C/C++ Source or Header  |  1995-09-05  |  6KB  |  175 lines

  1. /*****************************************************************************
  2.    MODULE: rstr.c
  3.   PURPOSE: recio essential string functions
  4. COPYRIGHT: (C) 1994-1995, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.13
  8.   RELEASE: September 4, 1995
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16.  
  17. #include "recio.h"
  18.  
  19. /****************************************************************************/
  20. char *                       /* return trimmed string                       */
  21.     scntrimbegs(             /* trim beginning of string                    */
  22.         char  *str,          /* string to trim                              */
  23.         int    ch,           /* character to match                          */
  24.         size_t num)          /* maximum number of characters to trim        */
  25. /****************************************************************************/
  26. {
  27.     char *sp;                /* string pointer */
  28.     size_t i=0;              /* counter */
  29.  
  30.     if (str && *str && ch && num) {
  31.         sp = str;
  32.  
  33.         /* increment through string while match is true */
  34.         /* match any white space if ch is space */
  35.         while ((ch == ' ') ? (isspace(*sp)) : (*sp == ch)) {
  36.             sp++;
  37.             i++;
  38.             if (i==num) break;
  39.         }
  40.  
  41.         if (sp != str) memmove(str, sp, strlen(sp)+1);
  42.     }
  43.     return str;
  44. }
  45.  
  46. /****************************************************************************/
  47. char *                       /* return trimmed string                       */
  48.     scntrimends(             /* trim end of string                          */
  49.         char *str,           /* string to trim                              */
  50.         int    ch,           /* character to match                          */
  51.         size_t num)          /* maximum number of characters to trim        */
  52. /****************************************************************************/
  53. {
  54.     char *sp;                /* string pointer */
  55.     size_t i=0;              /* counter */
  56.  
  57.     if (str && *str && ch && num) {
  58.         /* point sp at last character in string */
  59.         sp = str + strlen(str) - 1;
  60.  
  61.         /* decrement through string while match is true */
  62.         /* match any white space if ch is space */
  63.         while ((ch == ' ') ? (isspace(*sp)) : (*sp == ch)) {
  64.             *sp = '\0';
  65.             if (sp-- == str) break;
  66.             i++;
  67.             if (i==num) break;
  68.         }
  69.     }
  70.     return str;
  71. }
  72.  
  73. /****************************************************************************/
  74. char *                       /* return trimmed string                       */
  75.     scntrims(                /* trim character from both ends of string     */
  76.         char *str,           /* string to trim                              */
  77.         int    ch,           /* character to match                          */
  78.         size_t num)          /* maximum number of characters to trim        */
  79. /****************************************************************************/
  80. {
  81.     return scntrimbegs(scntrimends(str, ch, num), ch, num);
  82. }
  83.  
  84. /****************************************************************************
  85. Precondition: set dst to null ptr when declaring it, e.g. char *dst=NULL;
  86.          Use: call from scpys macro, e.g. scpys(dst, src);
  87.               scpys macro passes dst by reference
  88.   Obligation: free dst when finished with it, e.g. free(dst);
  89. *****************************************************************************/
  90. char *                  /* return dst                                       */
  91.     _scpys(             /* copy string dynamically                          */
  92.         char **dst,     /* destination string pointer                       */
  93.   const char  *src)     /* source string pointer                            */
  94. /****************************************************************************/
  95. {                       
  96.   size_t dlen;          /* strlen of dst */
  97.   size_t slen;          /* strlen of src */
  98.   int errnum;           /* error number */
  99.  
  100.   /* if null src pointer */
  101.   if (!src) {
  102.     rseterr(NULL, EINVAL);
  103.     free(*dst);
  104.     *dst = NULL;
  105.     goto done;
  106.   }
  107.   
  108.   if (*dst) {
  109.     dlen = strlen(*dst);
  110.     slen = strlen(src);
  111.     if (dlen < slen) {
  112.       do {
  113.         *dst = (char *) realloc(*dst, slen+1);
  114.         if (!*dst) {
  115.           errnum = rseterr(NULL, ENOMEM);
  116.           if (errnum) goto done;
  117.         }
  118.       } while (!*dst);
  119.     }
  120.     strcpy(*dst, src);
  121.   } else {
  122.      do {
  123.        *dst = strdup(src);
  124.        if (!*dst) {
  125.          errnum = rseterr(NULL, ENOMEM);
  126.          if (errnum) goto done;
  127.        }
  128.      } while (!*dst);
  129.    }
  130. done:
  131.   return *dst;
  132. }
  133.  
  134. /****************************************************************************
  135. Precondition: set dst to null ptr when declaring it, e.g. char *dst=NULL;
  136.          Use: call from scats macro, e.g. scats(dst, src);
  137.               scats macro passes dst by reference
  138.   Obligation: free dst when finished with it, e.g. free(dst);
  139. *****************************************************************************/
  140. char *                  /* return dst                                       */
  141.     _scats(             /* concat string dynamically                        */
  142.         char **dst,     /* destination string pointer                       */
  143.   const char *src)      /* source string pointer                            */
  144. /****************************************************************************/
  145. {                       
  146.   size_t dlen;          /* strlen of dst */
  147.   size_t slen;          /* strlen of src */
  148.  
  149.   /* if null src pointer or src empty, do nothing to dst */
  150.   if (!src || !*src) {
  151.     goto done;
  152.   }
  153.   
  154.   if (*dst) {
  155.     dlen = strlen(*dst);
  156.     slen = strlen(src);
  157.     do {
  158.       *dst = (char *) realloc(*dst, dlen+slen+1);
  159.       if (!*dst) {
  160.         if (rseterr(NULL, ENOMEM)) goto done;
  161.       }
  162.     } while (!*dst);
  163.     strcat(*dst, src);
  164.   } else {
  165.      do {
  166.        *dst = strdup(src);
  167.        if (!*dst) {
  168.          if (rseterr(NULL, ENOMEM)) goto done;
  169.        }
  170.      } while (!*dst);
  171.    }
  172. done:
  173.   return *dst;
  174. }
  175.