Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "libts.h"   
00025 
00026 #include <assert.h>
00027 #include <stdarg.h>
00028 #include <stdlib.h>
00029 #include <string.h>
00030 
00031 #define INK_MAX_STRING_ARRAY_SIZE 128
00032 
00033 
00034 
00035 char *
00036 ink_memcpy_until_char(char *dst, char *src, unsigned int n, unsigned char c)
00037 {
00038   unsigned int i = 0;
00039   for (; ((i < n) && (((unsigned char) src[i]) != c)); i++)
00040     dst[i] = src[i];
00041   return &src[i];
00042 }
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 char *
00056 ink_strncpy(char *dest, const char *src, int n)
00057 {
00058   if (likely(src && dest)) {
00059     if (n > 1)
00060       strncpy(dest, src, (n - 1));
00061     if (n > 0)
00062       dest[n - 1] = '\0';
00063   }
00064 
00065   return (dest);
00066 }                               
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 char *
00080 ink_strncat(char *dest, const char *src, int n)
00081 {
00082   if (likely(src && dest)) {
00083     if (n > 1)
00084       strncat(dest, src, (n - 1));
00085     if (n > 0)
00086       dest[n - 1] = '\0';
00087   }
00088 
00089   return (dest);
00090 }                               
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 char *
00103 ink_string_concatenate_strings(char *dest, ...)
00104 {
00105   va_list ap;
00106   char *s, *d;
00107 
00108   va_start(ap, dest);
00109 
00110   d = dest;
00111 
00112   while (1) {
00113     s = va_arg(ap, char *);
00114     if (s == NULL)
00115       break;
00116 
00117     while (*s)
00118       *d++ = *s++;
00119   }
00120   *d++ = '\0';
00121   va_end(ap);
00122   return (dest);
00123 }                               
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 char *
00138 ink_string_concatenate_strings_n(char *dest, int n, ...)
00139 {
00140   va_list ap;
00141   char *s, *d;
00142 
00143   va_start(ap, n);
00144 
00145   d = dest;
00146 
00147   while (n > 1) {
00148     s = va_arg(ap, char *);
00149     if (s == NULL)
00150       break;
00151     while (*s && (n > 1)) {
00152       *d++ = *s++;
00153       n--;
00154     }
00155   }
00156   if (n >= 1)
00157     *d = '\0';
00158   va_end(ap);
00159   return (dest);
00160 }                               
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 char *
00174 ink_string_append(char *dest, char *src, int n)
00175 {
00176   char *d, *s, *last_valid_char;
00177 
00178   ink_assert(src != NULL);
00179   ink_assert(dest != NULL);
00180   ink_assert(n >= 0);
00181 
00182   if (n == 0)
00183     return (dest);
00184 
00185   last_valid_char = dest + n - 1;
00186 
00187   
00188 
00189   for (d = dest; (d <= last_valid_char) && (*d != '\0'); d++);
00190 
00191   
00192 
00193   if (d > last_valid_char) {
00194     dest[n - 1] = '\0';
00195     return (dest);
00196   }
00197 
00198   
00199 
00200   s = src;
00201   while ((d < last_valid_char) && (*s != '\0'))
00202     *d++ = *s++;
00203 
00204   
00205 
00206   if (d > last_valid_char)
00207     dest[n - 1] = '\0';
00208   else
00209     *d = '\0';
00210 
00211   return (dest);
00212 }                               
00213 
00214 
00215 #if !HAVE_STRLCPY
00216 size_t
00217 ink_strlcpy(char *dst, const char *src, size_t siz)
00218 {
00219   char *d = dst;
00220   const char *s = src;
00221   size_t n = siz;
00222 
00223   
00224   if (n != 0) {
00225     while (--n != 0) {
00226       if ((*d++ = *s++) == '\0')
00227         break;
00228     }
00229   }
00230 
00231   
00232   if (n == 0) {
00233     if (siz != 0)
00234                             *d = '\0';      
00235     while (*s++)
00236       ;
00237   }
00238 
00239   return (s - src - 1);   
00240 }
00241 #endif
00242 
00243 #if !HAVE_STRLCAT
00244 size_t
00245 ink_strlcat(char *dst, const char *src, size_t siz)
00246 {
00247   char *d = dst;
00248   const char *s = src;
00249   size_t n = siz;
00250   size_t dlen;
00251 
00252   
00253   while (n-- != 0 && *d != '\0')
00254     d++;
00255   dlen = d - dst;
00256   n = siz - dlen;
00257 
00258   if (n == 0)
00259     return (dlen + strlen(s));
00260   while (*s != '\0') {
00261     if (n != 1) {
00262       *d++ = *s;
00263       n--;
00264     }
00265     s++;
00266   }
00267   *d = '\0';
00268 
00269   return (dlen + (s - src));  
00270 }
00271 #endif
00272