From fd8bdecb536349d3ab94c25bab43eaba12513ee9 Mon Sep 17 00:00:00 2001 From: anon <anon@anon.anon> Date: Mon, 13 Mar 2023 10:35:02 +0100 Subject: [PATCH] working demo --- FIGlib-test | Bin 0 -> 87952 bytes FIGlib.h | 3637 ++++++++++++++++++++++++------------------------ Makefile | 8 +- figlet.c | 10 +- libfiglib.so | Bin 0 -> 65176 bytes tests/FIGlib.c | 8 +- 6 files changed, 1846 insertions(+), 1817 deletions(-) create mode 100755 FIGlib-test create mode 100755 libfiglib.so diff --git a/FIGlib-test b/FIGlib-test new file mode 100755 index 0000000000000000000000000000000000000000..2aa363b04f771f9e345316a10122d8e5af2130f3 GIT binary patch literal 87952 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	g_$W!LK=p2>}j+K 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 Jfshe({y!Xa)mZ=l literal 0 HcmV?d00001 diff --git a/FIGlib.h b/FIGlib.h index 7aa3f54..098d132 100644 --- a/FIGlib.h +++ b/FIGlib.h @@ -54,7 +54,7 @@ #define DEFAULTFONTDIR "fonts" #endif #ifndef DEFAULTFONTFILE -#define DEFAULTFONTFILE "standard.flf" +#define DEFAULTFONTFILE "standard" #endif #include <stdio.h> @@ -167,1875 +167,1884 @@ outchr **currchar; int currcharwidth; int previouscharwidth; outchr **outputline; /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */ -int outlinelen; + int outlinelen; -/**************************************************************************** + /**************************************************************************** - Globals dealing with command file storage + Globals dealing with command file storage -****************************************************************************/ + ****************************************************************************/ -typedef struct cfn { - char *thename; - struct cfn *next; - } cfnamenode; + typedef struct cfn { + char *thename; + struct cfn *next; + } cfnamenode; -cfnamenode *cfilelist,**cfilelistend; + cfnamenode *cfilelist,**cfilelistend; -typedef struct cm { - int thecommand; - inchr rangelo; - inchr rangehi; - inchr offset; - struct cm *next; - } comnode; + typedef struct cm { + int thecommand; + inchr rangelo; + inchr rangehi; + inchr offset; + struct cm *next; + } comnode; -comnode *commandlist,**commandlistend; + comnode *commandlist,**commandlistend; -/**************************************************************************** + /**************************************************************************** - Globals affected by command line options + Globals affected by command line options -****************************************************************************/ + ****************************************************************************/ -int deutschflag,justification,paragraphflag,right2left,multibyte; -int cmdinput; + int deutschflag,justification,paragraphflag,right2left,multibyte; + int cmdinput; -#define SM_SMUSH 128 -#define SM_KERN 64 -#define SM_EQUAL 1 -#define SM_LOWLINE 2 -#define SM_HIERARCHY 4 -#define SM_PAIR 8 -#define SM_BIGX 16 -#define SM_HARDBLANK 32 + #define SM_SMUSH 128 + #define SM_KERN 64 + #define SM_EQUAL 1 + #define SM_LOWLINE 2 + #define SM_HIERARCHY 4 + #define SM_PAIR 8 + #define SM_BIGX 16 + #define SM_HARDBLANK 32 -int smushmode; + int smushmode; -#define SMO_NO 0 /* no command-line smushmode */ -#define SMO_YES 1 /* use command-line smushmode, ignore font smushmode */ -#define SMO_FORCE 2 /* logically OR command-line and font smushmodes */ + #define SMO_NO 0 /* no command-line smushmode */ + #define SMO_YES 1 /* use command-line smushmode, ignore font smushmode */ + #define SMO_FORCE 2 /* logically OR command-line and font smushmodes */ -int smushoverride; + int smushoverride; -int outputwidth; -int outlinelenlimit; -char *fontdirname,*fontname; + int outputwidth; + int outlinelenlimit; + char *fontdirname,*fontname; -/**************************************************************************** + /**************************************************************************** - Globals read from font file + Globals read from font file -****************************************************************************/ + ****************************************************************************/ -char hardblank; -int charheight; + char hardblank; + int charheight; -/**************************************************************************** + /**************************************************************************** - Name of program, used in error messages + Name of program, used in error messages -****************************************************************************/ + ****************************************************************************/ -char *myname; + char *myname; -/*--------------------------------------------------------------------------- - Wordbreakmode: - -1: /^$/ and blanks are to be absorbed (when line break was forced - by a blank or character larger than outlinelenlimit) - 0: /^ *$/ and blanks are not to be absorbed - 1: /[^ ]$/ no word break yet - 2: /[^ ] *$/ - 3: /[^ ]$/ had a word break ----------------------------------------------------------------------------*/ + /*--------------------------------------------------------------------------- + Wordbreakmode: + -1: /^$/ and blanks are to be absorbed (when line break was forced + by a blank or character larger than outlinelenlimit) + 0: /^ *$/ and blanks are not to be absorbed + 1: /[^ ]$/ no word break yet + 2: /[^ ] *$/ + 3: /[^ ]$/ had a word break + ---------------------------------------------------------------------------*/ -#ifdef TIOCGWINSZ -/**************************************************************************** + #ifdef TIOCGWINSZ + /**************************************************************************** - get_columns + get_columns - Determines the number of columns of /dev/tty. Returns the number of - columns, or -1 if error. May return 0 if columns unknown. - Requires include files <fcntl.h> and <sys/ioctl.h>. - by Glenn Chappell & Ian Chai 14 Apr 1993 + Determines the number of columns of /dev/tty. Returns the number of + columns, or -1 if error. May return 0 if columns unknown. + Requires include files <fcntl.h> and <sys/ioctl.h>. + by Glenn Chappell & Ian Chai 14 Apr 1993 -****************************************************************************/ + ****************************************************************************/ -int get_columns() -{ - struct winsize ws; - int fd,result; + int get_columns() + { + struct winsize ws; + int fd,result; - if ((fd = open("/dev/tty",O_WRONLY))<0) return -1; - result = ioctl(fd,TIOCGWINSZ,&ws); - close(fd); - return result?-1:ws.ws_col; -} -#endif /* ifdef TIOCGWINSZ */ - - -/**************************************************************************** - - myalloc - - Calls malloc. If malloc returns error, prints error message and - quits. - -****************************************************************************/ - -#ifdef __STDC__ -char *myalloc(size_t size) -#else -char *myalloc(size) -int size; -#endif -{ - char *ptr; -#ifndef __STDC__ - extern void *malloc(); -#endif - - if ((ptr = (char*)malloc(size))==NULL) { - fprintf(stderr,"%s: Out of memory\n",myname); - exit(1); - } - else { - return ptr; - } -} - - -/**************************************************************************** - - hasdirsep - - Returns true if s1 contains a DIRSEP or DIRSEP2 character. - -****************************************************************************/ - -int hasdirsep(s1) -char *s1; -{ - if (strchr(s1, DIRSEP)) return 1; - else if (strchr(s1, DIRSEP2)) return 1; - else return 0; -} - -/**************************************************************************** - - suffixcmp - - Returns true if s2 is a suffix of s1; uses case-blind comparison. - -****************************************************************************/ - -int suffixcmp(s1, s2) -char *s1; -char *s2; -{ - int len1, len2; - - len1 = MYSTRLEN(s1); - len2 = MYSTRLEN(s2); - if (len2 > len1) return 0; - s1 += len1 - len2; - while (*s1) { - if (tolower(*s1) != tolower(*s2)) return 0; - s1++; - s2++; - } - return 1; -} - -/**************************************************************************** - - skiptoeol - - Skips to the end of a line, given a stream. Handles \r, \n, or \r\n. - -****************************************************************************/ - -void skiptoeol(fp) -ZFILE *fp; -{ - int dummy; - - while (dummy=Zgetc(fp),dummy!=EOF) { - if (dummy == '\n') return; - if (dummy == '\r') { - dummy = Zgetc(fp); - if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp); - return; - } - } -} - - -/**************************************************************************** - - myfgets - - Local version of fgets. Handles \r, \n, and \r\n terminators. - -****************************************************************************/ - -char *myfgets(line,maxlen,fp) -char *line; -int maxlen; -ZFILE *fp; -{ - int c = 0; - char *p; - - p = line; - while((c=Zgetc(fp))!=EOF&&maxlen) { - *p++ = c; - maxlen--; - if (c=='\n') break; - if (c=='\r') { - c = Zgetc(fp); - if (c != EOF && c != '\n') Zungetc(c,fp); - *(p-1) = '\n'; - break; - } - } - *p = 0; - return (c==EOF) ? NULL : line; -} - - -/**************************************************************************** - - usageerr - - Prints "Usage: ...." line to the given stream. - -****************************************************************************/ - -void printusage(out) -FILE *out; -{ - fprintf(out, - "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n", - " [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n" - " [ -C controlfile ] [ -I infocode ] [ message ]\n", - myname); -} - - -/**************************************************************************** - - printinfo - - Prints version and copyright message, or utility information. - -****************************************************************************/ - -void printinfo(infonum) -int infonum; -{ - switch (infonum) { - case 0: /* Copyright message */ - printf("FIGlet Copyright (C) 1991-2012 Glenn Chappell, Ian Chai, " - "John Cowan,\nChristiaan Keet and Claudio Matsuoka\n" - "Internet: <info@figlet.org> " - "Version: %s, date: %s\n\n" - "FIGlet, along with the various FIGlet fonts" - " and documentation, may be\n" - "freely copied and distributed.\n\n" - "If you use FIGlet, please send an" - " e-mail message to <info@figlet.org>.\n\n" - "The latest version of FIGlet is available from the" - " web site,\n\thttp://www.figlet.org/\n\n", - VERSION,DATE); - printusage(stdout); - break; - case 1: /* Version (integer) */ - printf("%d\n",VERSION_INT); - break; - case 2: /* Font directory */ - printf("%s\n",fontdirname); - break; - case 3: /* Font */ - printf("%s\n",fontname); - break; - case 4: /* Outputwidth */ - printf("%d\n",outputwidth); - break; - case 5: /* Font formats */ - printf("%s", FONTFILEMAGICNUMBER); -#ifdef TLF_FONTS - printf(" %s", TOILETFILEMAGICNUMBER); -#endif - printf("\n"); - } -} - - -/**************************************************************************** - - readmagic - - Reads a four-character magic string from a stream. - -****************************************************************************/ -void readmagic(fp,magic) -ZFILE *fp; -char *magic; -{ - int i; - - for (i=0;i<4;i++) { - magic[i] = Zgetc(fp); - } - magic[4] = 0; - } - -/**************************************************************************** - - skipws - - Skips whitespace characters from a stream. - -****************************************************************************/ -void skipws(fp) -ZFILE *fp; -{ - int c; - while (c=Zgetc(fp),isascii(c)&&isspace(c)) ; - Zungetc(c,fp); - } - -/**************************************************************************** - - readnum - - Reads a number from a stream. Accepts "0" prefix for octal and - "0x" or "0X" for hexadecimal. Ignores leading whitespace. - -****************************************************************************/ -void readnum(fp,nump) -ZFILE *fp; -inchr *nump; -{ - int acc = 0; - char *p; - int c; - int base; - int sign = 1; - char digits[] = "0123456789ABCDEF"; - - skipws(fp); - c = Zgetc(fp); - if (c=='-') { - sign = -1; - } - else { - Zungetc(c,fp); - } - c = Zgetc(fp); - if (c=='0') { - c = Zgetc(fp); - if (c=='x'||c=='X') { - base = 16; - } - else { - base = 8; - Zungetc(c,fp); - } - } - else { - base = 10; - Zungetc(c,fp); - } - - while((c=Zgetc(fp))!=EOF) { - c=toupper(c); - p=strchr(digits,c); - if (!p) { - Zungetc(c,fp); - *nump = acc * sign; - return; - } - acc = acc*base+(p-digits); - } - *nump = acc * sign; - } - -/**************************************************************************** - - readTchar - - Reads a control file "T" command character specification. - - Character is a single byte, an escape sequence, or - an escaped numeric. - -****************************************************************************/ - -inchr readTchar(fp) -ZFILE *fp; -{ - inchr thechar; - char next; - - thechar=Zgetc(fp); - if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */ - Zungetc(thechar,fp); - return '\0'; - } - if (thechar!='\\') return thechar; - next=Zgetc(fp); - switch(next) { - case 'a': - return 7; - case 'b': - return 8; - case 'e': - return 27; - case 'f': - return 12; - case 'n': - return 10; - case 'r': - return 13; - case 't': - return 9; - case 'v': - return 11; - default: - if (next=='-' || next=='x' || (next>='0' && next<='9')) { - Zungetc(next,fp); - readnum(fp,&thechar); - return thechar; - } - return next; - } -} - -/**************************************************************************** - - charsetname - - Get a Tchar representing a charset name, or 0 if none available. - Called in getcharset(). - -****************************************************************************/ - -inchr charsetname(fp) -ZFILE *fp; -{ - inchr result; - - result = readTchar(fp); - if (result == '\n' || result == '\r') { - result = 0; - Zungetc(result,fp); - } - return result; - } - -/**************************************************************************** - - charset - - Processes "g[0123]" character set specifier - Called in readcontrol(). - -****************************************************************************/ - -void charset(n, controlfile) -int n; -ZFILE *controlfile; -{ - int ch; - - skipws(controlfile); - if (Zgetc(controlfile) != '9') { - skiptoeol(controlfile); - return; - } - ch = Zgetc(controlfile); - if (ch == '6') { - gn[n] = 65536L * charsetname(controlfile) + 0x80; - gndbl[n] = 0; - skiptoeol(controlfile); - return; - } - if (ch != '4') { - skiptoeol(controlfile); - return; - } - ch = Zgetc(controlfile); - if (ch == 'x') { - if (Zgetc(controlfile) != '9') { - skiptoeol(controlfile); - return; - } - if (Zgetc(controlfile) != '4') { - skiptoeol(controlfile); - return; - } - skipws(controlfile); - gn[n] = 65536L * charsetname(controlfile); - gndbl[n] = 1; - skiptoeol(controlfile); - return; - } - Zungetc(ch, controlfile); - skipws(controlfile); - gn[n] = 65536L * charsetname(controlfile); - gndbl[n] = 0; - 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 - - Allocates memory and reads in the given control file. - Called in readcontrolfiles(). - -****************************************************************************/ - -void readcontrol(controlname) -char *controlname; -{ - inchr firstch,lastch; - char dashcheck; - inchr offset; - int command; - ZFILE *controlfile; - - controlfile = FIGopen(controlname,CONTROLFILESUFFIX); - - if (controlfile==NULL) { - fprintf(stderr,"%s: %s: Unable to open control file\n",myname, - controlname); - exit(1); - } - - (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); - (*commandlistend)->thecommand = 0; /* Begin with a freeze command */ - commandlistend = &(*commandlistend)->next; - (*commandlistend) = NULL; - - while(command=Zgetc(controlfile),command!=EOF) { - switch (command) { - case 't': /* Translate */ - skipws(controlfile); - firstch=readTchar(controlfile); - if ((dashcheck=Zgetc(controlfile))=='-') { - lastch=readTchar(controlfile); - } - else { - Zungetc(dashcheck,controlfile); - lastch=firstch; - } - skipws(controlfile); - offset=readTchar(controlfile)-firstch; - skiptoeol(controlfile); - (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); - (*commandlistend)->thecommand = 1; - (*commandlistend)->rangelo = firstch; - (*commandlistend)->rangehi = lastch; - (*commandlistend)->offset = offset; - commandlistend = &(*commandlistend)->next; - (*commandlistend) = NULL; - break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case '-': - /* Mapping table entry */ - Zungetc(command,controlfile); - readnum(controlfile,&firstch); - skipws(controlfile); - readnum(controlfile,&lastch); - offset=lastch-firstch; - lastch=firstch; - skiptoeol(controlfile); - (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); - (*commandlistend)->thecommand = 1; - (*commandlistend)->rangelo = firstch; - (*commandlistend)->rangehi = lastch; - (*commandlistend)->offset = offset; - commandlistend = &(*commandlistend)->next; - (*commandlistend) = NULL; - break; - case 'f': /* freeze */ - skiptoeol(controlfile); - (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); - (*commandlistend)->thecommand = 0; - commandlistend = &(*commandlistend)->next; - (*commandlistend) = NULL; - break; - case 'b': /* DBCS input mode */ - multibyte = 1; - break; - case 'u': /* UTF-8 input mode */ - multibyte = 2; - break; - case 'h': /* HZ input mode */ - multibyte = 3; - break; - case 'j': /* Shift-JIS input mode */ - multibyte = 4; - break; - case 'g': /* ISO 2022 character set choices */ - multibyte = 0; - skipws(controlfile); - command=Zgetc(controlfile); - switch (command) { - case '0': /* define G0 charset */ - charset(0, controlfile); - break; - case '1': /* set G1 charset */ - charset(1, controlfile); - break; - case '2': /* set G2 charset */ - charset(2, controlfile); - break; - case '3': /* set G3 charset */ - charset(3, controlfile); - break; - case 'l': case 'L': /* define left half */ - skipws(controlfile); - gl = Zgetc(controlfile) - '0'; - skiptoeol(controlfile); - break; - case 'r': case 'R': /* define right half */ - skipws(controlfile); - gr = Zgetc(controlfile) - '0'; - skiptoeol(controlfile); - break; - default: /* meaningless "g" command */ - skiptoeol(controlfile); - } - case '\r': case '\n': /* blank line */ - break; - default: /* Includes '#' */ - skiptoeol(controlfile); - } - } - Zclose(controlfile); -} - - -/**************************************************************************** - - readcontrolfiles - - Reads in the controlfiles names in cfilelist. Uses readcontrol. - Called in main(). - -****************************************************************************/ - -void readcontrolfiles() -{ - cfnamenode *cfnptr; - - for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) { - readcontrol(cfnptr->thename); - } -} - - -/**************************************************************************** - - clearcfilelist - - Clears the control file list. Assumes thename does not need freeing. - -****************************************************************************/ - -void clearcfilelist() -{ - cfnamenode *cfnptr1,*cfnptr2; - - cfnptr1 = cfilelist; - while (cfnptr1 != NULL) { - cfnptr2 = cfnptr1->next; - free(cfnptr1); - cfnptr1 = cfnptr2; - } - cfilelist = NULL; - cfilelistend = &cfilelist; -} - - -/**************************************************************************** - - getparams - - Handles all command-line parameters. Puts all parameters within - bounds. - -****************************************************************************/ - -void getparams() -{ - extern char *optarg; - extern int optind; - int c; /* "Should" be a char -- need int for "!= -1" test*/ - int columns,infoprint; - char *controlname,*env; - - if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) { - myname++; - } - else { - myname = Myargv[0]; - } - fontdirname = DEFAULTFONTDIR; - env = getenv("FIGLET_FONTDIR"); - if (env!=NULL) { - fontdirname = env; - } - fontname = DEFAULTFONTFILE; - cfilelist = NULL; - cfilelistend = &cfilelist; - commandlist = NULL; - commandlistend = &commandlist; - smushoverride = SMO_NO; - deutschflag = 0; - justification = -1; - right2left = -1; - paragraphflag = 0; - infoprint = -1; - cmdinput = 0; - outputwidth = DEFAULTCOLUMNS; - gn[1] = 0x80; - gr = 1; - while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) { - /* Note: -F is not a legal option -- prints a special err message. */ - switch (c) { - case 'A': - cmdinput = 1; - break; - case 'D': - deutschflag = 1; - break; - case 'E': - deutschflag = 0; - break; - case 'X': - right2left = -1; - break; - case 'L': - right2left = 0; - break; - case 'R': - right2left = 1; - break; - case 'x': - justification = -1; - break; - case 'l': - justification = 0; - break; - case 'c': - justification = 1; - break; - case 'r': - justification = 2; - break; - case 'p': - paragraphflag = 1; - break; - case 'n': - paragraphflag = 0; - break; - case 's': - smushoverride = SMO_NO; - break; - case 'k': - smushmode = SM_KERN; - smushoverride = SMO_YES; - break; - case 'S': - smushmode = SM_SMUSH; - smushoverride = SMO_FORCE; - break; - case 'o': - smushmode = SM_SMUSH; - smushoverride = SMO_YES; - break; - case 'W': - smushmode = 0; - smushoverride = SMO_YES; - break; - case 't': -#ifdef TIOCGWINSZ - columns = get_columns(); - if (columns>0) { - outputwidth = columns; - } -#else /* ifdef TIOCGWINSZ */ - fprintf(stderr, - "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n", - myname); -#endif /* ifdef TIOCGWINSZ */ - break; - case 'v': - infoprint = 0; - break; - case 'I': - infoprint = atoi(optarg); - break; - case 'm': - smushmode = atoi(optarg); - if (smushmode < -1) { - smushoverride = SMO_NO; - break; - } - if (smushmode == 0) smushmode = SM_KERN; - else if (smushmode == -1) smushmode = 0; - else smushmode = (smushmode & 63) | SM_SMUSH; - smushoverride = SMO_YES; - break; - case 'w': - columns = atoi(optarg); - if (columns>0) { - outputwidth = columns; - } - break; - case 'd': - fontdirname = optarg; - break; - case 'f': - fontname = optarg; - if (suffixcmp(fontname,FONTFILESUFFIX)) { - fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0'; - } -#ifdef TLF_FONTS - else if (suffixcmp(fontname,TOILETFILESUFFIX)) { - fontname[MYSTRLEN(fontname)-TSUFFIXLEN] = '\0'; - } -#endif - break; - case 'C': - controlname = optarg; - if (suffixcmp(controlname, CONTROLFILESUFFIX)) { - controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0'; - } - (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode)); - (*cfilelistend)->thename = controlname; - cfilelistend = &(*cfilelistend)->next; - (*cfilelistend) = NULL; - break; - case 'N': - clearcfilelist(); - multibyte = 0; - gn[0] = 0; - gn[1] = 0x80; - gn[2] = gn[3] = 0; - gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0; - gl = 0; - gr = 1; - break; - case 'F': /* Not a legal option */ - fprintf(stderr,"%s: illegal option -- F\n",myname); - printusage(stderr); - fprintf(stderr, - "\nBecause of numerous incompatibilities, the" - " \"-F\" option has been\n" - "removed. It has been replaced by the \"figlist\"" - " program, which is now\n" - "included in the basic FIGlet package. \"figlist\"" - " is also available\n" - "from http://www.figlet.org/" - "under UNIX utilities.\n"); - exit(1); - break; - default: - printusage(stderr); - exit(1); - } - } - if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */ - outlinelenlimit = outputwidth-1; - if (infoprint>=0) { - printinfo(infoprint); - exit(0); - } -} - - -/**************************************************************************** - - clearline - - Clears both the input (inchrline) and output (outputline) storage. - -****************************************************************************/ - -void clearline() -{ - int i; - - for (i=0;i<charheight;i++) { - outputline[i][0] = '\0'; - } - outlinelen = 0; - inchrlinelen = 0; -} - - -/**************************************************************************** - - readfontchar - - Reads a font character from the font file, and places it in a - newly-allocated entry in the list. - -****************************************************************************/ - -void readfontchar(file,theord) -ZFILE *file; -inchr theord; -{ - int row,k; - char templine[MAXLEN+1]; - outchr endchar, outline[MAXLEN+1]; - fcharnode *fclsave; - - fclsave = fcharlist; - fcharlist = (fcharnode*)myalloc(sizeof(fcharnode)); - fcharlist->ord = theord; - fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight); - fcharlist->next = fclsave; - - outline[0] = 0; - - for (row=0;row<charheight;row++) { - if (myfgets(templine,MAXLEN,file)==NULL) { - templine[0] = '\0'; - } -#ifdef TLF_FONTS - utf8_to_wchar(templine,MAXLEN,outline,MAXLEN,0); -#else - strcpy(outline,templine); -#endif - k = STRLEN(outline)-1; - while (k>=0 && ISSPACE(outline[k])) { /* remove trailing spaces */ - k--; - } - if (k>=0) { - endchar = outline[k]; /* remove endmarks */ - while (k>=0 && outline[k]==endchar) { - k--; - } - } - outline[k+1] = '\0'; - fcharlist->thechar[row] = (outchr*)myalloc(sizeof(outchr)*(STRLEN(outline)+1)); - STRCPY(fcharlist->thechar[row],outline); - } -} - - -/**************************************************************************** - - readfont - - Allocates memory, initializes variables, and reads in the font. - Called near beginning of main(). - -****************************************************************************/ - -void readfont() -{ - int i,row,numsread; - inchr theord; - int maxlen,cmtlines,ffright2left; - int smush,smush2; - char fileline[MAXLEN+1],magicnum[5]; - ZFILE *fontfile; - - fontfile = FIGopen(fontname,FONTFILESUFFIX); -#ifdef TLF_FONTS - if (fontfile==NULL) { - fontfile = FIGopen(fontname,TOILETFILESUFFIX); - if(fontfile) toiletfont = 1; - } -#endif - - if (fontfile==NULL) { - fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontname); - exit(1); - } - - readmagic(fontfile,magicnum); - if (myfgets(fileline,MAXLEN,fontfile)==NULL) { - fileline[0] = '\0'; - } - if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) { - skiptoeol(fontfile); - } - numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d", - &hardblank,&charheight,&maxlen,&smush,&cmtlines, - &ffright2left,&smush2); - - if (maxlen > MAXLEN) { - fprintf(stderr,"%s: %s: character is too wide\n",myname,fontname); - exit(1); - } -#ifdef TLF_FONTS - if ((!toiletfont && strcmp(magicnum,FONTFILEMAGICNUMBER)) || - (toiletfont && strcmp(magicnum,TOILETFILEMAGICNUMBER)) || numsread<5) { -#else - if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) { -#endif - fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontname); - exit(1); - } - for (i=1;i<=cmtlines;i++) { - skiptoeol(fontfile); - } - - if (numsread<6) { - ffright2left = 0; - } - - if (numsread<7) { /* if no smush2, decode smush into smush2 */ - if (smush == 0) smush2 = SM_KERN; - else if (smush < 0) smush2 = 0; - else smush2 = (smush & 31) | SM_SMUSH; - } - - if (charheight<1) { - charheight = 1; - } - - if (maxlen<1) { - maxlen = 1; - } - - maxlen += 100; /* Give ourselves some extra room */ - - if (smushoverride == SMO_NO) - smushmode = smush2; - else if (smushoverride == SMO_FORCE) - smushmode |= smush2; - - if (right2left<0) { - right2left = ffright2left; - } - - if (justification<0) { - justification = 2*right2left; - } - - /* Allocate "missing" character */ - fcharlist = (fcharnode*)myalloc(sizeof(fcharnode)); - fcharlist->ord = 0; - fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight); - fcharlist->next = NULL; - for (row=0;row<charheight;row++) { - fcharlist->thechar[row] = (outchr*)myalloc(sizeof(outchr)); - fcharlist->thechar[row][0] = '\0'; - } - for (theord=' ';theord<='~';theord++) { - readfontchar(fontfile,theord); - } - for (theord=0;theord<=6;theord++) { - readfontchar(fontfile,deutsch[theord]); - } - while (myfgets(fileline,maxlen+1,fontfile)==NULL?0: - sscanf(fileline,"%li",&theord)==1) { - readfontchar(fontfile,theord); - } - Zclose(fontfile); -} - - -/**************************************************************************** - - linealloc - - Allocates & clears outputline, inchrline. Sets inchrlinelenlimit. - Called near beginning of main(). - -****************************************************************************/ - -void linealloc() -{ - int row; - - outputline = (outchr**)myalloc(sizeof(outchr*)*charheight); - for (row=0;row<charheight;row++) { - outputline[row] = (outchr*)myalloc(sizeof(outchr)*(outlinelenlimit+1)); - } - inchrlinelenlimit = outputwidth*4+100; - inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1)); - clearline(); -} - - -/**************************************************************************** - - getletter - - Sets currchar to point to the font entry for the given character. - Sets currcharwidth to the width of this character. - -****************************************************************************/ - -void getletter(c) -inchr c; -{ - fcharnode *charptr; - - for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c; - charptr=charptr->next) ; - if (charptr!=NULL) { - currchar = charptr->thechar; - } - else { - for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0; - charptr=charptr->next) ; - currchar = charptr->thechar; - } - previouscharwidth = currcharwidth; - currcharwidth = STRLEN(currchar[0]); -} - - -/**************************************************************************** - - smushem - - Given 2 characters, attempts to smush them into 1, according to - smushmode. Returns smushed character or '\0' if no smushing can be - done. - - smushmode values are sum of following (all values smush blanks): - 1: Smush equal chars (not hardblanks) - 2: Smush '_' with any char in hierarchy below - 4: hierarchy: "|", "/\", "[]", "{}", "()", "<>" - Each class in hier. can be replaced by later class. - 8: [ + ] -> |, { + } -> |, ( + ) -> | - 16: / + \ -> X, > + < -> X (only in that order) - 32: hardblank + hardblank -> hardblank - -****************************************************************************/ - -outchr smushem(lch,rch) -outchr lch,rch; -{ - if (lch==' ') return rch; - if (rch==' ') return lch; - - if (previouscharwidth<2 || currcharwidth<2) return '\0'; - /* Disallows overlapping if the previous character */ - /* or the current character has a width of 1 or zero. */ - - if ((smushmode & SM_SMUSH) == 0) return '\0'; /* kerning */ - - if ((smushmode & 63) == 0) { - /* This is smushing by universal overlapping. */ - /* Unreachable code: lch==' ' or rch==' ' already handled! - if (lch==' ') return rch; - if (rch==' ') return lch; - */ - - if (lch==hardblank) return rch; - if (rch==hardblank) return lch; - /* Above four lines ensure overlapping preference to */ - /* visible characters. */ - if (right2left==1) return lch; - /* Above line ensures that the dominant (foreground) */ - /* fig-character for overlapping is the latter in the */ - /* user's text, not necessarily the rightmost character. */ - return rch; - /* Occurs in the absence of above exceptions. */ - } - - if (smushmode & SM_HARDBLANK) { - if (lch==hardblank && rch==hardblank) return lch; - } - - if (lch==hardblank || rch==hardblank) return '\0'; - - if (smushmode & SM_EQUAL) { - if (lch==rch) return lch; - } - - if (smushmode & SM_LOWLINE) { - if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch; - if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch; - } - - if (smushmode & SM_HIERARCHY) { - if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch; - if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch; - if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch; - if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch; - if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch; - if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch; - if (strchr("{}",lch) && strchr("()<>",rch)) return rch; - if (strchr("{}",rch) && strchr("()<>",lch)) return lch; - if (strchr("()",lch) && strchr("<>",rch)) return rch; - if (strchr("()",rch) && strchr("<>",lch)) return lch; - } - - if (smushmode & SM_PAIR) { - if (lch=='[' && rch==']') return '|'; - if (rch=='[' && lch==']') return '|'; - if (lch=='{' && rch=='}') return '|'; - if (rch=='{' && lch=='}') return '|'; - if (lch=='(' && rch==')') return '|'; - if (rch=='(' && lch==')') return '|'; - } - - if (smushmode & SM_BIGX) { - if (lch=='/' && rch=='\\') return '|'; - if (rch=='/' && lch=='\\') return 'Y'; - if (lch=='>' && rch=='<') return 'X'; - /* Don't want the reverse of above to give 'X'. */ - } - - return '\0'; -} - - -/**************************************************************************** - - smushamt - - Returns the maximum amount that the current character can be smushed - into the current line. - -****************************************************************************/ - -int smushamt() -{ - int maxsmush,amt; - int row,linebd,charbd; - outchr ch1,ch2; - - if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) { - return 0; - } - maxsmush = currcharwidth; - for (row=0;row<charheight;row++) { - if (right2left) { - if (maxsmush>STRLEN(outputline[row])) { - maxsmush=STRLEN(outputline[row]); - } - for (charbd=STRLEN(currchar[row]); - ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ; - for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ; - amt = linebd+currcharwidth-1-charbd; - } - else { - for (linebd=STRLEN(outputline[row]); - ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ; - for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ; - amt = charbd+outlinelen-1-linebd; - } - if (!ch1||ch1==' ') { - amt++; - } - else if (ch2) { - if (smushem(ch1,ch2)!='\0') { - amt++; - } - } - if (amt<maxsmush) { - maxsmush = amt; - } - } - return maxsmush; -} - - -/**************************************************************************** - - addchar - - Attempts to add the given character onto the end of the current line. - Returns 1 if this can be done, 0 otherwise. - -****************************************************************************/ - -int addchar(c) -inchr c; -{ - int smushamount,row,k,column; - outchr *templine; - - getletter(c); - smushamount = smushamt(); - if (outlinelen+currcharwidth-smushamount>outlinelenlimit - ||inchrlinelen+1>inchrlinelenlimit) { - return 0; - } - - templine = (outchr*)myalloc(sizeof(outchr)*(outlinelenlimit+1)); - for (row=0;row<charheight;row++) { - if (right2left) { - STRCPY(templine,currchar[row]); - for (k=0;k<smushamount;k++) { - templine[currcharwidth-smushamount+k] = - smushem(templine[currcharwidth-smushamount+k],outputline[row][k]); - } - STRCAT(templine,outputline[row]+smushamount); - STRCPY(outputline[row],templine); - } - else { - for (k=0;k<smushamount;k++) { - column = outlinelen-smushamount+k; - if (column < 0) { - column = 0; - } - outputline[row][column] = - smushem(outputline[row][column],currchar[row][k]); - } - STRCAT(outputline[row],currchar[row]+smushamount); - } - } - free(templine); - outlinelen = STRLEN(outputline[0]); - inchrline[inchrlinelen++] = c; - return 1; -} - - -/**************************************************************************** - - putstring - - Prints out the given null-terminated string, substituting blanks - for hardblanks. If outputwidth is 1, prints the entire string; - otherwise prints at most outputwidth-1 characters. Prints a newline - at the end of the string. The string is left-justified, centered or - right-justified (taking outputwidth as the screen width) if - justification is 0, 1 or 2, respectively. - -****************************************************************************/ - -void putstring(string) -outchr *string; -{ - int i,len; - char c[10]; -#ifdef TLF_FONTS - size_t size; - wchar_t wc[2]; -#endif - - len = STRLEN(string); - if (outputwidth>1) { - if (len>outputwidth-1) { - len = outputwidth-1; - } - if (justification>0) { - for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) { - putchar(' '); - } - } - } - for (i=0;i<len;i++) { -#ifdef TLF_FONTS - wc[0] = string[i]; - wc[1] = 0; - size = wchar_to_utf8(wc,1,c,10,0); - if(size==1) { - if(c[0]==hardblank) { - c[0] = ' '; - } - } - c[size] = 0; - printf("%s",c); -#else - putchar(string[i]==hardblank?' ':string[i]); -#endif - } - putchar('\n'); -} - - -/**************************************************************************** - - printline - - Prints outputline using putstring, then clears the current line. - -****************************************************************************/ - -void printline() -{ - int i; - - for (i=0;i<charheight;i++) { - putstring(outputline[i]); - } - clearline(); -} - - -/**************************************************************************** - - splitline - - Splits inchrline at the last word break (bunch of consecutive blanks). - Makes a new line out of the first part and prints it using - printline. Makes a new line out of the second part and returns. - -****************************************************************************/ - -void splitline() -{ - int i,gotspace,lastspace,len1,len2; - inchr *part1,*part2; - - part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1)); - part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1)); - gotspace = 0; - lastspace = inchrlinelen-1; - for (i=inchrlinelen-1;i>=0;i--) { - if (!gotspace && inchrline[i]==' ') { - gotspace = 1; - lastspace = i; - } - if (gotspace && inchrline[i]!=' ') { - break; - } - } - len1 = i+1; - len2 = inchrlinelen-lastspace-1; - for (i=0;i<len1;i++) { - part1[i] = inchrline[i]; - } - for (i=0;i<len2;i++) { - part2[i] = inchrline[lastspace+1+i]; - } - clearline(); - for (i=0;i<len1;i++) { - addchar(part1[i]); - } - printline(); - for (i=0;i<len2;i++) { - addchar(part2[i]); - } - free(part1); - free(part2); -} - - -/**************************************************************************** - - handlemapping - - Given an input character (type inchr), executes re-mapping commands - read from control files. Returns re-mapped character (inchr). - -****************************************************************************/ - -inchr handlemapping(c) -inchr c; -{ - comnode *cmptr; - - cmptr=commandlist; - while (cmptr!=NULL) { - if (cmptr->thecommand ? - (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) { - c += cmptr->offset; - while(cmptr!=NULL ? cmptr->thecommand : 0) { - cmptr=cmptr->next; - } - } - else { - cmptr=cmptr->next; - } - } - return c; -} - -/**************************************************************************** - - Agetchar - - Replacement to getchar(). - Acts exactly like getchar if -A is NOT specified, - else obtains input from All remaining command line words. - -****************************************************************************/ - -int Agetchar() -{ - extern int optind; /* current argv[] element under study */ - static int AgetMode = 0; /* >= 0 for displacement into argv[n], <0 EOF */ - char *arg; /* pointer to active character */ - int c; /* current character */ - - if ( ! cmdinput ) /* is -A active? */ - return( getchar() ); /* no: return stdin character */ - - if ( AgetMode < 0 || optind >= Myargc ) /* EOF is sticky: */ - return( EOF ); /* **ensure it now and forever more */ - - /* find next character */ - arg = Myargv[optind]; /* pointer to active arg */ - c = arg[AgetMode++]&0xFF; /* get appropriate char of arg */ - - if ( ! c ) /* at '\0' that terminates word? */ - { /* at end of word: return ' ' if normal word, '\n' if empty */ - c = ' '; /* suppose normal word and return blank */ - if ( AgetMode == 1 ) /* if ran out in very 1st char, force \n */ - c = '\n'; /* (allows "hello '' world" to do \n at '') */ - AgetMode = 0; /* return to char 0 in NEXT word */ - if ( ++optind >= Myargc ) /* run up word count and check if at "EOF" */ - { /* just ran out of arguments */ - c = EOF; /* return EOF */ - AgetMode = -1; /* ensure all future returns return EOF */ + if ((fd = open("/dev/tty",O_WRONLY))<0) return -1; + result = ioctl(fd,TIOCGWINSZ,&ws); + close(fd); + return result?-1:ws.ws_col; } - } - - return( c ); /* return appropriate character */ - -} /* end: Agetchar() */ + #endif /* ifdef TIOCGWINSZ */ -/**************************************************************************** + /**************************************************************************** - iso2022 + myalloc - Called by getinchr. Interprets ISO 2022 sequences + Calls malloc. If malloc returns error, prints error message and + quits. -******************************************************************************/ + ****************************************************************************/ -inchr iso2022() -{ - inchr ch; - inchr ch2; - int save_gl; - int save_gr; + #ifdef __STDC__ + char *myalloc(size_t size) + #else + char *myalloc(size) + int size; + #endif + { + char *ptr; + #ifndef __STDC__ + extern void *malloc(); + #endif - ch = Agetchar(); - if (ch == EOF) return ch; - if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */ - if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */ - switch (ch) { - case 14: /* invoke G1 into GL */ - gl = 1; - return iso2022(); - case 15: /* invoke G0 into GL */ - gl = 0; - return iso2022(); - case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */ - save_gl = gl; save_gr = gr; - gl = gr = 2; - ch = iso2022(); - gl = save_gl; gr = save_gr; - return ch; - case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */ - save_gl = gl; save_gr = gr; - gl = gr = 3; - ch = iso2022(); - gl = save_gl; gr = save_gr; - return ch; - case 'n' + 0x100: /* invoke G2 into GL */ - gl = 2; - return iso2022(); - case 'o' + 0x100: /* invoke G3 into GL */ - gl = 3; - return iso2022(); - case '~' + 0x100: /* invoke G1 into GR */ - gr = 1; - return iso2022(); - case '}' + 0x100: /* invoke G2 into GR */ - gr = 2; - return iso2022(); - case '|' + 0x100: /* invoke G3 into GR */ - gr = 3; - return iso2022(); - case '(' + 0x100: /* set G0 to 94-char set */ - ch = Agetchar(); - if (ch == 'B') ch = 0; /* ASCII */ - gn[0] = ch << 16; - gndbl[0] = 0; - return iso2022(); - case ')' + 0x100: /* set G1 to 94-char set */ - ch = Agetchar(); - if (ch == 'B') ch = 0; - gn[1] = ch << 16; - gndbl[1] = 0; - return iso2022(); - case '*' + 0x100: /* set G2 to 94-char set */ - ch = Agetchar(); - if (ch == 'B') ch = 0; - gn[2] = ch << 16; - gndbl[2] = 0; - return iso2022(); - case '+' + 0x100: /* set G3 to 94-char set */ - ch = Agetchar(); - if (ch == 'B') ch = 0; - gn[3] = ch << 16; - gndbl[3] = 0; - return iso2022(); - case '-' + 0x100: /* set G1 to 96-char set */ - ch = Agetchar(); - if (ch == 'A') ch = 0; /* Latin-1 top half */ - gn[1] = (ch << 16) | 0x80; - gndbl[1] = 0; - return iso2022(); - case '.' + 0x100: /* set G2 to 96-char set */ - ch = Agetchar(); - if (ch == 'A') ch = 0; - gn[2] = (ch << 16) | 0x80; - gndbl[2] = 0; - return iso2022(); - case '/' + 0x100: /* set G3 to 96-char set */ - ch = Agetchar(); - if (ch == 'A') ch = 0; - gn[3] = (ch << 16) | 0x80; - gndbl[3] = 0; - return iso2022(); - case '(' + 0x200: /* set G0 to 94 x 94 char set */ - ch = Agetchar(); - gn[0] = ch << 16; - gndbl[0] = 1; - return iso2022(); - case ')' + 0x200: /* set G1 to 94 x 94 char set */ - ch = Agetchar(); - gn[1] = ch << 16; - gndbl[1] = 1; - return iso2022(); - case '*' + 0x200: /* set G2 to 94 x 94 char set */ - ch = Agetchar(); - gn[2] = ch << 16; - gndbl[2] = 1; - return iso2022(); - case '+' + 0x200: /* set G3 to 94 x 94 char set */ - ch = Agetchar(); - gn[3] = ch << 16; - gndbl[3] = 1; - return iso2022(); - default: - if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */ - gn[0] = (ch & ~0x200) << 16; - gndbl[0] = 1; - return iso2022(); - } - } + if ((ptr = (char*)malloc(size))==NULL) { + fprintf(stderr,"%s: Out of memory\n",myname); + exit(1); + } + else { + return ptr; + } + } - if (ch >= 0x21 && ch <= 0x7E) { /* process GL */ - if (gndbl[gl]) { - ch2 = Agetchar(); - return gn[gl] | (ch << 8) | ch2; - } - else return gn[gl] | ch; - } - else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */ - if (gndbl[gr]) { - ch2 = Agetchar(); - return gn[gr] | (ch << 8) | ch2; - } - else return gn[gr] | (ch & ~0x80); - } - else return ch; - } -/**************************************************************************** + /**************************************************************************** - ungetinchr + hasdirsep - Called by main. Pushes back an "inchr" to be read by getinchr - on the next call. + Returns true if s1 contains a DIRSEP or DIRSEP2 character. -******************************************************************************/ -inchr getinchr_buffer; -int getinchr_flag; + ****************************************************************************/ -inchr ungetinchr(c) -inchr c; -{ - getinchr_buffer = c; - getinchr_flag = 1; - return c; -} + int hasdirsep(s1) + char *s1; + { + if (strchr(s1, DIRSEP)) return 1; + else if (strchr(s1, DIRSEP2)) return 1; + else return 0; + } -/***************************************************************************** + /**************************************************************************** - getinchr + suffixcmp - Called by main. Processes multibyte characters. Invokes Agetchar. - If multibyte = 0, ISO 2022 mode (see iso2022 routine). - If multibyte = 1, double-byte mode (0x00-0x7f bytes are characters, - 0x80-0xFF bytes are first byte of a double-byte character). - If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters, - 0x80-0xBF bytes are nonfirst byte of a multibyte character, - 0xC0-0xFD bytes are first byte of a multibyte character, - 0xFE-0xFF bytes are errors (all errors return code 0x0080)). - If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it, - "~~" is a tilde, "~x" for all other x is ignored). - If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte - of a double-byte character, all other bytes are characters). - + Returns true if s2 is a suffix of s1; uses case-blind comparison. -*****************************************************************************/ + ****************************************************************************/ -inchr getinchr() -{ - int ch, ch2, ch3, ch4, ch5, ch6; + int suffixcmp(s1, s2) + char *s1; + char *s2; + { + int len1, len2; - if (getinchr_flag) { - getinchr_flag = 0; - return getinchr_buffer; - } + len1 = MYSTRLEN(s1); + len2 = MYSTRLEN(s2); + if (len2 > len1) return 0; + s1 += len1 - len2; + while (*s1) { + if (tolower(*s1) != tolower(*s2)) return 0; + s1++; + s2++; + } + return 1; + } + + /**************************************************************************** - switch(multibyte) { - case 0: /* single-byte */ - return iso2022(); - case 1: /* DBCS */ - ch = Agetchar(); - if ((ch >= 0x80 && ch <= 0x9F) || - (ch >= 0xE0 && ch <= 0xEF)) { - ch = (ch << 8) + Agetchar(); - } - return ch; - case 2: /* UTF-8 */ - ch = Agetchar(); - if (ch < 0x80) return ch; /* handles EOF, too */ - if (ch < 0xC0 || ch > 0xFD) - return 0x0080; /* illegal first character */ - ch2 = Agetchar() & 0x3F; - if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2; - ch3 = Agetchar() & 0x3F; - if (ch < 0xF0) - return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3; - ch4 = Agetchar() & 0x3F; - if (ch < 0xF8) - return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4; - ch5 = Agetchar() & 0x3F; - if (ch < 0xFC) - return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) + - (ch4 << 6) + ch5; - ch6 = Agetchar() & 0x3F; - return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) + - (ch4 << 12) + (ch5 << 6) + ch6; - case 3: /* HZ */ - ch = Agetchar(); - if (ch == EOF) return ch; - if (hzmode) { - ch = (ch << 8) + Agetchar(); - if (ch == ('}' << 8) + '~') { - hzmode = 0; - return getinchr(); - } - return ch; - } - else if (ch == '~') { - ch = Agetchar(); - if (ch == '{') { - hzmode = 1; - return getinchr(); - } - else if (ch == '~') { - return ch; - } - else { - return getinchr(); - } - } - else return ch; - case 4: /* Shift-JIS */ - ch = Agetchar(); - if ((ch >= 0x80 && ch <= 0x9F) || - (ch >= 0xE0 && ch <= 0xEF)) { - ch = (ch << 8) + Agetchar(); - } - return ch; - default: - return 0x80; - } - } + skiptoeol -void f(c) -inchr c; -{ - int i; - int char_not_added; - int wordbreakmode = 0; + Skips to the end of a line, given a stream. Handles \r, \n, or \r\n. - do { - char_not_added = 0; + ****************************************************************************/ - if (wordbreakmode== -1) { - if (c==' ') { - break; - } - else if (c=='\n') { - wordbreakmode = 0; - break; - } - wordbreakmode = 0; - } + void skiptoeol(fp) + ZFILE *fp; + { + int dummy; - if (c=='\n') { - printline(); - wordbreakmode = 0; - } + while (dummy=Zgetc(fp),dummy!=EOF) { + if (dummy == '\n') return; + if (dummy == '\r') { + dummy = Zgetc(fp); + if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp); + return; + } + } + } - else if (addchar(c)) { - if (c!=' ') { - wordbreakmode = (wordbreakmode>=2)?3:1; - } - else { - wordbreakmode = (wordbreakmode>0)?2:0; - } - } - else if (outlinelen==0) { + /**************************************************************************** + + myfgets + + Local version of fgets. Handles \r, \n, and \r\n terminators. + + ****************************************************************************/ + + char *myfgets(line,maxlen,fp) + char *line; + int maxlen; + ZFILE *fp; + { + int c = 0; + char *p; + + p = line; + while((c=Zgetc(fp))!=EOF&&maxlen) { + *p++ = c; + maxlen--; + if (c=='\n') break; + if (c=='\r') { + c = Zgetc(fp); + if (c != EOF && c != '\n') Zungetc(c,fp); + *(p-1) = '\n'; + break; + } + } + *p = 0; + return (c==EOF) ? NULL : line; + } + + + /**************************************************************************** + + usageerr + + Prints "Usage: ...." line to the given stream. + + ****************************************************************************/ + + void printusage(out) + FILE *out; + { + fprintf(out, + "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n", + " [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n" + " [ -C controlfile ] [ -I infocode ] [ message ]\n", + myname); + } + + + /**************************************************************************** + + printinfo + + Prints version and copyright message, or utility information. + + ****************************************************************************/ + + void printinfo(infonum) + int infonum; + { + switch (infonum) { + case 0: /* Copyright message */ + printf("FIGlet Copyright (C) 1991-2012 Glenn Chappell, Ian Chai, " + "John Cowan,\nChristiaan Keet and Claudio Matsuoka\n" + "Internet: <info@figlet.org> " + "Version: %s, date: %s\n\n" + "FIGlet, along with the various FIGlet fonts" + " and documentation, may be\n" + "freely copied and distributed.\n\n" + "If you use FIGlet, please send an" + " e-mail message to <info@figlet.org>.\n\n" + "The latest version of FIGlet is available from the" + " web site,\n\thttp://www.figlet.org/\n\n", + VERSION,DATE); + printusage(stdout); + break; + case 1: /* Version (integer) */ + printf("%d\n",VERSION_INT); + break; + case 2: /* Font directory */ + printf("%s\n",fontdirname); + break; + case 3: /* Font */ + printf("%s\n",fontname); + break; + case 4: /* Outputwidth */ + printf("%d\n",outputwidth); + break; + case 5: /* Font formats */ + printf("%s", FONTFILEMAGICNUMBER); + #ifdef TLF_FONTS + printf(" %s", TOILETFILEMAGICNUMBER); + #endif + printf("\n"); + } + } + + + /**************************************************************************** + + readmagic + + Reads a four-character magic string from a stream. + + ****************************************************************************/ + void readmagic(fp,magic) + ZFILE *fp; + char *magic; + { + int i; + + for (i=0;i<4;i++) { + magic[i] = Zgetc(fp); + } + magic[4] = 0; + } + + /**************************************************************************** + + skipws + + Skips whitespace characters from a stream. + + ****************************************************************************/ + void skipws(fp) + ZFILE *fp; + { + int c; + while (c=Zgetc(fp),isascii(c)&&isspace(c)) ; + Zungetc(c,fp); + } + + /**************************************************************************** + + readnum + + Reads a number from a stream. Accepts "0" prefix for octal and + "0x" or "0X" for hexadecimal. Ignores leading whitespace. + + ****************************************************************************/ + void readnum(fp,nump) + ZFILE *fp; + inchr *nump; + { + int acc = 0; + char *p; + int c; + int base; + int sign = 1; + char digits[] = "0123456789ABCDEF"; + + skipws(fp); + c = Zgetc(fp); + if (c=='-') { + sign = -1; + } + else { + Zungetc(c,fp); + } + c = Zgetc(fp); + if (c=='0') { + c = Zgetc(fp); + if (c=='x'||c=='X') { + base = 16; + } + else { + base = 8; + Zungetc(c,fp); + } + } + else { + base = 10; + Zungetc(c,fp); + } + + while((c=Zgetc(fp))!=EOF) { + c=toupper(c); + p=strchr(digits,c); + if (!p) { + Zungetc(c,fp); + *nump = acc * sign; + return; + } + acc = acc*base+(p-digits); + } + *nump = acc * sign; + } + + /**************************************************************************** + + readTchar + + Reads a control file "T" command character specification. + + Character is a single byte, an escape sequence, or + an escaped numeric. + + ****************************************************************************/ + + inchr readTchar(fp) + ZFILE *fp; + { + inchr thechar; + char next; + + thechar=Zgetc(fp); + if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */ + Zungetc(thechar,fp); + return '\0'; + } + if (thechar!='\\') return thechar; + next=Zgetc(fp); + switch(next) { + case 'a': + return 7; + case 'b': + return 8; + case 'e': + return 27; + case 'f': + return 12; + case 'n': + return 10; + case 'r': + return 13; + case 't': + return 9; + case 'v': + return 11; + default: + if (next=='-' || next=='x' || (next>='0' && next<='9')) { + Zungetc(next,fp); + readnum(fp,&thechar); + return thechar; + } + return next; + } + } + + /**************************************************************************** + + charsetname + + Get a Tchar representing a charset name, or 0 if none available. + Called in getcharset(). + + ****************************************************************************/ + + inchr charsetname(fp) + ZFILE *fp; + { + inchr result; + + result = readTchar(fp); + if (result == '\n' || result == '\r') { + result = 0; + Zungetc(result,fp); + } + return result; + } + + /**************************************************************************** + + charset + + Processes "g[0123]" character set specifier + Called in readcontrol(). + + ****************************************************************************/ + + void charset(n, controlfile) + int n; + ZFILE *controlfile; + { + int ch; + + skipws(controlfile); + if (Zgetc(controlfile) != '9') { + skiptoeol(controlfile); + return; + } + ch = Zgetc(controlfile); + if (ch == '6') { + gn[n] = 65536L * charsetname(controlfile) + 0x80; + gndbl[n] = 0; + skiptoeol(controlfile); + return; + } + if (ch != '4') { + skiptoeol(controlfile); + return; + } + ch = Zgetc(controlfile); + if (ch == 'x') { + if (Zgetc(controlfile) != '9') { + skiptoeol(controlfile); + return; + } + if (Zgetc(controlfile) != '4') { + skiptoeol(controlfile); + return; + } + skipws(controlfile); + gn[n] = 65536L * charsetname(controlfile); + gndbl[n] = 1; + skiptoeol(controlfile); + return; + } + Zungetc(ch, controlfile); + skipws(controlfile); + gn[n] = 65536L * charsetname(controlfile); + gndbl[n] = 0; + 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 + + Allocates memory and reads in the given control file. + Called in readcontrolfiles(). + + ****************************************************************************/ + + void readcontrol(controlname) + char *controlname; + { + inchr firstch,lastch; + char dashcheck; + inchr offset; + int command; + ZFILE *controlfile; + + controlfile = FIGopen(controlname,CONTROLFILESUFFIX); + + if (controlfile==NULL) { + fprintf(stderr,"%s: %s: Unable to open control file\n",myname, + controlname); + exit(1); + } + + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 0; /* Begin with a freeze command */ + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + + while(command=Zgetc(controlfile),command!=EOF) { + switch (command) { + case 't': /* Translate */ + skipws(controlfile); + firstch=readTchar(controlfile); + if ((dashcheck=Zgetc(controlfile))=='-') { + lastch=readTchar(controlfile); + } + else { + Zungetc(dashcheck,controlfile); + lastch=firstch; + } + skipws(controlfile); + offset=readTchar(controlfile)-firstch; + skiptoeol(controlfile); + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 1; + (*commandlistend)->rangelo = firstch; + (*commandlistend)->rangehi = lastch; + (*commandlistend)->offset = offset; + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': + /* Mapping table entry */ + Zungetc(command,controlfile); + readnum(controlfile,&firstch); + skipws(controlfile); + readnum(controlfile,&lastch); + offset=lastch-firstch; + lastch=firstch; + skiptoeol(controlfile); + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 1; + (*commandlistend)->rangelo = firstch; + (*commandlistend)->rangehi = lastch; + (*commandlistend)->offset = offset; + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + break; + case 'f': /* freeze */ + skiptoeol(controlfile); + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 0; + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + break; + case 'b': /* DBCS input mode */ + multibyte = 1; + break; + case 'u': /* UTF-8 input mode */ + multibyte = 2; + break; + case 'h': /* HZ input mode */ + multibyte = 3; + break; + case 'j': /* Shift-JIS input mode */ + multibyte = 4; + break; + case 'g': /* ISO 2022 character set choices */ + multibyte = 0; + skipws(controlfile); + command=Zgetc(controlfile); + switch (command) { + case '0': /* define G0 charset */ + charset(0, controlfile); + break; + case '1': /* set G1 charset */ + charset(1, controlfile); + break; + case '2': /* set G2 charset */ + charset(2, controlfile); + break; + case '3': /* set G3 charset */ + charset(3, controlfile); + break; + case 'l': case 'L': /* define left half */ + skipws(controlfile); + gl = Zgetc(controlfile) - '0'; + skiptoeol(controlfile); + break; + case 'r': case 'R': /* define right half */ + skipws(controlfile); + gr = Zgetc(controlfile) - '0'; + skiptoeol(controlfile); + break; + default: /* meaningless "g" command */ + skiptoeol(controlfile); + } + case '\r': case '\n': /* blank line */ + break; + default: /* Includes '#' */ + skiptoeol(controlfile); + } + } + Zclose(controlfile); + } + + + /**************************************************************************** + + readcontrolfiles + + Reads in the controlfiles names in cfilelist. Uses readcontrol. + Called in main(). + + ****************************************************************************/ + + void readcontrolfiles() + { + cfnamenode *cfnptr; + + for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) { + readcontrol(cfnptr->thename); + } + } + + + /**************************************************************************** + + clearcfilelist + + Clears the control file list. Assumes thename does not need freeing. + + ****************************************************************************/ + + void clearcfilelist() + { + cfnamenode *cfnptr1,*cfnptr2; + + cfnptr1 = cfilelist; + while (cfnptr1 != NULL) { + cfnptr2 = cfnptr1->next; + free(cfnptr1); + cfnptr1 = cfnptr2; + } + cfilelist = NULL; + cfilelistend = &cfilelist; + } + + + /**************************************************************************** + + getparams + + Handles all command-line parameters. Puts all parameters within + bounds. + + ****************************************************************************/ + + void getparams() + { + extern char *optarg; + extern int optind; + int c; /* "Should" be a char -- need int for "!= -1" test*/ + int columns,infoprint; + char *controlname,*env; + + env = getenv("FIGLET_FONTDIR"); + if (env!=NULL) { + fontdirname = env; + } + infoprint = -1; + while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) { + /* Note: -F is not a legal option -- prints a special err message. */ + switch (c) { + case 'A': + cmdinput = 1; + break; + case 'D': + deutschflag = 1; + break; + case 'E': + deutschflag = 0; + break; + case 'X': + right2left = -1; + break; + case 'L': + right2left = 0; + break; + case 'R': + right2left = 1; + break; + case 'x': + justification = -1; + break; + case 'l': + justification = 0; + break; + case 'c': + justification = 1; + break; + case 'r': + justification = 2; + break; + case 'p': + paragraphflag = 1; + break; + case 'n': + paragraphflag = 0; + break; + case 's': + smushoverride = SMO_NO; + break; + case 'k': + smushmode = SM_KERN; + smushoverride = SMO_YES; + break; + case 'S': + smushmode = SM_SMUSH; + smushoverride = SMO_FORCE; + break; + case 'o': + smushmode = SM_SMUSH; + smushoverride = SMO_YES; + break; + case 'W': + smushmode = 0; + smushoverride = SMO_YES; + break; + case 't': + #ifdef TIOCGWINSZ + columns = get_columns(); + if (columns>0) { + outputwidth = columns; + } + #else /* ifdef TIOCGWINSZ */ + fprintf(stderr, + "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n", + myname); + #endif /* ifdef TIOCGWINSZ */ + break; + case 'v': + infoprint = 0; + break; + case 'I': + infoprint = atoi(optarg); + break; + case 'm': + smushmode = atoi(optarg); + if (smushmode < -1) { + smushoverride = SMO_NO; + break; + } + if (smushmode == 0) smushmode = SM_KERN; + else if (smushmode == -1) smushmode = 0; + else smushmode = (smushmode & 63) | SM_SMUSH; + smushoverride = SMO_YES; + break; + case 'w': + columns = atoi(optarg); + if (columns>0) { + outputwidth = columns; + } + break; + case 'd': + fontdirname = optarg; + break; + case 'f': + fontname = optarg; + if (suffixcmp(fontname,FONTFILESUFFIX)) { + fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0'; + } + #ifdef TLF_FONTS + else if (suffixcmp(fontname,TOILETFILESUFFIX)) { + fontname[MYSTRLEN(fontname)-TSUFFIXLEN] = '\0'; + } + #endif + break; + case 'C': + controlname = optarg; + if (suffixcmp(controlname, CONTROLFILESUFFIX)) { + controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0'; + } + (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode)); + (*cfilelistend)->thename = controlname; + cfilelistend = &(*cfilelistend)->next; + (*cfilelistend) = NULL; + break; + case 'N': + clearcfilelist(); + multibyte = 0; + gn[0] = 0; + gn[1] = 0x80; + gn[2] = gn[3] = 0; + gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0; + gl = 0; + gr = 1; + break; + case 'F': /* Not a legal option */ + fprintf(stderr,"%s: illegal option -- F\n",myname); + printusage(stderr); + fprintf(stderr, + "\nBecause of numerous incompatibilities, the" + " \"-F\" option has been\n" + "removed. It has been replaced by the \"figlist\"" + " program, which is now\n" + "included in the basic FIGlet package. \"figlist\"" + " is also available\n" + "from http://www.figlet.org/" + "under UNIX utilities.\n"); + exit(1); + break; + default: + printusage(stderr); + exit(1); + } + } + if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */ + if (infoprint>=0) { + printinfo(infoprint); + exit(0); + } + } + + + /**************************************************************************** + + clearline + + Clears both the input (inchrline) and output (outputline) storage. + + ****************************************************************************/ + + void clearline() + { + int i; + + for (i=0;i<charheight;i++) { + outputline[i][0] = '\0'; + } + outlinelen = 0; + inchrlinelen = 0; + } + + + /**************************************************************************** + + readfontchar + + Reads a font character from the font file, and places it in a + newly-allocated entry in the list. + + ****************************************************************************/ + + void readfontchar(file,theord) + ZFILE *file; + inchr theord; + { + int row,k; + char templine[MAXLEN+1]; + outchr endchar, outline[MAXLEN+1]; + fcharnode *fclsave; + + fclsave = fcharlist; + fcharlist = (fcharnode*)myalloc(sizeof(fcharnode)); + fcharlist->ord = theord; + fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight); + fcharlist->next = fclsave; + + outline[0] = 0; + + for (row=0;row<charheight;row++) { + if (myfgets(templine,MAXLEN,file)==NULL) { + templine[0] = '\0'; + } + #ifdef TLF_FONTS + utf8_to_wchar(templine,MAXLEN,outline,MAXLEN,0); + #else + strcpy(outline,templine); + #endif + k = STRLEN(outline)-1; + while (k>=0 && ISSPACE(outline[k])) { /* remove trailing spaces */ + k--; + } + if (k>=0) { + endchar = outline[k]; /* remove endmarks */ + while (k>=0 && outline[k]==endchar) { + k--; + } + } + outline[k+1] = '\0'; + fcharlist->thechar[row] = (outchr*)myalloc(sizeof(outchr)*(STRLEN(outline)+1)); + STRCPY(fcharlist->thechar[row],outline); + } + } + + + /**************************************************************************** + + readfont + + Allocates memory, initializes variables, and reads in the font. + Called near beginning of main(). + + ****************************************************************************/ + + void readfont() + { + int i,row,numsread; + inchr theord; + int maxlen,cmtlines,ffright2left; + int smush,smush2; + char fileline[MAXLEN+1],magicnum[5]; + ZFILE *fontfile; + + fontfile = FIGopen(fontname,FONTFILESUFFIX); + #ifdef TLF_FONTS + if (fontfile==NULL) { + fontfile = FIGopen(fontname,TOILETFILESUFFIX); + if(fontfile) toiletfont = 1; + } + #endif + + if (fontfile==NULL) { + fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontname); + exit(1); + } + + readmagic(fontfile,magicnum); + if (myfgets(fileline,MAXLEN,fontfile)==NULL) { + fileline[0] = '\0'; + } + if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) { + skiptoeol(fontfile); + } + numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d", + &hardblank,&charheight,&maxlen,&smush,&cmtlines, + &ffright2left,&smush2); + + if (maxlen > MAXLEN) { + fprintf(stderr,"%s: %s: character is too wide\n",myname,fontname); + exit(1); + } + #ifdef TLF_FONTS + if ((!toiletfont && strcmp(magicnum,FONTFILEMAGICNUMBER)) || + (toiletfont && strcmp(magicnum,TOILETFILEMAGICNUMBER)) || numsread<5) { + #else + if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) { + #endif + fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontname); + exit(1); + } + for (i=1;i<=cmtlines;i++) { + skiptoeol(fontfile); + } + + if (numsread<6) { + ffright2left = 0; + } + + if (numsread<7) { /* if no smush2, decode smush into smush2 */ + if (smush == 0) smush2 = SM_KERN; + else if (smush < 0) smush2 = 0; + else smush2 = (smush & 31) | SM_SMUSH; + } + + if (charheight<1) { + charheight = 1; + } + + if (maxlen<1) { + maxlen = 1; + } + + maxlen += 100; /* Give ourselves some extra room */ + + if (smushoverride == SMO_NO) + smushmode = smush2; + else if (smushoverride == SMO_FORCE) + smushmode |= smush2; + + if (right2left<0) { + right2left = ffright2left; + } + + if (justification<0) { + justification = 2*right2left; + } + + /* Allocate "missing" character */ + fcharlist = (fcharnode*)myalloc(sizeof(fcharnode)); + fcharlist->ord = 0; + fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight); + fcharlist->next = NULL; + for (row=0;row<charheight;row++) { + fcharlist->thechar[row] = (outchr*)myalloc(sizeof(outchr)); + fcharlist->thechar[row][0] = '\0'; + } + for (theord=' ';theord<='~';theord++) { + readfontchar(fontfile,theord); + } + for (theord=0;theord<=6;theord++) { + readfontchar(fontfile,deutsch[theord]); + } + while (myfgets(fileline,maxlen+1,fontfile)==NULL?0: + sscanf(fileline,"%li",&theord)==1) { + readfontchar(fontfile,theord); + } + Zclose(fontfile); + } + + + /**************************************************************************** + + linealloc + + Allocates & clears outputline, inchrline. Sets inchrlinelenlimit. + Called near beginning of main(). + + ****************************************************************************/ + + void linealloc() + { + int row; + + outputline = (outchr**)myalloc(sizeof(outchr*)*charheight); + for (row=0;row<charheight;row++) { + outputline[row] = (outchr*)myalloc(sizeof(outchr)*(outlinelenlimit+1)); + } + inchrlinelenlimit = outputwidth*4+100; + inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1)); + clearline(); + } + + + /**************************************************************************** + + getletter + + Sets currchar to point to the font entry for the given character. + Sets currcharwidth to the width of this character. + + ****************************************************************************/ + + void getletter(c) + inchr c; + { + fcharnode *charptr; + + for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c; + charptr=charptr->next) ; + if (charptr!=NULL) { + currchar = charptr->thechar; + } + else { + for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0; + charptr=charptr->next) ; + currchar = charptr->thechar; + } + previouscharwidth = currcharwidth; + currcharwidth = STRLEN(currchar[0]); + } + + + /**************************************************************************** + + smushem + + Given 2 characters, attempts to smush them into 1, according to + smushmode. Returns smushed character or '\0' if no smushing can be + done. + + smushmode values are sum of following (all values smush blanks): + 1: Smush equal chars (not hardblanks) + 2: Smush '_' with any char in hierarchy below + 4: hierarchy: "|", "/\", "[]", "{}", "()", "<>" + Each class in hier. can be replaced by later class. + 8: [ + ] -> |, { + } -> |, ( + ) -> | + 16: / + \ -> X, > + < -> X (only in that order) + 32: hardblank + hardblank -> hardblank + + ****************************************************************************/ + + outchr smushem(lch,rch) + outchr lch,rch; + { + if (lch==' ') return rch; + if (rch==' ') return lch; + + if (previouscharwidth<2 || currcharwidth<2) return '\0'; + /* Disallows overlapping if the previous character */ + /* or the current character has a width of 1 or zero. */ + + if ((smushmode & SM_SMUSH) == 0) return '\0'; /* kerning */ + + if ((smushmode & 63) == 0) { + /* This is smushing by universal overlapping. */ + /* Unreachable code: lch==' ' or rch==' ' already handled! + if (lch==' ') return rch; + if (rch==' ') return lch; + */ + + if (lch==hardblank) return rch; + if (rch==hardblank) return lch; + /* Above four lines ensure overlapping preference to */ + /* visible characters. */ + if (right2left==1) return lch; + /* Above line ensures that the dominant (foreground) */ + /* fig-character for overlapping is the latter in the */ + /* user's text, not necessarily the rightmost character. */ + return rch; + /* Occurs in the absence of above exceptions. */ + } + + if (smushmode & SM_HARDBLANK) { + if (lch==hardblank && rch==hardblank) return lch; + } + + if (lch==hardblank || rch==hardblank) return '\0'; + + if (smushmode & SM_EQUAL) { + if (lch==rch) return lch; + } + + if (smushmode & SM_LOWLINE) { + if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch; + if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch; + } + + if (smushmode & SM_HIERARCHY) { + if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch; + if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch; + if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch; + if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch; + if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch; + if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch; + if (strchr("{}",lch) && strchr("()<>",rch)) return rch; + if (strchr("{}",rch) && strchr("()<>",lch)) return lch; + if (strchr("()",lch) && strchr("<>",rch)) return rch; + if (strchr("()",rch) && strchr("<>",lch)) return lch; + } + + if (smushmode & SM_PAIR) { + if (lch=='[' && rch==']') return '|'; + if (rch=='[' && lch==']') return '|'; + if (lch=='{' && rch=='}') return '|'; + if (rch=='{' && lch=='}') return '|'; + if (lch=='(' && rch==')') return '|'; + if (rch=='(' && lch==')') return '|'; + } + + if (smushmode & SM_BIGX) { + if (lch=='/' && rch=='\\') return '|'; + if (rch=='/' && lch=='\\') return 'Y'; + if (lch=='>' && rch=='<') return 'X'; + /* Don't want the reverse of above to give 'X'. */ + } + + return '\0'; + } + + + /**************************************************************************** + + smushamt + + Returns the maximum amount that the current character can be smushed + into the current line. + + ****************************************************************************/ + + int smushamt() + { + int maxsmush,amt; + int row,linebd,charbd; + outchr ch1,ch2; + + if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) { + return 0; + } + maxsmush = currcharwidth; + for (row=0;row<charheight;row++) { + if (right2left) { + if (maxsmush>STRLEN(outputline[row])) { + maxsmush=STRLEN(outputline[row]); + } + for (charbd=STRLEN(currchar[row]); + ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ; + for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ; + amt = linebd+currcharwidth-1-charbd; + } + else { + for (linebd=STRLEN(outputline[row]); + ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ; + for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ; + amt = charbd+outlinelen-1-linebd; + } + if (!ch1||ch1==' ') { + amt++; + } + else if (ch2) { + if (smushem(ch1,ch2)!='\0') { + amt++; + } + } + if (amt<maxsmush) { + maxsmush = amt; + } + } + return maxsmush; + } + + + /**************************************************************************** + + addchar + + Attempts to add the given character onto the end of the current line. + Returns 1 if this can be done, 0 otherwise. + + ****************************************************************************/ + + int addchar(c) + inchr c; + { + int smushamount,row,k,column; + outchr *templine; + + getletter(c); + smushamount = smushamt(); + if (outlinelen+currcharwidth-smushamount>outlinelenlimit + ||inchrlinelen+1>inchrlinelenlimit) { + return 0; + } + + templine = (outchr*)myalloc(sizeof(outchr)*(outlinelenlimit+1)); + for (row=0;row<charheight;row++) { + if (right2left) { + STRCPY(templine,currchar[row]); + for (k=0;k<smushamount;k++) { + templine[currcharwidth-smushamount+k] = + smushem(templine[currcharwidth-smushamount+k],outputline[row][k]); + } + STRCAT(templine,outputline[row]+smushamount); + STRCPY(outputline[row],templine); + } + else { + for (k=0;k<smushamount;k++) { + column = outlinelen-smushamount+k; + if (column < 0) { + column = 0; + } + outputline[row][column] = + smushem(outputline[row][column],currchar[row][k]); + } + STRCAT(outputline[row],currchar[row]+smushamount); + } + } + free(templine); + outlinelen = STRLEN(outputline[0]); + inchrline[inchrlinelen++] = c; + return 1; + } + + + /**************************************************************************** + + putstring + + Prints out the given null-terminated string, substituting blanks + for hardblanks. If outputwidth is 1, prints the entire string; + otherwise prints at most outputwidth-1 characters. Prints a newline + at the end of the string. The string is left-justified, centered or + right-justified (taking outputwidth as the screen width) if + justification is 0, 1 or 2, respectively. + + ****************************************************************************/ + + void putstring(string) + outchr *string; + { + int i,len; + char c[10]; + #ifdef TLF_FONTS + size_t size; + wchar_t wc[2]; + #endif + + len = STRLEN(string); + if (outputwidth>1) { + if (len>outputwidth-1) { + len = outputwidth-1; + } + if (justification>0) { + for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) { + putchar(' '); + } + } + } + for (i=0;i<len;i++) { + #ifdef TLF_FONTS + wc[0] = string[i]; + wc[1] = 0; + size = wchar_to_utf8(wc,1,c,10,0); + if(size==1) { + if(c[0]==hardblank) { + c[0] = ' '; + } + } + c[size] = 0; + printf("%s",c); + #else + putchar(string[i]==hardblank?' ':string[i]); + #endif + } + putchar('\n'); + } + + + /**************************************************************************** + + printline + + Prints outputline using putstring, then clears the current line. + + ****************************************************************************/ + + void printline() + { + int i; + + for (i=0;i<charheight;i++) { + putstring(outputline[i]); + } + clearline(); + } + + + /**************************************************************************** + + splitline + + Splits inchrline at the last word break (bunch of consecutive blanks). + Makes a new line out of the first part and prints it using + printline. Makes a new line out of the second part and returns. + + ****************************************************************************/ + + void splitline() + { + int i,gotspace,lastspace,len1,len2; + inchr *part1,*part2; + + part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1)); + part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1)); + gotspace = 0; + lastspace = inchrlinelen-1; + for (i=inchrlinelen-1;i>=0;i--) { + if (!gotspace && inchrline[i]==' ') { + gotspace = 1; + lastspace = i; + } + if (gotspace && inchrline[i]!=' ') { + break; + } + } + len1 = i+1; + len2 = inchrlinelen-lastspace-1; + for (i=0;i<len1;i++) { + part1[i] = inchrline[i]; + } + for (i=0;i<len2;i++) { + part2[i] = inchrline[lastspace+1+i]; + } + clearline(); + for (i=0;i<len1;i++) { + addchar(part1[i]); + } + printline(); + for (i=0;i<len2;i++) { + addchar(part2[i]); + } + free(part1); + free(part2); + } + + + /**************************************************************************** + + handlemapping + + Given an input character (type inchr), executes re-mapping commands + read from control files. Returns re-mapped character (inchr). + + ****************************************************************************/ + + inchr handlemapping(c) + inchr c; + { + comnode *cmptr; + + cmptr=commandlist; + while (cmptr!=NULL) { + if (cmptr->thecommand ? + (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) { + c += cmptr->offset; + while(cmptr!=NULL ? cmptr->thecommand : 0) { + cmptr=cmptr->next; + } + } + else { + cmptr=cmptr->next; + } + } + return c; + } + + /**************************************************************************** + + Agetchar + + Replacement to getchar(). + Acts exactly like getchar if -A is NOT specified, + else obtains input from All remaining command line words. + + ****************************************************************************/ + + int Agetchar() + { + extern int optind; /* current argv[] element under study */ + static int AgetMode = 0; /* >= 0 for displacement into argv[n], <0 EOF */ + char *arg; /* pointer to active character */ + int c; /* current character */ + + if ( ! cmdinput ) /* is -A active? */ + return( getchar() ); /* no: return stdin character */ + + if ( AgetMode < 0 || optind >= Myargc ) /* EOF is sticky: */ + return( EOF ); /* **ensure it now and forever more */ + + /* find next character */ + arg = Myargv[optind]; /* pointer to active arg */ + c = arg[AgetMode++]&0xFF; /* get appropriate char of arg */ + + if ( ! c ) /* at '\0' that terminates word? */ + { /* at end of word: return ' ' if normal word, '\n' if empty */ + c = ' '; /* suppose normal word and return blank */ + if ( AgetMode == 1 ) /* if ran out in very 1st char, force \n */ + c = '\n'; /* (allows "hello '' world" to do \n at '') */ + AgetMode = 0; /* return to char 0 in NEXT word */ + if ( ++optind >= Myargc ) /* run up word count and check if at "EOF" */ + { /* just ran out of arguments */ + c = EOF; /* return EOF */ + AgetMode = -1; /* ensure all future returns return EOF */ + } + } + + return( c ); /* return appropriate character */ + + } /* end: Agetchar() */ + + + /**************************************************************************** + + iso2022 + + Called by getinchr. Interprets ISO 2022 sequences + + ******************************************************************************/ + + inchr iso2022() + { + inchr ch; + inchr ch2; + int save_gl; + int save_gr; + + ch = Agetchar(); + if (ch == EOF) return ch; + if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */ + if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */ + switch (ch) { + case 14: /* invoke G1 into GL */ + gl = 1; + return iso2022(); + case 15: /* invoke G0 into GL */ + gl = 0; + return iso2022(); + case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */ + save_gl = gl; save_gr = gr; + gl = gr = 2; + ch = iso2022(); + gl = save_gl; gr = save_gr; + return ch; + case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */ + save_gl = gl; save_gr = gr; + gl = gr = 3; + ch = iso2022(); + gl = save_gl; gr = save_gr; + return ch; + case 'n' + 0x100: /* invoke G2 into GL */ + gl = 2; + return iso2022(); + case 'o' + 0x100: /* invoke G3 into GL */ + gl = 3; + return iso2022(); + case '~' + 0x100: /* invoke G1 into GR */ + gr = 1; + return iso2022(); + case '}' + 0x100: /* invoke G2 into GR */ + gr = 2; + return iso2022(); + case '|' + 0x100: /* invoke G3 into GR */ + gr = 3; + return iso2022(); + case '(' + 0x100: /* set G0 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; /* ASCII */ + gn[0] = ch << 16; + gndbl[0] = 0; + return iso2022(); + case ')' + 0x100: /* set G1 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; + gn[1] = ch << 16; + gndbl[1] = 0; + return iso2022(); + case '*' + 0x100: /* set G2 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; + gn[2] = ch << 16; + gndbl[2] = 0; + return iso2022(); + case '+' + 0x100: /* set G3 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; + gn[3] = ch << 16; + gndbl[3] = 0; + return iso2022(); + case '-' + 0x100: /* set G1 to 96-char set */ + ch = Agetchar(); + if (ch == 'A') ch = 0; /* Latin-1 top half */ + gn[1] = (ch << 16) | 0x80; + gndbl[1] = 0; + return iso2022(); + case '.' + 0x100: /* set G2 to 96-char set */ + ch = Agetchar(); + if (ch == 'A') ch = 0; + gn[2] = (ch << 16) | 0x80; + gndbl[2] = 0; + return iso2022(); + case '/' + 0x100: /* set G3 to 96-char set */ + ch = Agetchar(); + if (ch == 'A') ch = 0; + gn[3] = (ch << 16) | 0x80; + gndbl[3] = 0; + return iso2022(); + case '(' + 0x200: /* set G0 to 94 x 94 char set */ + ch = Agetchar(); + gn[0] = ch << 16; + gndbl[0] = 1; + return iso2022(); + case ')' + 0x200: /* set G1 to 94 x 94 char set */ + ch = Agetchar(); + gn[1] = ch << 16; + gndbl[1] = 1; + return iso2022(); + case '*' + 0x200: /* set G2 to 94 x 94 char set */ + ch = Agetchar(); + gn[2] = ch << 16; + gndbl[2] = 1; + return iso2022(); + case '+' + 0x200: /* set G3 to 94 x 94 char set */ + ch = Agetchar(); + gn[3] = ch << 16; + gndbl[3] = 1; + return iso2022(); + default: + if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */ + gn[0] = (ch & ~0x200) << 16; + gndbl[0] = 1; + return iso2022(); + } + } + + if (ch >= 0x21 && ch <= 0x7E) { /* process GL */ + if (gndbl[gl]) { + ch2 = Agetchar(); + return gn[gl] | (ch << 8) | ch2; + } + else return gn[gl] | ch; + } + else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */ + if (gndbl[gr]) { + ch2 = Agetchar(); + return gn[gr] | (ch << 8) | ch2; + } + else return gn[gr] | (ch & ~0x80); + } + else return ch; + } + + /**************************************************************************** + + ungetinchr + + Called by main. Pushes back an "inchr" to be read by getinchr + on the next call. + + ******************************************************************************/ + inchr getinchr_buffer; + int getinchr_flag; + + inchr ungetinchr(c) + inchr c; + { + getinchr_buffer = c; + getinchr_flag = 1; + return c; + } + + /***************************************************************************** + + getinchr + + Called by main. Processes multibyte characters. Invokes Agetchar. + If multibyte = 0, ISO 2022 mode (see iso2022 routine). + If multibyte = 1, double-byte mode (0x00-0x7f bytes are characters, + 0x80-0xFF bytes are first byte of a double-byte character). + If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters, + 0x80-0xBF bytes are nonfirst byte of a multibyte character, + 0xC0-0xFD bytes are first byte of a multibyte character, + 0xFE-0xFF bytes are errors (all errors return code 0x0080)). + If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it, + "~~" is a tilde, "~x" for all other x is ignored). + If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte + of a double-byte character, all other bytes are characters). + + + *****************************************************************************/ + + inchr getinchr() + { + int ch, ch2, ch3, ch4, ch5, ch6; + + if (getinchr_flag) { + getinchr_flag = 0; + return getinchr_buffer; + } + + switch(multibyte) { + case 0: /* single-byte */ + return iso2022(); + case 1: /* DBCS */ + ch = Agetchar(); + if ((ch >= 0x80 && ch <= 0x9F) || + (ch >= 0xE0 && ch <= 0xEF)) { + ch = (ch << 8) + Agetchar(); + } + return ch; + case 2: /* UTF-8 */ + ch = Agetchar(); + if (ch < 0x80) return ch; /* handles EOF, too */ + if (ch < 0xC0 || ch > 0xFD) + return 0x0080; /* illegal first character */ + ch2 = Agetchar() & 0x3F; + if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2; + ch3 = Agetchar() & 0x3F; + if (ch < 0xF0) + return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3; + ch4 = Agetchar() & 0x3F; + if (ch < 0xF8) + return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4; + ch5 = Agetchar() & 0x3F; + if (ch < 0xFC) + return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) + + (ch4 << 6) + ch5; + ch6 = Agetchar() & 0x3F; + return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) + + (ch4 << 12) + (ch5 << 6) + ch6; + case 3: /* HZ */ + ch = Agetchar(); + if (ch == EOF) return ch; + if (hzmode) { + ch = (ch << 8) + Agetchar(); + if (ch == ('}' << 8) + '~') { + hzmode = 0; + return getinchr(); + } + return ch; + } + else if (ch == '~') { + ch = Agetchar(); + if (ch == '{') { + hzmode = 1; + return getinchr(); + } + else if (ch == '~') { + return ch; + } + else { + return getinchr(); + } + } + else return ch; + case 4: /* Shift-JIS */ + ch = Agetchar(); + if ((ch >= 0x80 && ch <= 0x9F) || + (ch >= 0xE0 && ch <= 0xEF)) { + ch = (ch << 8) + Agetchar(); + } + return ch; + default: + return 0x80; + } + } + + void fig_init(argc, argv) + int argc; + char** argv; + { + Myargc = argc; + Myargv = argv; + + if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) { + myname++; + } + else { + myname = Myargv[0]; + } + fontdirname = DEFAULTFONTDIR; + fontname = DEFAULTFONTFILE; + cfilelist = NULL; + cfilelistend = &cfilelist; + commandlist = NULL; + commandlistend = &commandlist; + smushoverride = SMO_NO; + deutschflag = 0; + justification = -1; + right2left = -1; + paragraphflag = 0; + cmdinput = 0; + outputwidth = DEFAULTCOLUMNS; + gn[1] = 0x80; + gr = 1; + outlinelenlimit = outputwidth-1; + } + + void f(c) + const inchr c; + { + int i; + int char_not_added; + static int wordbreakmode = 0; + + do { + char_not_added = 0; + + if (wordbreakmode== -1) { + if (c==' ') { + break; + } + else if (c=='\n') { + wordbreakmode = 0; + break; + } + wordbreakmode = 0; + } + + if (c=='\n') { + printline(); + wordbreakmode = 0; + } + + else if (addchar(c)) { + if (c!=' ') { + wordbreakmode = (wordbreakmode>=2)?3:1; + } + else { + wordbreakmode = (wordbreakmode>0)?2:0; + } + } + + else if (outlinelen==0) { for (i=0;i<charheight;i++) { if (right2left && outputwidth>1) { putstring(currchar[i]+STRLEN(currchar[i])-outlinelenlimit); @@ -2069,8 +2078,14 @@ inchr c; } } while (char_not_added); - - if (outlinelen!=0) { - printline(); - } +} + +void fs(string) +char* string; +{ + char* str_ptr = string; + while(*str_ptr!=0){ + f(*str_ptr); + ++str_ptr; + } } diff --git a/Makefile b/Makefile index e92bcaf..e3f56a4 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,8 @@ DEFAULTFONTFILE = standard VERSION = 2.2.5 DIST = figlet-$(VERSION) -OBJS = figlet.o zipio.o crc.o inflate.o utf8.o +LIBOBJS = zipio.o crc.o inflate.o utf8.o +OBJS = $(LIBOBJS) figlet.o BINS = figlet chkfont figlist showfigfonts MANUAL = figlet.6 chkfont.6 figlist.6 showfigfonts.6 DFILES = Makefile Makefile.tc $(MANUAL) $(OBJS:.o=.c) chkfont.c getopt.c \ @@ -70,6 +71,11 @@ all: $(BINS) figlet: $(OBJS) $(LD) $(LDFLAGS) -o $@ $(OBJS) +figlib: $(LIBOBJS) + $(CC) -shared -o libfiglib.so $(LIBOBJS) + $(CC) $(CFLAGS) $(LDFLAGS) -I /home/anon/Swap/figlet/ -L /home/anon/Swap/figlet/ \ + tests/FIGlib.c -o FIGlib-test -lfiglib + chkfont: chkfont.o $(LD) $(LDFLAGS) -o $@ chkfont.o diff --git a/figlet.c b/figlet.c index 537c201..e26c207 100644 --- a/figlet.c +++ b/figlet.c @@ -16,11 +16,9 @@ int argc; char *argv[]; { inchr c,c2; - int i; int last_was_eol_flag; - Myargc = argc; - Myargv = argv; + fig_init(argc, argv); getparams(); readcontrolfiles(); readfont(); @@ -58,7 +56,11 @@ char *argv[]; if ((c>'\0' && c<' ' && c!='\n') || c==127) continue; f(c); - } + + if (outlinelen!=0) { + printline(); + } + return 0; } diff --git a/libfiglib.so b/libfiglib.so new file mode 100755 index 0000000000000000000000000000000000000000..872ada18d3dd0593dd88225585d8872c6d9fa369 GIT binary patch literal 65176 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 literal 0 HcmV?d00001 diff --git a/tests/FIGlib.c b/tests/FIGlib.c index 01bcb28..7fc6471 100644 --- a/tests/FIGlib.c +++ b/tests/FIGlib.c @@ -7,8 +7,14 @@ char *argv[]; { //fontinfo fi; //readfont(&fi); + fig_init(); + fontdirname = "fonts/"; + readcontrolfiles(); readfont(); - inchrline = "test"; + linealloc(); + fs("Hello "); + fs("World!"); + printline(); return 0; }