⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileutil.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
#include <unistd.h>#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <stdlib.h>#include "catdoc.h"#ifdef __TURBOC__#include <dir.h>#include <dos.h>#endif#if defined(MSDOS) && !defined(__MSDOS__)#define __MSDOS__#endif#ifndef __MSDOS__#include <glob.h>#endif/************************************************************************//* Searches for file name in specified list of directories. Sets        *//* Returns dynamically allocated full path or NULL. if nothing          *//* appropriate   Expects name to be dynamically allocated and frees it  *//************************************************************************/char *find_file(char *name, const char *path){ const char *p;  char *q;  char path_buf[PATH_BUF_SIZE];  char dir_sep[2]={DIR_SEP,0};    for (p=path;p;p=q+1) {      q=strchr(p,LIST_SEP);            if (q) {         if (q-p>=PATH_BUF_SIZE) {	  /* Oops, dir name too long, perhabs broken config file */	  continue;	 }  	 strncpy(path_buf,p,q-p);	 path_buf[q-p]=0;      } else {	q--;	if (strlen(p)>=PATH_BUF_SIZE) continue;	strcpy(path_buf,p);      }      /* Empty list element means current directory */      if (!*path_buf) {	path_buf[0]='.';	path_buf[1]=0;#ifdef __MSDOS__      } else {	strcpy(path_buf,add_exe_path(path_buf)); /* safe, becouse	                add_exe_path knows about PATH_BUF_SIZE */#endif      }      strcat(path_buf,dir_sep); /* always one char */      if (strlen(path_buf)+strlen(name)>=PATH_BUF_SIZE)          continue; /* Ignore too deeply nested directories */      strcat(path_buf,name);      if (access(path_buf,0)==0) {         free(name); 	 return strdup(path_buf);      }    }    /* if we are here, nothing found */    free(name);     return NULL;}/************************************************************************//* Searches for charset with given name and put pointer to malloced copy*//* of its name into first arg if found. Otherwise leaves first arg      *//*  unchanged                                                           *//************************************************************************/void check_charset(char **filename,const char *charset) {   char *tmppath;   if (!strncmp(charset,"utf-8",6)) {      *filename=strdup("utf-8");      return;   }      tmppath=find_file(stradd(charset,CHARSET_EXT),charset_path);   if (tmppath&& *tmppath) {     *filename=strdup(charset);     free(tmppath);   }}/**********************************************************************//*  Returns malloced string containing concatenation of two           *//*  arguments                                                         *//**********************************************************************/char *stradd(const char *s1,const char *s2) { char *res;  res=malloc(strlen(s1)+strlen(s2)+1);  if (!res) {     fprintf (stderr,"Out of memory!");     exit(1);  }  strcpy(res,s1);  strcat(res,s2);  return res;}    /* * In DOS, argv[0] contain full path to the program, and it is a custom * to keep configuration files in same directory as program itself */#ifdef __MSDOS__char *exe_dir(void) {  static char pathbuf[PATH_BUF_SIZE];  char *q;  strcpy(pathbuf,_argv[0]); /* DOS ensures, that our exe path is no                               longer than PATH_BUF_SIZE*/  q=strrchr(pathbuf,DIR_SEP);  if (q) {    *q=0;  } else {    pathbuf[0]=0;  }  return pathbuf;}char *add_exe_path(const char *name) {static char path[PATH_BUF_SIZE];       char *mypath=exe_dir();  /* No snprintf in Turbo C 2.0 library, so just check by hand     and exit if something goes wrong */  if (strchr(name,'%')) {    /* there is substitution */    if (strlen(name)-1+strlen(mypath)>=PATH_BUF_SIZE) {       fprintf(stderr,"Invalid config file. file name \"%s\" too long "                      "after substitution\n",name);       exit(1);    }       sprintf(path,name,exe_dir());    return path;  } else {    return name;  }  }#endif void list_charsets(void) { const char *p;  char *q;  char path_buf[PATH_BUF_SIZE];  char dir_sep[2]={DIR_SEP,0};#ifdef __MSDOS__  struct ffblk ffblock;#else    glob_t glob_buf;  int count,glob_flags=GLOB_ERR;#endif  char **ptr;    for (p=charset_path;p;p=q+1) {      q=strchr(p,LIST_SEP);            if (q) {         if (q-p>=PATH_BUF_SIZE) {	  /* Oops, dir name too long, perhabs broken config file */	  continue;	 }  	 strncpy(path_buf,p,q-p);	 path_buf[q-p]=0;      } else {	q--;	if (strlen(p)>=PATH_BUF_SIZE) continue;	strcpy(path_buf,p);      }      /* Empty list element means current directory */      if (!*path_buf) {	path_buf[0]='.';	path_buf[1]=0;#ifdef __MSDOS__      } else {	strcpy(path_buf,add_exe_path(path_buf)); /* safe, becouse	                add_exe_path knows about PATH_BUF_SIZE */#endif      }      strcat(path_buf,dir_sep); /* always one char */      if (strlen(path_buf)+6>=PATH_BUF_SIZE)          continue; /* Ignore too deeply nested directories */      strcat(path_buf,"*.txt");#ifdef __MSDOS__      findfirst(path_buf,&ffblock,FA_RDONLY | FA_HIDDEN | FA_ARCH);      while (!errno) {         char name[12],*src,*dest;	 dest=name;	 src=ffblock.ff_name;	 for (dest=name,src=ffblock.ff_name;*src && *src !='.';dest++,src++)	     *dest=tolower(*src);	 printf("%10s",name);	 findnext(&ffblock);      } 	  #else              switch (glob(path_buf,glob_flags,NULL,&glob_buf)) {	  case 0:#ifdef GLOB_NOMATCH	      	  case GLOB_NOMATCH: #endif	      	      break;          default:	      perror("catdoc");	      exit(1);      }      glob_flags|=GLOB_APPEND;#endif         }#ifdef __MSDOS__    fputc('\n',stdout)#else 	   count=0;printf("Available charsets:");    for (ptr=glob_buf.gl_pathv;*ptr;ptr++) {       printf("%c",(count++)%5?'\t':'\n');       p=strrchr(*ptr,dir_sep[0]);       if (!p) continue;       p++;       if ((q=strchr(p,'.'))) *q=0;       fputs(p,stdout);   }     printf("%c",(count++)%5?'\t':'\n');   fputs("utf-8",stdout);   printf("\n");   globfree(&glob_buf);#endif   }    

⌨️ 快捷键说明

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