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

📄 common.c

📁 SDL_mixer 是一个基于 SDL 的混音器
💻 C
字号:
/*    TiMidity -- Experimental MIDI to WAVE converter    Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program 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 General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   common.c   */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include "config.h"#include "common.h"#include "output.h"#include "ctrlmode.h"/* I guess "rb" should be right for any libc */#define OPEN_MODE "rb"char current_filename[1024];static PathList *pathlist=NULL;/* Try to open a file for reading. If the filename ends in one of the    defined compressor extensions, pipe the file through the decompressor */static FILE *try_to_open(char *name, int decompress, int noise_mode){  FILE *fp;  fp=fopen(name, OPEN_MODE); /* First just check that the file exists */  if (!fp)    return 0;#ifdef DECOMPRESSOR_LIST  if (decompress)    {      int l,el;      static char *decompressor_list[] = DECOMPRESSOR_LIST, **dec;      char tmp[1024], tmp2[1024], *cp, *cp2;      /* Check if it's a compressed file */       l=strlen(name);      for (dec=decompressor_list; *dec; dec+=2)	{	  el=strlen(*dec);	  if ((el>=l) || (strcmp(name+l-el, *dec)))	    continue;	  /* Yes. Close the file, open a pipe instead. */	  fclose(fp);	  /* Quote some special characters in the file name */	  cp=name;	  cp2=tmp2;	  while (*cp)	    {	      switch(*cp)		{		case '\'':		case '\\':		case ' ':		case '`':		case '!':		case '"':		case '&':		case ';':		  *cp2++='\\';		}	      *cp2++=*cp++;	    }	  *cp2=0;	  sprintf(tmp, *(dec+1), tmp2);	  fp=popen(tmp, "r");	  break;	}    }#endif    return fp;}/* This is meant to find and open files for reading, possibly piping   them through a decompressor. */FILE *open_file(char *name, int decompress, int noise_mode){  FILE *fp;  PathList *plp;  int l;  static int firsttime=1;  if (!name || !(*name))    {      ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Attempted to open nameless file.");      return 0;    }#ifdef DEFAULT_PATH  if (firsttime && (pathlist==NULL)) {    /* Generate path list */    add_to_pathlist(DEFAULT_PATH);    firsttime=0;  }#endif  /* First try the given name */  strncpy(current_filename, name, 1023);  current_filename[1023]='\0';  ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Trying to open %s", current_filename);  if ((fp=try_to_open(current_filename, decompress, noise_mode)))    return fp;#ifdef ENOENT  if (noise_mode && (errno != ENOENT))    {      ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: %s", 	   current_filename, strerror(errno));      return 0;    }#endif  plp=pathlist;  if (name[0] != PATH_SEP)    while (plp)  /* Try along the path then */      {	*current_filename=0;	l=strlen(plp->path);	if(l)	  {	    strcpy(current_filename, plp->path);	    if(current_filename[l-1]!=PATH_SEP)	      strcat(current_filename, PATH_STRING);	  }	strcat(current_filename, name);	ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Trying to open %s", current_filename);	if ((fp=try_to_open(current_filename, decompress, noise_mode)))	  return fp;#ifdef ENOENT	if (noise_mode && (errno != ENOENT))	  {	    ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: %s", 		 current_filename, strerror(errno));	    return 0;	  }#endif	plp=plp->next;      }    /* Nothing could be opened. */  *current_filename=0;    if (noise_mode>=2)    ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: %s", name, strerror(errno));    return 0;}/* This closes files opened with open_file */void close_file(FILE *fp){#ifdef DECOMPRESSOR_LIST  if (pclose(fp)) /* Any better ideas? */#endif    fclose(fp);}/* This is meant for skipping a few bytes in a file or fifo. */void skip(FILE *fp, size_t len){  size_t c;  char tmp[1024];  while (len>0)    {      c=len;      if (c>1024) c=1024;      len-=c;      if (c!=fread(tmp, 1, c, fp))	ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: skip: %s",	     current_filename, strerror(errno));    }}/* This'll allocate memory or die. */void *safe_malloc(size_t count){  void *p;  if (count > (1<<21))    {      ctl->cmsg(CMSG_FATAL, VERB_NORMAL, 	   "Strange, I feel like allocating %d bytes. This must be a bug.",	   count);    }  else if ((p=malloc(count)))    return p;  else    ctl->cmsg(CMSG_FATAL, VERB_NORMAL, "Sorry. Couldn't malloc %d bytes.", count);  ctl->close();  exit(10);  return(NULL);}/* This adds a directory to the path list */void add_to_pathlist(char *s){  PathList *plp=safe_malloc(sizeof(PathList));  strcpy((plp->path=safe_malloc(strlen(s)+1)),s);  plp->next=pathlist;  pathlist=plp;}/* Free memory associated to path list */void free_pathlist(void){  PathList *plp, *next_plp;  plp = pathlist;  while (plp) {    if (plp->path) {      free(plp->path);      plp->path=NULL;    }    next_plp = plp->next;    free(plp);    plp = next_plp;  }}

⌨️ 快捷键说明

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