00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "services.h"
00015
00016
00017
00018 #if !HAVE_SNPRINTF
00019
00020
00021
00022
00023
00024
00025 #if BAD_SNPRINTF
00026 int vsnprintf(char *buf, size_t len, const char *fmt, va_list args)
00027 {
00028 if (len <= 0)
00029 return 0;
00030 *buf = 0;
00031 vsnprintf(buf, len, fmt, args);
00032 buf[len - 1] = 0;
00033 return strlen(buf);
00034 }
00035 #endif
00036
00037 int snprintf(char *buf, size_t len, const char *fmt, ...)
00038 {
00039 va_list args;
00040 int ret = 0;
00041
00042 va_start(args, fmt);
00043 ret = vsnprintf(buf, len, fmt, args);
00044 va_end(args);
00045 return ret;
00046 }
00047
00048 #endif
00049
00050
00051
00052 #if !HAVE_STRICMP && !HAVE_STRCASECMP
00053
00054
00055
00056
00057
00058 int stricmp(const char *s1, const char *s2)
00059 {
00060 register int c;
00061
00062 while ((c = tolower(*s1)) == tolower(*s2)) {
00063 if (c == 0)
00064 return 0;
00065 s1++;
00066 s2++;
00067 }
00068 if (c < tolower(*s2))
00069 return -1;
00070 return 1;
00071 }
00072
00073 int strnicmp(const char *s1, const char *s2, size_t len)
00074 {
00075 register int c;
00076
00077 if (!len)
00078 return 0;
00079 while ((c = tolower(*s1)) == tolower(*s2) && len > 0) {
00080 if (c == 0 || --len == 0)
00081 return 0;
00082 s1++;
00083 s2++;
00084 }
00085 if (c < tolower(*s2))
00086 return -1;
00087 return 1;
00088 }
00089 #endif
00090
00091
00092
00093 #if !HAVE_STRDUP
00094 char *strdup(const char *s)
00095 {
00096 char *new = calloc(strlen(s) + 1, 1);
00097 if (new)
00098 strcpy(new, s);
00099 return new;
00100 }
00101 #endif
00102
00103
00104
00105 #if !HAVE_STRSPN
00106 size_t strspn(const char *s, const char *accept)
00107 {
00108 size_t i = 0;
00109
00110 while (*s && strchr(accept, *s))
00111 ++i, ++s;
00112 return i;
00113 }
00114 #endif
00115
00116
00117
00118 #if !HAVE_STRERROR
00119 # if HAVE_SYS_ERRLIST
00120 extern char *sys_errlist[];
00121 # endif
00122
00123 char *strerror(int errnum)
00124 {
00125 # if HAVE_SYS_ERRLIST
00126 return sys_errlist[errnum];
00127 # else
00128 static char buf[20];
00129 snprintf(buf, sizeof(buf), "Error %d", errnum);
00130 return buf;
00131 # endif
00132 }
00133 #endif
00134
00135
00136
00137 #if !HAVE_STRSIGNAL
00138
00139
00140
00141
00142 char *strsignal(int signum)
00143 {
00144 static char buf[32];
00145 switch (signum) {
00146 #ifndef _WIN32
00147 case SIGHUP:
00148 strscpy(buf, "Hangup", sizeof(buf));
00149 break;
00150 #endif
00151 case SIGINT:
00152 strscpy(buf, "Interrupt", sizeof(buf));
00153 break;
00154 #ifndef _WIN32
00155 case SIGQUIT:
00156 strscpy(buf, "Quit", sizeof(buf));
00157 break;
00158 #endif
00159 #ifdef SIGILL
00160 case SIGILL:
00161 strscpy(buf, "Illegal instruction", sizeof(buf));
00162 break;
00163 #endif
00164 #ifdef SIGABRT
00165 case SIGABRT:
00166 strscpy(buf, "Abort", sizeof(buf));
00167 break;
00168 #endif
00169 #if defined(SIGIOT) && (!defined(SIGABRT) || SIGIOT != SIGABRT)
00170 case SIGIOT:
00171 strscpy(buf, "IOT trap", sizeof(buf));
00172 break;
00173 #endif
00174 #ifdef SIGBUS
00175 case SIGBUS:
00176 strscpy(buf, "Bus error", sizeof(buf));
00177 break;
00178 #endif
00179 case SIGFPE:
00180 strscpy(buf, "Floating point exception", sizeof(buf));
00181 break;
00182 #ifndef _WIN32
00183 case SIGKILL:
00184 strscpy(buf, "Killed", sizeof(buf));
00185 break;
00186 case SIGUSR1:
00187 strscpy(buf, "User signal 1", sizeof(buf));
00188 break;
00189 #endif
00190 case SIGSEGV:
00191 strscpy(buf, "Segmentation fault", sizeof(buf));
00192 break;
00193 #ifndef _WIN32
00194 case SIGUSR2:
00195 strscpy(buf, "User signal 2", sizeof(buf));
00196 break;
00197 case SIGPIPE:
00198 strscpy(buf, "Broken pipe", sizeof(buf));
00199 break;
00200 case SIGALRM:
00201 strscpy(buf, "Alarm clock", sizeof(buf));
00202 break;
00203 #endif
00204 case SIGTERM:
00205 strscpy(buf, "Terminated", sizeof(buf));
00206 break;
00207 #ifndef _WIN32
00208 case SIGSTOP:
00209 strscpy(buf, "Suspended (signal)", sizeof(buf));
00210 break;
00211 case SIGTSTP:
00212 strscpy(buf, "Suspended", sizeof(buf));
00213 break;
00214 case SIGIO:
00215 strscpy(buf, "I/O error", sizeof(buf));
00216 break;
00217 #endif
00218 default:
00219 snprintf(buf, sizeof(buf), "Signal %d\n", signum);
00220 break;
00221 }
00222 return buf;
00223 }
00224 #endif
00225
00226
00227