diff --git a/Makefile b/Makefile index 8bf63e2..7826b44 100644 --- a/Makefile +++ b/Makefile @@ -39,11 +39,11 @@ DEFAULTFONTDIR = /usr/local/share/figlet # Use this definition if you can't put things in /usr/local/share/figlet DEFAULTFONTDIR = fonts -# The filename of the font to be used if no other is specified -# (standard.flf is recommended, but any other can be used). -# This font file should reside in the directory specified by -# DEFAULTFONTDIR. -DEFAULTFONTFILE = standard.flf +# The filename of the font to be used if no other is specified, +# without suffix.(standard is recommended, but any other can be +# used). This font file should reside in the directory specified +# by DEFAULTFONTDIR. +DEFAULTFONTFILE = standard ## ## END OF CONFIGURATION SECTION diff --git a/figlet.c b/figlet.c index 64f9105..2679152 100644 --- a/figlet.c +++ b/figlet.c @@ -61,6 +61,7 @@ #endif #include <string.h> #include <ctype.h> +#include <sys/stat.h> #include <fcntl.h> /* Needed for get_columns */ #ifdef unix @@ -681,6 +682,48 @@ ZFILE *controlfile; return; } +/**************************************************************************** + + FIGopen + + Given a FIGlet font or control file name and suffix, return the file + or NULL if not found + +****************************************************************************/ + +ZFILE *FIGopen(name,suffix) +char *name; +char *suffix; +{ + char *fontpath; + ZFILE *fontfile; + struct stat st; + int namelen; + + namelen = MYSTRLEN(fontdirname); + fontpath = (char*)alloca(sizeof(char)* + (namelen+MYSTRLEN(name)+MYSTRLEN(suffix)+2)); + fontfile = NULL; + if (!hasdirsep(name)) { /* not a full path name */ + strcpy(fontpath,fontdirname); + fontpath[namelen] = DIRSEP; + fontpath[namelen+1] = '\0'; + strcat(fontpath,name); + strcat(fontpath,suffix); + if(stat(fontpath,&st)==0) goto ok; + } + /* just append suffix */ + strcpy(fontpath,name); + strcat(fontpath,suffix); + if(stat(fontpath,&st)==0) goto ok; + + return NULL; + +ok: + fontfile = Zopen(fontpath,"rb"); + return fontfile; +} + /**************************************************************************** readcontrol @@ -696,36 +739,17 @@ char *controlname; inchr firstch,lastch; char dashcheck; inchr offset; - char *controlpath; int command; ZFILE *controlfile; - int namelen; - namelen = MYSTRLEN(fontdirname); - controlpath = (char*)myalloc(sizeof(char) - *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2)); - controlfile = NULL; - if (!hasdirsep(controlname)) { - strcpy(controlpath,fontdirname); - controlpath[namelen] = DIRSEP; - controlpath[namelen+1] = '\0'; - strcat(controlpath,controlname); - strcat(controlpath,CONTROLFILESUFFIX); - controlfile = Zopen(controlpath,"rb"); - } + controlfile = FIGopen(controlname,CONTROLFILESUFFIX); + if (controlfile==NULL) { - strcpy(controlpath,controlname); - strcat(controlpath,CONTROLFILESUFFIX); - controlfile = Zopen(controlpath,"rb"); - if (controlfile==NULL) { - fprintf(stderr,"%s: %s: Unable to open control file\n",myname, - controlpath); - exit(1); - } + fprintf(stderr,"%s: %s: Unable to open control file\n",myname, + controlname); + exit(1); } - free(controlpath); - (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); (*commandlistend)->thecommand = 0; /* Begin with a freeze command */ commandlistend = &(*commandlistend)->next; @@ -888,7 +912,7 @@ void getparams() extern char *optarg; extern int optind; int c; /* "Should" be a char -- need int for "!= -1" test*/ - int columns,firstfont,infoprint; + int columns,infoprint; char *controlname; if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) { @@ -898,18 +922,7 @@ void getparams() myname = Myargv[0]; } fontdirname = DEFAULTFONTDIR; - firstfont = 1; - fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1)); - strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */ - if (suffixcmp(fontname,FONTFILESUFFIX)) { - fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0'; - } -#ifdef TLF_FONTS - else if (suffixcmp(fontname,TOILETFILESUFFIX)) { - fontname[MYSTRLEN(fontname)-TSUFFIXLEN]='\0'; - } -#endif - + fontname = DEFAULTFONTFILE; cfilelist = NULL; cfilelistend = &cfilelist; commandlist = NULL; @@ -1021,10 +1034,6 @@ void getparams() fontdirname = optarg; break; case 'f': - if (firstfont) { - free(fontname); - firstfont = 0; - } fontname = optarg; if (suffixcmp(fontname,FONTFILESUFFIX)) { fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0'; @@ -1169,44 +1178,12 @@ void readfont() int smush,smush2; char *fontpath,fileline[MAXLEN+1],magicnum[5]; ZFILE *fontfile; - int namelen; - - namelen = MYSTRLEN(fontdirname); - fontpath = (char*)myalloc(sizeof(char) - *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2)); - fontfile = NULL; - if (!hasdirsep(fontname)) { - strcpy(fontpath,fontdirname); - fontpath[namelen] = DIRSEP; - fontpath[namelen+1] = '\0'; - strcat(fontpath,fontname); - strcat(fontpath,FONTFILESUFFIX); - fontfile = Zopen(fontpath,"rb"); - } - if (fontfile==NULL) { - strcpy(fontpath,fontname); - strcat(fontpath,FONTFILESUFFIX); - fontfile = Zopen(fontpath,"rb"); - } + fontfile = FIGopen(fontname,FONTFILESUFFIX); #ifdef TLF_FONTS if (fontfile==NULL) { - if (!hasdirsep(fontname)) { - strcpy(fontpath,fontdirname); - fontpath[namelen] = DIRSEP; - fontpath[namelen+1] = '\0'; - strcat(fontpath,fontname); - strcat(fontpath,TOILETFILESUFFIX); - fontfile = Zopen(fontpath,"rb"); - } - if (fontfile==NULL) { - strcpy(fontpath,fontname); - strcat(fontpath,TOILETFILESUFFIX); - fontfile = Zopen(fontpath,"rb"); - } - if (fontfile!=NULL) { - toiletfont = 1; - } + fontfile = FIGopen(fontname,TOILETFILESUFFIX); + if(fontfile) toiletfont = 1; } #endif @@ -1242,7 +1219,6 @@ void readfont() for (i=1;i<=cmtlines;i++) { skiptoeol(fontfile); } - free(fontpath); if (numsread<6) { ffright2left = 0;