home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mm / mm-0.90 / support.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-18  |  2.5 KB  |  147 lines

  1. /*
  2.  * Copyright (c) 1986, 1990 by The Trustees of Columbia University in
  3.  * the City of New York.  Permission is granted to any individual or
  4.  * institution to use, copy, or redistribute this software so long as it
  5.  * is not sold for profit, provided this copyright notice is retained.
  6.  */
  7.  
  8. #ifndef lint
  9. static char *rcsid = "$Header: /f/src2/encore.bin/cucca/mm/tarring-it-up/RCS/support.c,v 2.1 90/10/04 18:26:48 melissa Exp $";
  10. #endif
  11.  
  12. #include "mm.h"
  13. #include "ccmd.h"
  14.  
  15. /*
  16.  * safe_strcat:
  17.  * do a strcat, but malloc up the required space first.
  18.  * possibly put a space in before the string, depending on context.
  19.  * Note: returns dest if src is NULL.
  20.  */
  21.  
  22. char *malloc(), *realloc();
  23.  
  24. char *
  25. safe_strcat(dest,src,usespace) 
  26. char *dest, *src;
  27. int usespace;
  28. {
  29.     int space=FALSE;
  30.     char c1,c2;
  31.  
  32.  
  33.     if (src == NULL)
  34.         return (dest);
  35.     if (dest) {
  36.     if (usespace) {
  37.         c1 = dest[strlen(dest)-1];
  38.         c2 = src[0];
  39.         if (isalnum(c1)) 
  40.         space = TRUE;
  41.         if (c2 == '@' || c2 == '>' || c2 == ')')
  42.         space = FALSE;
  43.         if (c1 == '>' || c1 == ')' || c1 == '\"')
  44.         space = TRUE;
  45.     }
  46.     dest = realloc(dest,strlen(dest)+strlen(src)+1+(space?1:0));
  47.     if (dest == nil) {
  48.         cmxprintf("?Out of memory");
  49.         ccmd_errnp(CMxOK);
  50.     }
  51.     if (space) 
  52.         strcat(dest," ");
  53.     strcat(dest,src);
  54.     }
  55.     else {
  56.     dest = malloc(strlen(src)+1);
  57.     if (dest == nil) {
  58.         cmxprintf("?Out of memory");
  59.         ccmd_errnp(CMxOK);
  60.     }
  61.     strcpy(dest,src);
  62.     }
  63.     return(dest);
  64. }
  65.  
  66.  
  67.  
  68. char *
  69. safe_realloc(cp, size)
  70. char *cp;
  71. int size;
  72. {
  73.     char *realloc(), *malloc();
  74.  
  75.     if (cp)
  76.     return(realloc(cp,size));
  77.     else
  78.     return(malloc(size));
  79. }
  80.  
  81.  
  82. /*
  83.  * safe_strcpy:
  84.  * copy str into a newly malloc'ed buffer
  85.  * Note: when str is NULL, returns NULL
  86.  */
  87.  
  88. char *
  89. safe_strcpy(str) 
  90. char *str;
  91. {
  92.     char *x;
  93.     
  94.     if (str == NULL)
  95.         return (NULL);
  96.     x = malloc(strlen(str)+1);
  97.     if (!x)
  98.     panic ("Out of memory");
  99.     strcpy(x,str);
  100.     return(x);
  101. }
  102.  
  103.  
  104.  
  105. #define min(x,y) (((x) < (y)) ? (x) : (y))
  106.  
  107.  
  108. /*
  109.  * safe_strncat:
  110.  * Note: returns dest if src is NULL
  111.  */
  112.  
  113. char *
  114. safe_strncat(dest,src,n) 
  115. char *src,*dest;
  116. int n;
  117. {
  118.     char *x;
  119.     int srclen, destlen;
  120.  
  121.     if (src == NULL)
  122.         return(dest);
  123.     srclen = min(strlen(src),n);
  124.  
  125.     if (dest)
  126.     destlen = strlen(dest);
  127.     else 
  128.     destlen = 0;
  129.         
  130.     if (dest) 
  131.     x = realloc(dest,srclen + destlen + 1);
  132.     else
  133.     x = malloc(srclen + 1);
  134.     if (!x)
  135.     panic ("Out of memory");
  136.     strncat(x,src,srclen);
  137.     return(x);
  138. }
  139.  
  140.  
  141. char *
  142. safe_free(str) char *str; {
  143.     if (str) free(str);
  144.     return((char *)NULL);
  145. }
  146.  
  147.