bdftopcf.c revision fb4ebca8
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>
3529459361Smrg#include <X11/fonts/fontmisc.h>
3629459361Smrg#include <X11/fonts/fontstruct.h>
3729459361Smrg#include <X11/fonts/fntfilio.h>
3829459361Smrg#include <X11/fonts/fntfil.h>
3929459361Smrg#include <X11/fonts/bdfint.h>
4029459361Smrg#include <X11/fonts/pcf.h>
4129459361Smrg#include <stdio.h>
4229459361Smrg#include <X11/Xos.h>
4329459361Smrg
4429459361Smrgint
455dd2154eSmrgmain(int argc, char *argv[])
4629459361Smrg{
475dd2154eSmrg    FontRec font = { 0 };
485dd2154eSmrg
495dd2154eSmrg    FontFilePtr input, output;
505dd2154eSmrg
515dd2154eSmrg    char *input_name = NULL, *output_name = NULL;
5229459361Smrg
535dd2154eSmrg    char *program_name;
5429459361Smrg
555dd2154eSmrg    int bit, byte, glyph, scan;
565dd2154eSmrg
575dd2154eSmrg    FontDefaultFormat(&bit, &byte, &glyph, &scan);
5829459361Smrg    program_name = argv[0];
5929459361Smrg    argc--, argv++;
6029459361Smrg    while (argc-- > 0) {
615dd2154eSmrg        if (argv[0][0] == '-') {
625dd2154eSmrg            switch (argv[0][1]) {
635dd2154eSmrg            case 'p':
645dd2154eSmrg                switch (argv[0][2]) {
655dd2154eSmrg                case '1':
665dd2154eSmrg                case '2':
675dd2154eSmrg                case '4':
685dd2154eSmrg                case '8':
695dd2154eSmrg                    if (argv[0][3] != '\0')
705dd2154eSmrg                        goto usage;
715dd2154eSmrg                    glyph = argv[0][2] - '0';
725dd2154eSmrg                    break;
735dd2154eSmrg                default:
745dd2154eSmrg                    goto usage;
755dd2154eSmrg                }
765dd2154eSmrg                break;
775dd2154eSmrg
785dd2154eSmrg            case 'u':
795dd2154eSmrg                switch (argv[0][2]) {
805dd2154eSmrg                case '1':
815dd2154eSmrg                case '2':
825dd2154eSmrg                case '4':
835dd2154eSmrg                    if (argv[0][3] != '\0')
845dd2154eSmrg                        goto usage;
855dd2154eSmrg                    scan = argv[0][2] - '0';
865dd2154eSmrg                    break;
875dd2154eSmrg                default:
885dd2154eSmrg                    goto usage;
895dd2154eSmrg                }
905dd2154eSmrg                break;
915dd2154eSmrg
925dd2154eSmrg            case 'm':
935dd2154eSmrg                if (argv[0][2] != '\0')
945dd2154eSmrg                    goto usage;
955dd2154eSmrg                bit = MSBFirst;
965dd2154eSmrg                break;
975dd2154eSmrg
985dd2154eSmrg            case 'l':
995dd2154eSmrg                if (argv[0][2] != '\0')
1005dd2154eSmrg                    goto usage;
1015dd2154eSmrg                bit = LSBFirst;
1025dd2154eSmrg                break;
1035dd2154eSmrg
1045dd2154eSmrg            case 'M':
1055dd2154eSmrg                if (argv[0][2] != '\0')
1065dd2154eSmrg                    goto usage;
1075dd2154eSmrg                byte = MSBFirst;
1085dd2154eSmrg                break;
1095dd2154eSmrg
1105dd2154eSmrg            case 'L':
1115dd2154eSmrg                if (argv[0][2] != '\0')
1125dd2154eSmrg                    goto usage;
1135dd2154eSmrg                byte = LSBFirst;
1145dd2154eSmrg                break;
1155dd2154eSmrg
1165dd2154eSmrg            case 't':          /* attempt to make terminal fonts if possible */
1175dd2154eSmrg                if (argv[0][2] != '\0')
1185dd2154eSmrg                    goto usage;
1195dd2154eSmrg                break;
1205dd2154eSmrg
1215dd2154eSmrg            case 'i':          /* inhibit ink metric computation */
1225dd2154eSmrg                if (argv[0][2] != '\0')
1235dd2154eSmrg                    goto usage;
1245dd2154eSmrg                break;
1255dd2154eSmrg            case 'o':
1265dd2154eSmrg                if (argv[0][2])
1275dd2154eSmrg                    output_name = argv[0] + 2;
1285dd2154eSmrg                else {
1295dd2154eSmrg                    if (!argv[1])
1305dd2154eSmrg                        goto usage;
1315dd2154eSmrg                    argv++;
1325dd2154eSmrg                    argc--;
1335dd2154eSmrg                    output_name = argv[0];
1345dd2154eSmrg                }
1355dd2154eSmrg                break;
1365dd2154eSmrg
1375dd2154eSmrg            case 'v':
1385dd2154eSmrg                printf("%s\n", PACKAGE_STRING);
1395dd2154eSmrg                exit(0);
1405dd2154eSmrg
1415dd2154eSmrg            default:
1425dd2154eSmrg                goto usage;
1435dd2154eSmrg            }
1445dd2154eSmrg        }
1455dd2154eSmrg        else {
1465dd2154eSmrg            if (input_name) {
1475dd2154eSmrg usage:
148fb4ebca8Smrg                fprintf(stderr, "%s: invalid option '%s'\n",
149fb4ebca8Smrg                        program_name, argv[0]);
1505dd2154eSmrg                fprintf(stderr,
1515dd2154eSmrg                        "usage: %s [-p#] [-u#] [-m] [-l] [-M] [-L] [-t] [-i] [-o pcf file] [bdf file]\n"
1525dd2154eSmrg                        "       where # for -p is 1, 2, 4, or 8\n"
153fb4ebca8Smrg                        "       and   # for -u is 1, 2, or 4\n",
1545dd2154eSmrg                        program_name);
1555dd2154eSmrg                exit(1);
1565dd2154eSmrg            }
1575dd2154eSmrg            input_name = argv[0];
1585dd2154eSmrg        }
1595dd2154eSmrg        argv++;
16029459361Smrg    }
1615dd2154eSmrg    if (input_name) {
1625dd2154eSmrg        input = FontFileOpen(input_name);
1635dd2154eSmrg        if (!input) {
1645dd2154eSmrg            fprintf(stderr, "%s: can't open bdf source file %s\n",
1655dd2154eSmrg                    program_name, input_name);
1665dd2154eSmrg            exit(1);
1675dd2154eSmrg        }
16829459361Smrg    }
16929459361Smrg    else
1705dd2154eSmrg        input = FontFileOpenFd(STDIN_FILENO);
1715dd2154eSmrg    if (bdfReadFont(&font, input, bit, byte, glyph, scan) != Successful) {
1725dd2154eSmrg        fprintf(stderr, "%s: bdf input, %s, corrupt\n",
1735dd2154eSmrg                program_name, input_name ? input_name : "<stdin>");
1745dd2154eSmrg        exit(1);
1755dd2154eSmrg    }
1765dd2154eSmrg    if (output_name) {
1775dd2154eSmrg        output = FontFileOpenWrite(output_name);
1785dd2154eSmrg        if (!output) {
1795dd2154eSmrg            fprintf(stderr, "%s: can't open pcf sink file %s\n",
1805dd2154eSmrg                    program_name, output_name);
1815dd2154eSmrg            exit(1);
1825dd2154eSmrg        }
18329459361Smrg    }
18429459361Smrg    else
1855dd2154eSmrg        output = FontFileOpenWriteFd(STDOUT_FILENO);
1865dd2154eSmrg    if (pcfWriteFont(&font, output) != Successful) {
1875dd2154eSmrg        fprintf(stderr, "%s: can't write pcf file %s\n",
1885dd2154eSmrg                program_name, output_name ? output_name : "<stdout>");
1895dd2154eSmrg        if (output_name)
1905dd2154eSmrg            remove(output_name);
1915dd2154eSmrg        exit(1);
19229459361Smrg    }
19329459361Smrg    else
1945dd2154eSmrg        FontFileClose(output);
19529459361Smrg    return (0);
19629459361Smrg}
197