fptools.c

来自「UUDeview是一个编码解码器」· C语言 代码 · 共 529 行

C
529
字号
/* * fptools.c, some helper functions for getcgi.c and uu(en|de)view * * Distributed under the terms of the GNU General Public License. * Use and be happy. */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef SYSTEM_WINDLL#include <windows.h>#endif#ifdef SYSTEM_OS2#include <os2.h>#endif/* * This file provides replacements for some handy functions that aren't * available on all systems, like most of the <string.h> functions. They * should behave exactly as their counterparts. There are also extensions * that aren't portable at all (like strirstr etc.). * The proper behaviour in a configure script is as follows: *    AC_CHECK_FUNC(strrchr,AC_DEFINE(strrchr,_FP_strrchr)) * This way, the (probably less efficient) replacements will only be used * where it is not provided by the default libraries. Be aware that this * does not work with replacements that just shadow wrong behaviour (like * _FP_free) or provide extended functionality (_FP_gets). * The above is not used in the uuenview/uudeview configuration script, * since both only use the replacement functions in non-performance-cri- * tical sections (except for _FP_tempnam and _FP_strerror, where some * functionality of the original would be lost). */#include <stdio.h>#include <ctype.h>#ifdef STDC_HEADERS#include <stdlib.h>#include <string.h>#endif#ifdef HAVE_MALLOC_H#include <malloc.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#ifdef HAVE_MEMORY_H#include <memory.h>#endif#include <fptools.h>#if 0#ifdef SYSTEM_WINDLLBOOL _export WINAPIDllEntryPoint (HINSTANCE hInstance, DWORD seginfo,	       LPVOID lpCmdLine){  /* Don't do anything, so just return true */  return TRUE;}#endif#endifchar * fptools_id = "$Id: fptools.c,v 1.8 2004/02/24 00:05:32 fp Exp $";/* * some versions of free can't handle a NULL pointer properly * (ANSI says, free ignores a NULL pointer, but some machines * prefer to SIGSEGV on it) */void TOOLEXPORT_FP_free (void *ptr){  if (ptr) free (ptr);}/* * This is non-standard, so I'm defining my own */char * TOOLEXPORT_FP_strdup (char *string){  char *result;  if (string == NULL)    return NULL;  if ((result = (char *) malloc (strlen (string) + 1)) == NULL)    return NULL;  strcpy (result, string);  return result;}/* * limited-length string copy. this function behaves differently from * the original in that the dest string is always terminated with a * NULL character. */char * TOOLEXPORT_FP_strncpy (char *dest, char *src, int length){  char *odest=dest;  if (src == NULL || dest == NULL || length-- <= 0)    return dest;  while (length-- && *src)    *dest++ = *src++;  *dest++ = '\0';  return odest;}/* * duplicate a memory area */void * TOOLEXPORT_FP_memdup (void *ptr, int len){  void *result;  if (ptr == NULL)    return NULL;  if ((result = malloc (len)) == NULL)    return NULL;  memcpy (result, ptr, len);  return result;}/* * case-insensitive compare */int TOOLEXPORT_FP_stricmp (char *str1, char *str2){  if (str1==NULL || str2==NULL)    return -1;  while (*str1) {    if (tolower(*str1) != tolower(*str2))      break;    str1++;    str2++;  }  return (tolower (*str1) - tolower (*str2));}int TOOLEXPORT_FP_strnicmp (char *str1, char *str2, int count){  if (str1==NULL || str2==NULL)    return -1;  while (*str1 && count) {    if (tolower(*str1) != tolower(*str2))      break;    str1++;    str2++;    count--;  }  return count ? (tolower (*str1) - tolower (*str2)) : 0;}/* * autoconf says this function might be a compatibility problem */char * TOOLEXPORT_FP_strstr (char *str1, char *str2){  char *ptr1, *ptr2;  if (str1==NULL)    return NULL;  if (str2==NULL)    return str1;  while (*(ptr1=str1)) {    for (ptr2=str2;	 *ptr1 && *ptr2 && *ptr1==*ptr2;	 ptr1++, ptr2++)      /* empty loop */ ;    if (*ptr2 == '\0')      return str1;    str1++;  }  return NULL;}char * TOOLEXPORT_FP_strpbrk (char *str, char *accept){  char *ptr;  if (str == NULL)    return NULL;  if (accept == NULL || *accept == '\0')    return str;  for (; *str; str++)    for (ptr=accept; *ptr; ptr++)      if (*str == *ptr)	return str;  return NULL;}/* * autoconf also complains about this one */char * TOOLEXPORT_FP_strtok (char *str1, char *str2){  static char *optr;  char *ptr;  if (str2 == NULL)    return NULL;  if (str1) {    optr = str1;  }  else {    if (*optr == '\0')      return NULL;  }  while (*optr && strchr (str2, *optr))	/* look for beginning of token */    optr++;  if (*optr == '\0')			/* no token found */    return NULL;  ptr = optr;  while (*optr && strchr (str2, *optr) == NULL) /* look for end of token */    optr++;  if (*optr) {    *optr++ = '\0';  }  return ptr;}/* * case insensitive strstr. */char * TOOLEXPORT_FP_stristr (char *str1, char *str2){  char *ptr1, *ptr2;  if (str1==NULL)    return NULL;  if (str2==NULL)    return str1;  while (*(ptr1=str1)) {    for (ptr2=str2;	 *ptr1 && *ptr2 && tolower(*ptr1)==tolower(*ptr2);	 ptr1++, ptr2++)      /* empty loop */ ;    if (*ptr2 == '\0')      return str1;    str1++;  }  return NULL;}/* * Nice fake of the real (non-standard) one */char * TOOLEXPORT_FP_strrstr (char *ptr, char *str){  char *found=NULL, *new, *iter=ptr;  if (ptr==NULL || str==NULL)    return NULL;  if (*str == '\0')    return ptr;  while ((new = _FP_strstr (iter, str)) != NULL) {    found = new;    iter  = new + 1;  }  return found;}char * TOOLEXPORT_FP_strirstr (char *ptr, char *str){  char *found=NULL, *iter=ptr, *new;  if (ptr==NULL || str==NULL)    return NULL;  if (*str == '\0')    return ptr;  while ((new = _FP_stristr (iter, str)) != NULL) {    found = new;    iter  = new + 1;  }  return found;}/* * convert whole string to case */char * TOOLEXPORT_FP_stoupper (char *input){  char *iter = input;  if (input == NULL)    return NULL;  while (*iter) {    *iter = toupper (*iter);    iter++;  }  return input;}char * TOOLEXPORT_FP_stolower (char *input){  char *iter = input;  if (input == NULL)    return NULL;  while (*iter) {    *iter = tolower (*iter);    iter++;  }  return input;}/* * string matching with wildcards */int TOOLEXPORT_FP_strmatch (char *string, char *pattern){  char *p1 = string, *p2 = pattern;  if (pattern==NULL || string==NULL)    return 0;  while (*p1 && *p2) {    if (*p2 == '?') {      p1++; p2++;    }    else if (*p2 == '*') {      if (*++p2 == '\0')	return 1;      while (*p1 && *p1 != *p2)	p1++;    }    else if (*p1 == *p2) {      p1++; p2++;    }    else      return 0;  }  if (*p1 || *p2)    return 0;  return 1;}char * TOOLEXPORT_FP_strrchr (char *string, int tc){  char *ptr;  if (string == NULL || !*string)    return NULL;  ptr = string + strlen (string) - 1;  while (ptr != string && *ptr != tc)    ptr--;  if (*ptr == tc)    return ptr;  return NULL;}/* * strip directory information from a filename. Works only on DOS and * Unix systems so far ... */char * TOOLEXPORT_FP_cutdir (char *filename){  char *ptr;  if (filename == NULL)    return NULL;  if ((ptr = _FP_strrchr (filename, '/')) != NULL)    ptr++;  else if ((ptr = _FP_strrchr (filename, '\\')) != NULL)    ptr++;  else    ptr = filename;  return ptr;}/* * My own fgets function. It handles all kinds of line terminators * properly: LF (Unix), CRLF (DOS) and CR (Mac). In all cases, the * terminator is replaced by a single LF */char * TOOLEXPORT_FP_fgets (char *buf, int n, FILE *stream){  char *obp = buf;  int c;  if (feof (stream))    return NULL;  while (--n && !feof (stream)) {    if ((c = fgetc (stream)) == EOF) {      if (ferror (stream))	return NULL;      else {	if (obp == buf)	  return NULL;	*buf = '\0';	return obp;      }    }    if (c == '\015') { /* CR */      /*       * Peek next character. If it's no LF, push it back.       * ungetc(EOF, stream) is handled correctly according       * to the manual page       */      if ((c = fgetc (stream)) != '\012')	if (!feof (stream))	  ungetc (c, stream);      *buf++ = '\012';      *buf   = '\0';      return obp;    }    else if (c == '\012') { /* LF */      *buf++ = '\012';      *buf   = '\0';      return obp;    }    /*     * just another standard character     */    *buf++ = c;  }  /*   * n-1 characters already transferred   */  *buf = '\0';  /*   * If a line break is coming up, read it   */  if (!feof (stream)) {    if ((c = fgetc (stream)) == '\015' && !feof (stream)) {      if ((c = fgetc (stream)) != '\012' && !feof (stream)) {	ungetc (c, stream);      }    }    else if (c != '\012' && !feof (stream)) {      ungetc (c, stream);    }  }  return obp;}/* * A replacement strerror function that just returns the error code */char * TOOLEXPORT_FP_strerror (int errcode){  static char number[8];  sprintf (number, "%03d", errcode);  return number;}/* * tempnam is not ANSI, but tmpnam is. Ignore the prefix here. */char * TOOLEXPORT_FP_tempnam (char *dir, char *pfx){  return _FP_strdup (tmpnam (NULL));}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?