129459361Smrg/*
229459361Smrg
329459361SmrgCopyright 1991, 1993, 1998  The Open Group
429459361Smrg
529459361SmrgPermission to use, copy, modify, distribute, and sell this software and its
629459361Smrgdocumentation for any purpose is hereby granted without fee, provided that
729459361Smrgthe above copyright notice appear in all copies and that both that
829459361Smrgcopyright notice and this permission notice appear in supporting
929459361Smrgdocumentation.
1029459361Smrg
1129459361SmrgThe above copyright notice and this permission notice shall be included
1229459361Smrgin all copies or substantial portions of the Software.
1329459361Smrg
1429459361SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1529459361SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1629459361SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
1729459361SmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
1829459361SmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1929459361SmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2029459361SmrgOTHER DEALINGS IN THE SOFTWARE.
2129459361Smrg
2229459361SmrgExcept as contained in this notice, the name of The Open Group shall
2329459361Smrgnot be used in advertising or otherwise to promote the sale, use or
2429459361Smrgother dealings in this Software without prior written authorization
2529459361Smrgfrom The Open Group.
2629459361Smrg
2729459361Smrg*/
2829459361Smrg
295dd2154eSmrg#ifdef HAVE_CONFIG_H
305dd2154eSmrg# include "config.h"
315dd2154eSmrg#endif
325dd2154eSmrg
3329459361Smrg#include <X11/X.h>
3429459361Smrg#include <X11/Xproto.h>
35fa2b3b63Smrg#include "fontmisc.h"
3629459361Smrg#include <X11/fonts/fontstruct.h>
37fa2b3b63Smrg#include "fntfilio.h"
38fa2b3b63Smrg#include "fntfil.h"
39fa2b3b63Smrg#include "bdfint.h"
40fa2b3b63Smrg#include "pcf.h"
4129459361Smrg#include <stdio.h>
4229459361Smrg#include <X11/Xos.h>
4329459361Smrg
4429459361Smrgint
455dd2154eSmrgmain(int argc, char *argv[])
4629459361Smrg{
475dd2154eSmrg    FontRec font = { 0 };
485dd2154eSmrg    FontFilePtr input, output;
495dd2154eSmrg    char *input_name = NULL, *output_name = NULL;
505dd2154eSmrg    char *program_name;
515dd2154eSmrg    int bit, byte, glyph, scan;
525dd2154eSmrg
535dd2154eSmrg    FontDefaultFormat(&bit, &byte, &glyph, &scan);
5429459361Smrg    program_name = argv[0];
5529459361Smrg    argc--, argv++;
5629459361Smrg    while (argc-- > 0) {
575dd2154eSmrg        if (argv[0][0] == '-') {
585dd2154eSmrg            switch (argv[0][1]) {
595dd2154eSmrg            case 'p':
605dd2154eSmrg                switch (argv[0][2]) {
615dd2154eSmrg                case '1':
625dd2154eSmrg                case '2':
635dd2154eSmrg                case '4':
645dd2154eSmrg                case '8':
655dd2154eSmrg                    if (argv[0][3] != '\0')
665dd2154eSmrg                        goto usage;
675dd2154eSmrg                    glyph = argv[0][2] - '0';
685dd2154eSmrg                    break;
695dd2154eSmrg                default:
705dd2154eSmrg                    goto usage;
715dd2154eSmrg                }
725dd2154eSmrg                break;
735dd2154eSmrg
745dd2154eSmrg            case 'u':
755dd2154eSmrg                switch (argv[0][2]) {
765dd2154eSmrg                case '1':
775dd2154eSmrg                case '2':
785dd2154eSmrg                case '4':
795dd2154eSmrg                    if (argv[0][3] != '\0')
805dd2154eSmrg                        goto usage;
815dd2154eSmrg                    scan = argv[0][2] - '0';
825dd2154eSmrg                    break;
835dd2154eSmrg                default:
845dd2154eSmrg                    goto usage;
855dd2154eSmrg                }
865dd2154eSmrg                break;
875dd2154eSmrg
885dd2154eSmrg            case 'm':
895dd2154eSmrg                if (argv[0][2] != '\0')
905dd2154eSmrg                    goto usage;
915dd2154eSmrg                bit = MSBFirst;
925dd2154eSmrg                break;
935dd2154eSmrg
945dd2154eSmrg            case 'l':
955dd2154eSmrg                if (argv[0][2] != '\0')
965dd2154eSmrg                    goto usage;
975dd2154eSmrg                bit = LSBFirst;
985dd2154eSmrg                break;
995dd2154eSmrg
1005dd2154eSmrg            case 'M':
1015dd2154eSmrg                if (argv[0][2] != '\0')
1025dd2154eSmrg                    goto usage;
1035dd2154eSmrg                byte = MSBFirst;
1045dd2154eSmrg                break;
1055dd2154eSmrg
1065dd2154eSmrg            case 'L':
1075dd2154eSmrg                if (argv[0][2] != '\0')
1085dd2154eSmrg                    goto usage;
1095dd2154eSmrg                byte = LSBFirst;
1105dd2154eSmrg                break;
1115dd2154eSmrg
1125dd2154eSmrg            case 't':          /* attempt to make terminal fonts if possible */
1135dd2154eSmrg                if (argv[0][2] != '\0')
1145dd2154eSmrg                    goto usage;
1155dd2154eSmrg                break;
1165dd2154eSmrg
1175dd2154eSmrg            case 'i':          /* inhibit ink metric computation */
1185dd2154eSmrg                if (argv[0][2] != '\0')
1195dd2154eSmrg                    goto usage;
1205dd2154eSmrg                break;
1215dd2154eSmrg            case 'o':
1225dd2154eSmrg                if (argv[0][2])
1235dd2154eSmrg                    output_name = argv[0] + 2;
1245dd2154eSmrg                else {
1255dd2154eSmrg                    if (!argv[1])
1265dd2154eSmrg                        goto usage;
1275dd2154eSmrg                    argv++;
1285dd2154eSmrg                    argc--;
1295dd2154eSmrg                    output_name = argv[0];
1305dd2154eSmrg                }
1315dd2154eSmrg                break;
1325dd2154eSmrg
1335dd2154eSmrg            case 'v':
1345dd2154eSmrg                printf("%s\n", PACKAGE_STRING);
1355dd2154eSmrg                exit(0);
1365dd2154eSmrg
1375dd2154eSmrg            default:
1385dd2154eSmrg                goto usage;
1395dd2154eSmrg            }
1405dd2154eSmrg        }
1415dd2154eSmrg        else {
1425dd2154eSmrg            if (input_name) {
1435dd2154eSmrg usage:
144fb4ebca8Smrg                fprintf(stderr, "%s: invalid option '%s'\n",
145fb4ebca8Smrg                        program_name, argv[0]);
1465dd2154eSmrg                fprintf(stderr,
1475dd2154eSmrg                        "usage: %s [-p#] [-u#] [-m] [-l] [-M] [-L] [-t] [-i] [-o pcf file] [bdf file]\n"
1485dd2154eSmrg                        "       where # for -p is 1, 2, 4, or 8\n"
149fb4ebca8Smrg                        "       and   # for -u is 1, 2, or 4\n",
1505dd2154eSmrg                        program_name);
1515dd2154eSmrg                exit(1);
1525dd2154eSmrg            }
1535dd2154eSmrg            input_name = argv[0];
1545dd2154eSmrg        }
1555dd2154eSmrg        argv++;
15629459361Smrg    }
1575dd2154eSmrg    if (input_name) {
1585dd2154eSmrg        input = FontFileOpen(input_name);
1595dd2154eSmrg        if (!input) {
1605dd2154eSmrg            fprintf(stderr, "%s: can't open bdf source file %s\n",
1615dd2154eSmrg                    program_name, input_name);
1625dd2154eSmrg            exit(1);
1635dd2154eSmrg        }
16429459361Smrg    }
16529459361Smrg    else
1665dd2154eSmrg        input = FontFileOpenFd(STDIN_FILENO);
1675dd2154eSmrg    if (bdfReadFont(&font, input, bit, byte, glyph, scan) != Successful) {
1685dd2154eSmrg        fprintf(stderr, "%s: bdf input, %s, corrupt\n",
1695dd2154eSmrg                program_name, input_name ? input_name : "<stdin>");
1705dd2154eSmrg        exit(1);
1715dd2154eSmrg    }
1725dd2154eSmrg    if (output_name) {
1735dd2154eSmrg        output = FontFileOpenWrite(output_name);
1745dd2154eSmrg        if (!output) {
1755dd2154eSmrg            fprintf(stderr, "%s: can't open pcf sink file %s\n",
1765dd2154eSmrg                    program_name, output_name);
1775dd2154eSmrg            exit(1);
1785dd2154eSmrg        }
17929459361Smrg    }
18029459361Smrg    else
1815dd2154eSmrg        output = FontFileOpenWriteFd(STDOUT_FILENO);
1825dd2154eSmrg    if (pcfWriteFont(&font, output) != Successful) {
1835dd2154eSmrg        fprintf(stderr, "%s: can't write pcf file %s\n",
1845dd2154eSmrg                program_name, output_name ? output_name : "<stdout>");
1855dd2154eSmrg        if (output_name)
1865dd2154eSmrg            remove(output_name);
1875dd2154eSmrg        exit(1);
18829459361Smrg    }
18929459361Smrg    else
1905dd2154eSmrg        FontFileClose(output);
19129459361Smrg    return (0);
19229459361Smrg}
193