387 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			387 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* Copyright (C) 1991 Free Software Foundation, Inc.
 | |
| This file contains excerpts of the GNU C Library.
 | |
| 
 | |
| The GNU C Library is free software; you can redistribute it and/or
 | |
| modify it under the terms of the GNU Library General Public License as
 | |
| published by the Free Software Foundation; either version 2 of the
 | |
| License, or (at your option) any later version.
 | |
| 
 | |
| The GNU C Library is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| Library General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU Library General Public
 | |
| License along with the GNU C Library; see the file COPYING.LIB.  If
 | |
| not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 | |
| Cambridge, MA 02139, USA.  */
 | |
| 
 | |
| #include "sysincludes.h"
 | |
| #include "mtools.h"
 | |
| 
 | |
| #ifndef HAVE_STRDUP
 | |
| 
 | |
| 
 | |
| char *strdup(const char *str)
 | |
| {
 | |
|     char *nstr;
 | |
| 
 | |
|     if (str == (char*)0)
 | |
|         return 0;
 | |
| 
 | |
|     nstr = (char*)malloc((strlen(str) + 1));
 | |
| 
 | |
|     if (nstr == (char*)0)
 | |
|     {
 | |
|         (void)fprintf(stderr, "strdup(): not enough memory to duplicate `%s'\n",
 | |
| 		      str);
 | |
| 	exit(1);
 | |
|     }
 | |
| 
 | |
|     (void)strcpy(nstr, str);
 | |
| 
 | |
|     return nstr;
 | |
| }
 | |
| #endif /* HAVE_STRDUP */
 | |
| 
 | |
| 
 | |
| #ifndef HAVE_MEMCPY
 | |
| /*
 | |
|  * Copy contents of memory (with possible overlapping).
 | |
|  */
 | |
| char *memcpy(char *s1, const char *s2, size_t n)
 | |
| {
 | |
| 	bcopy(s2, s1, n);
 | |
| 	return(s1);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_MEMSET
 | |
| /*
 | |
|  * Copies the character c, n times to string s
 | |
|  */
 | |
| char *memset(char *s, char c, size_t n)
 | |
| {
 | |
| 	char *s1 = s;
 | |
| 
 | |
| 	while (n > 0) {
 | |
| 		--n;
 | |
| 		*s++ = c;
 | |
| 	}
 | |
| 	return(s1);
 | |
| }
 | |
| #endif /* HAVE_MEMSET */
 | |
| 
 | |
| 
 | |
| #ifndef HAVE_STRCHR
 | |
| 
 | |
| char * strchr (const char* s, int c)
 | |
| {
 | |
| 	if (!s) return NULL;
 | |
| 	while (*s && *s != c) s++;
 | |
| 	if (*s) 
 | |
| 		return (char*) s;
 | |
| 	else
 | |
| 		return NULL;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_STRRCHR
 | |
| 
 | |
| char * strrchr (const char* s1, int c) 
 | |
| {
 | |
| 	char* s = (char*) s1;
 | |
| 	char* start = (char*) s;
 | |
| 	if (!s) return NULL;
 | |
| 	s += strlen(s)-1;
 | |
| 	while (*s != c && (unsigned long) s != (unsigned long) start) s--;
 | |
| 	if ((unsigned long) s == (unsigned long) start && *s != c)
 | |
| 		return NULL;
 | |
| 	else
 | |
| 		return s;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_STRPBRK
 | |
| /*
 | |
|  * Return ptr to first occurrence of any character from `brkset'
 | |
|  * in the character string `string'; NULL if none exists.
 | |
|  */
 | |
| char *strpbrk(const char *string, const char *brkset)
 | |
| {
 | |
| 	register char *p;
 | |
| 
 | |
| 	if (!string || !brkset)
 | |
| 		return(0);
 | |
| 	do {
 | |
| 		for (p = brkset; *p != '\0' && *p != *string; ++p)
 | |
| 			;
 | |
| 		if (*p != '\0')
 | |
| 			return(string);
 | |
| 	}
 | |
| 	while (*string++);
 | |
| 	return(0);
 | |
| }
 | |
| #endif /* HAVE_STRPBRK */
 | |
| 
 | |
| 
 | |
| #ifndef HAVE_STRTOUL
 | |
| static int getdigit(char a, int max)
 | |
| {
 | |
| 	int dig;
 | |
| 	
 | |
| 	if(a < '0')
 | |
| 		return -1;
 | |
| 	if(a <= '9') {
 | |
| 		dig = a - '0';
 | |
| 	} else if(a >= 'a')
 | |
| 		dig = a - 'a' + 10;
 | |
| 	else if(a >= 'A')
 | |
| 		dig = a - 'A' + 10;
 | |
| 	if(dig >= max)
 | |
| 		return -1;
 | |
| 	else
 | |
| 		return dig;
 | |
| }
 | |
| 
 | |
| unsigned long strtoul(const char *string, char **eptr, int base)
 | |
| {
 | |
| 	int accu, dig;
 | |
| 
 | |
| 	if(base < 1 || base > 36) {
 | |
| 		if(string[0] == '0') {
 | |
| 			switch(string[1]) {
 | |
| 			       	case 'x':
 | |
| 				case 'X':
 | |
| 					return strtoul(string+2, eptr, 16);
 | |
| 				case 'b':
 | |
| 			       	case 'B':
 | |
| 					return strtoul(string+2, eptr, 2);
 | |
| 				default:
 | |
| 					return strtoul(string, eptr, 8);
 | |
| 			}
 | |
| 		}
 | |
| 	       	return strtoul(string, eptr, 10);
 | |
| 	}
 | |
| 	if(base == 16 && string[0] == '0' &&
 | |
| 	   (string[1] == 'x' || string[1] == 'X'))
 | |
| 		string += 2;
 | |
| 
 | |
| 	if(base == 2 && string[0] == '0' &&
 | |
| 	   (string[1] == 'b' || string[1] == 'B'))
 | |
| 		string += 2;
 | |
| 	accu = 0;
 | |
| 	while( (dig = getdigit(*string, base)) != -1 ) {
 | |
| 		accu = accu * base + dig;
 | |
| 		string++;
 | |
| 	}
 | |
| 	if(eptr)
 | |
| 		*eptr = (char *) string;
 | |
| 	return accu;
 | |
| }
 | |
| #endif /* HAVE_STRTOUL */
 | |
| 
 | |
| #ifndef HAVE_STRTOL
 | |
| long strtol(const char *string, char **eptr, int base)
 | |
| {
 | |
| 	long l;
 | |
| 
 | |
| 	if(*string == '-') {
 | |
| 		return -(long) strtoul(string+1, eptr, base);
 | |
| 	} else {
 | |
| 		if (*string == '+')
 | |
| 			string ++;
 | |
| 		return (long) strtoul(string, eptr, base);
 | |
| 	}
 | |
| }
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| #ifndef HAVE_STRSPN
 | |
| /* Return the length of the maximum initial segment
 | |
|    of S which contains only characters in ACCEPT.  */
 | |
| size_t strspn(const char *s, const char *accept)
 | |
| {
 | |
|   register char *p;
 | |
|   register char *a;
 | |
|   register size_t count = 0;
 | |
| 
 | |
|   for (p = s; *p != '\0'; ++p)
 | |
|     {
 | |
|       for (a = accept; *a != '\0'; ++a)
 | |
| 	if (*p == *a)
 | |
| 	  break;
 | |
|       if (*a == '\0')
 | |
| 	return count;
 | |
|       else
 | |
| 	++count;
 | |
|     }
 | |
| 
 | |
|   return count;
 | |
| }
 | |
| #endif /* HAVE_STRSPN */
 | |
| 
 | |
| #ifndef HAVE_STRCSPN
 | |
| /* Return the length of the maximum inital segment of S
 | |
|    which contains no characters from REJECT.  */
 | |
| size_t strcspn (const char *s, const char *reject)
 | |
| {
 | |
|   register size_t count = 0;
 | |
| 
 | |
|   while (*s != '\0')
 | |
|     if (strchr (reject, *s++) == NULL)
 | |
|       ++count;
 | |
|     else
 | |
|       return count;
 | |
| 
 | |
|   return count;
 | |
| }
 | |
| 
 | |
| #endif /* HAVE_STRCSPN */
 | |
| 
 | |
| #ifndef HAVE_STRERROR
 | |
| 
 | |
| #ifndef DECL_SYS_ERRLIST
 | |
| extern char *sys_errlist[];
 | |
| #endif
 | |
| 
 | |
| char *strerror(int errno)
 | |
| {
 | |
|   return sys_errlist[errno];
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_STRCASECMP
 | |
| /* Compare S1 and S2, ignoring case, returning less than, equal to or
 | |
|    greater than zero if S1 is lexiographically less than,
 | |
|    equal to or greater than S2.  */
 | |
| int strcasecmp(const char *s1, const char *s2)
 | |
| {
 | |
|   register const unsigned char *p1 = (const unsigned char *) s1;
 | |
|   register const unsigned char *p2 = (const unsigned char *) s2;
 | |
|   unsigned char c1, c2;
 | |
| 
 | |
|   if (p1 == p2)
 | |
|     return 0;
 | |
| 
 | |
|   do
 | |
|     {
 | |
|       c1 = tolower (*p1++);
 | |
|       c2 = tolower (*p2++);
 | |
|       if (c1 == '\0')
 | |
| 	break;
 | |
|     }
 | |
|   while (c1 == c2);
 | |
| 
 | |
|   return c1 - c2;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| #ifndef HAVE_STRCASECMP
 | |
| /* Compare S1 and S2, ignoring case, returning less than, equal to or
 | |
|    greater than zero if S1 is lexiographically less than,
 | |
|    equal to or greater than S2.  */
 | |
| int strncasecmp(const char *s1, const char *s2, size_t n)
 | |
| {
 | |
|   register const unsigned char *p1 = (const unsigned char *) s1;
 | |
|   register const unsigned char *p2 = (const unsigned char *) s2;
 | |
|   unsigned char c1, c2;
 | |
| 
 | |
|   if (p1 == p2)
 | |
|     return 0;
 | |
| 
 | |
|   c1 = c2 = 1;
 | |
|   while (c1 && c1 == c2 && n-- > 0)
 | |
|     {
 | |
|       c1 = tolower (*p1++);
 | |
|       c2 = tolower (*p2++);
 | |
|     }
 | |
| 
 | |
|   return c1 - c2;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_GETPASS
 | |
| char *getpass(const char *prompt)
 | |
| {
 | |
| 	static char password[129];
 | |
| 	int l;
 | |
| 
 | |
| 	fprintf(stderr,"%s",prompt);
 | |
| 	fgets(password, 128, stdin);
 | |
| 	l = strlen(password);
 | |
| 	if(l && password[l-1] == '\n')
 | |
| 		password[l-1] = '\0';
 | |
| 	return password;
 | |
| 
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_ATEXIT
 | |
| 
 | |
| #ifdef HAVE_ON_EXIT
 | |
| int atexit(void (*function)(void))
 | |
| {
 | |
| 	return on_exit( (void(*)(int,void*)) function, 0);
 | |
| }
 | |
| #else
 | |
| 
 | |
| typedef struct exitCallback {
 | |
| 	void (*function) (void);
 | |
| 	struct exitCallback *next;
 | |
| } exitCallback_t;
 | |
| 
 | |
| static exitCallback_t *callback = 0;
 | |
| 
 | |
| int atexit(void (*function) (void))
 | |
| {
 | |
| 	exitCallback_t *newCallback;
 | |
| 		
 | |
| 	newCallback = New(exitCallback_t);
 | |
| 	if(!newCallback) {
 | |
| 		printOom();
 | |
| 		exit(1);
 | |
| 	}
 | |
| 	newCallback->function = function;
 | |
| 	newCallback->next = callback;
 | |
| 	callback = newCallback;
 | |
| 	return 0;
 | |
| }
 | |
| #undef exit
 | |
| 
 | |
| void myexit(int code)
 | |
| {
 | |
|   void (*function)(void);
 | |
| 
 | |
|   while(callback) {
 | |
|     function = callback->function;
 | |
|     callback = callback->next;
 | |
|     function();
 | |
|   }
 | |
|   exit(code);
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif
 | |
| 
 | |
| /*#ifndef HAVE_BASENAME*/
 | |
| const char *_basename(const char *filename)
 | |
| {
 | |
| 	char *ptr;
 | |
| 
 | |
| 	ptr = strrchr(filename, '/');
 | |
| 	if(ptr)
 | |
| 		return ptr+1;
 | |
| 	else
 | |
| 		return filename;
 | |
| }
 | |
| /*#endif*/
 | |
| 
 | |
| 
 | 
