From cec6ffd6de4cbb204f963100914f4e8b306015d7 Mon Sep 17 00:00:00 2001 From: anon <anon@anon.anon> Date: Tue, 14 Mar 2023 21:12:15 +0100 Subject: [PATCH] working demo --- FIGlib-test | Bin 87952 -> 79064 bytes FIGlib.h | 3547 +++++++++++++++++++++++------------------------- figlet.c | 205 ++- tests/FIGlib.c | 10 +- 4 files changed, 1881 insertions(+), 1881 deletions(-) diff --git a/FIGlib-test b/FIGlib-test index 2aa363b04f771f9e345316a10122d8e5af2130f3..65bfdd27bf12273cfc2bc11c461b492f8e99036b 100755 GIT binary patch literal 79064 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 UCwF~1`d@!RW3EplNQ*lE4PH=W2LJ#7 literal 87952 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	g_$W!LK=p2>}j+K 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 Jfshe({y!Xa)mZ=l diff --git a/FIGlib.h b/FIGlib.h index 098d132..61e7449 100644 --- a/FIGlib.h +++ b/FIGlib.h @@ -170,1922 +170,1721 @@ outchr **outputline; /* Alloc'd char outputline[charheight][outlinelenlimit+1] 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 - /**************************************************************************** +/**************************************************************************** - get_columns + myalloc - 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 + Calls malloc. If malloc returns error, prints error message and + quits. - ****************************************************************************/ +****************************************************************************/ - int get_columns() - { - struct winsize ws; - int fd,result; +#ifdef __STDC__ +char *myalloc(size_t size) +#else +char *myalloc(size) +int size; +#endif +{ + char *ptr; +#ifndef __STDC__ + extern void *malloc(); +#endif - if ((fd = open("/dev/tty",O_WRONLY))<0) return -1; - result = ioctl(fd,TIOCGWINSZ,&ws); - close(fd); - return result?-1:ws.ws_col; + if ((ptr = (char*)malloc(size))==NULL) { + fprintf(stderr,"%s: Out of memory\n",myname); + exit(1); } - #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; - } + 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; - - 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); - } - else { - putstring(currchar[i]); - } - } - wordbreakmode = -1; - } - - else if (c==' ') { - if (wordbreakmode==2) { - splitline(); - } - else { - printline(); - } - wordbreakmode = -1; - } - - else { - if (wordbreakmode>=2) { - splitline(); - } - else { - printline(); - } - wordbreakmode = (wordbreakmode==3)?1:0; - char_not_added = 1; - } - - } while (char_not_added); } -void fs(string) + +/**************************************************************************** + + 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; +} + + +/**************************************************************************** + + 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'); +} + + +/**************************************************************************** + + fig_flush + + Prints outputline using putstring, then clears the current line. + +****************************************************************************/ + +void fig_flush() +{ + 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 + fig_flush. 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]); + } + fig_flush(); + 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 fig_putchar(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') { + fig_flush(); + 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); + } + else { + putstring(currchar[i]); + } + } + wordbreakmode = -1; + } + + else if (c==' ') { + if (wordbreakmode==2) { + splitline(); + } + else { + fig_flush(); + } + wordbreakmode = -1; + } + + else { + if (wordbreakmode>=2) { + splitline(); + } + else { + fig_flush(); + } + wordbreakmode = (wordbreakmode==3)?1:0; + char_not_added = 1; + } + + } while (char_not_added); +} + +void fig_puts(string) char* string; { char* str_ptr = string; while(*str_ptr!=0){ - f(*str_ptr); + fig_putchar(handlemapping(*str_ptr)); ++str_ptr; } } diff --git a/figlet.c b/figlet.c index e26c207..c44c461 100644 --- a/figlet.c +++ b/figlet.c @@ -1,5 +1,206 @@ #include "FIGlib.h" +#ifdef TIOCGWINSZ +/**************************************************************************** + + 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 + +****************************************************************************/ + +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 */ + + +/**************************************************************************** + + 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); + } +} + + /**************************************************************************** main @@ -55,11 +256,11 @@ char *argv[]; if ((c>'\0' && c<' ' && c!='\n') || c==127) continue; - f(c); + fig_puts(c); } if (outlinelen!=0) { - printline(); + fig_flush(); } return 0; diff --git a/tests/FIGlib.c b/tests/FIGlib.c index 7fc6471..612b507 100644 --- a/tests/FIGlib.c +++ b/tests/FIGlib.c @@ -5,16 +5,16 @@ int main(argc,argv) int argc; char *argv[]; { - //fontinfo fi; - //readfont(&fi); fig_init(); fontdirname = "fonts/"; + fontname = "small"; readcontrolfiles(); readfont(); linealloc(); - fs("Hello "); - fs("World!"); - printline(); + fig_puts("Hello "); + linealloc(); + fig_puts("World!"); + fig_flush(); return 0; }