diff options
author | James Cloos <cloos@jhcloos.com> | 2007-12-03 16:42:39 -0500 |
---|---|---|
committer | James Cloos <cloos@jhcloos.com> | 2007-12-03 16:42:39 -0500 |
commit | fb486bb1a5038912d064291b12c7aef5da3d8b63 (patch) | |
tree | ef3db03273009b15d14049cf30a586205340ab43 | |
parent | cedfe304041ecfc43cfcf2b44699efb53fc6aa5c (diff) |
Replace bdftruncate Perl script with C program
From bugzilla bug 13465ยน:
[This] is a replacement for the bdftruncate program, which removes
the only runtime dependency on Perl in modular Xorg.
1] http://bugs.freedesktop.org/show_bug.cgi?id=13465
Bug was posted by Joerg Sonnenberger <joerg@NetBSD.org>.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Makefile.am | 9 | ||||
-rw-r--r-- | bdftruncate.c | 222 | ||||
-rw-r--r-- | bdftruncate.pl | 77 |
4 files changed, 232 insertions, 84 deletions
@@ -1,3 +1,11 @@ +2007-12-03 James Cloos <cloos@jhcloos.com> + + * Makefile.am: + * bdftruncate.pl: + * bdftruncate.c: + Bug #13465: Replace bdftruncate.pl with bdftruncate.c + (Joerg Sonnenberger). + 2006-05-15 Adam Jackson <ajax@freedesktop.org> * configure.ac: diff --git a/Makefile.am b/Makefile.am index d9d581b..aef7fa9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,14 +19,10 @@ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -bin_PROGRAMS = ucs2any -bin_SCRIPTS = bdftruncate +bin_PROGRAMS = bdftruncate ucs2any ucs2any_SOURCES = ucs2any.c - -bdftruncate: $(top_srcdir)/bdftruncate.pl - @rm -f $@ - cp $(top_srcdir)/bdftruncate.pl $@ +bdftruncate_SOURCES = bdftruncate.c aclocaldir = $(datadir)/aclocal aclocal_DATA = fontutil.m4 @@ -63,7 +59,6 @@ CLEANFILES = bdftruncate $(appman_DATA) EXTRA_DIST = $(mapfiles_DATA) \ $(appman_PRE) \ autogen.sh \ - bdftruncate.pl \ fontutil.pc.in \ $(aclocal_DATA) diff --git a/bdftruncate.c b/bdftruncate.c new file mode 100644 index 0000000..9bb204b --- /dev/null +++ b/bdftruncate.c @@ -0,0 +1,222 @@ +/*- + * Copyright (c) 2006 Martin Husemann. + * Copyright (c) 2007 Joerg Sonnenberger. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This program is derived (in a straight forward way) from + * bdftruncate.pl -- Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> + * + * This utility allows you to generate from an ISO10646-1 encoded + * BDF font other ISO10646-1 BDF fonts in which all characters above + * a threshold code value are stored unencoded. + */ + +#include <ctype.h> +#include <errno.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static int iswide(unsigned int); +static void usage(void); + +static int opt_minus_w; +static int opt_plus_w; +static int removewide; +static unsigned long threshold; + +static int +parse_threshold(const char *str) +{ + int base; + char *end_ptr; + + if (!isdigit((unsigned char)*str)) + return 1; + if (str[0] == 0 && (str[1] == 'x' || str[1] == 'X')) + base = 16; + else + base = 10; + + errno = 0; + threshold = strtoul(str, &end_ptr, base); + if (errno != 0 || threshold == 0) + return 1; + return 0; +} + +static void +process_line(const char *line) +{ + if (strncmp(line, "ENCODING", 8) == 0) { + unsigned long enc; + const char *v; + + v = line + 9; + + while (*v && isspace((unsigned char)(*v))) + ++v; + enc = strtoul(v, NULL, 10); + /* XXX Check for line-ending? */ + if (enc >= threshold || (removewide && iswide(enc))) { + printf("ENCODING -1\n"); + } else { + fputs(line, stdout); + } + return; + } + if (strncmp(line, "STARTFONT", 9) == 0) { + fputs(line, stdout); + printf("COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT!\n" + "COMMENT In this version of the font file, " + "all characters >= U+%04lx are\n" + "COMMENT not encoded to keep XFontStruct small.\n", + threshold); + return; + } + if (strncmp(line, "COMMENT", 7) == 0) { + const char *v = line + 8; + + while (*v && isspace((unsigned char)(*v))) + v++; + if (strncmp(v, "$id: ", 5) == 0 || + strncmp(v, "$Id: ", 5) == 0) { + const char *id = strchr(v+1, '$'); + if (id) { + printf("COMMENT Derived from %.*s", + (int)(id - v - 4), v + 5); + return; + } + } + } + fputs(line, stdout); +} + +int +main(int argc, char **argv) +{ + int removewide; + char *line, *input_ptr; + size_t line_len, rest_len; + + --argc; + ++argv; + if (argc == 0) + usage(); + + if (strcmp(*argv, "-w") == 0 || strcmp(*argv, "+w") == 0) { + if (**argv == '-') + opt_minus_w = 1; + else + opt_plus_w = 1; + --argc; + ++argv; + } + + if (argc != 1 || (opt_plus_w && opt_minus_w)) + usage(); + if (parse_threshold(*argv)) { + fprintf(stderr, "Illegal threshold %s", *argv); + usage(); + } + + if (opt_minus_w) + removewide = 1; + else if (opt_plus_w) + removewide = 0; + else + removewide = (threshold <= 0x3200); + + line_len = 1024; + if ((line = malloc(line_len)) == NULL) { + fprintf(stderr, "malloc failed"); + exit(EXIT_FAILURE); + } + + for (;;) { + if (fgets(line, line_len, stdin) == NULL) + break; + while (strlen(line) == line_len - 1 && !feof(stdin)) { + if (line_len > SSIZE_MAX) { + fprintf(stderr, "input line too large"); + exit(EXIT_FAILURE); + } + line = realloc(line, line_len * 2); + if (line == NULL) { + fprintf(stderr, "realloc failed"); + exit(EXIT_FAILURE); + } + input_ptr = line + line_len - 1; + rest_len = line_len + 1; + line_len *= 2; + if (fgets(input_ptr, rest_len, stdin) == NULL) { + /* Should not happen, but handle as EOF */ + break; + } + } + process_line(line); + } + + return EXIT_SUCCESS; +} + +/* + * Subroutine to identify whether the ISO 10646/Unicode character code + * ucs belongs into the East Asian Wide (W) or East Asian FullWidth + * (F) category as defined in Unicode Technical Report #11. + */ +static int +iswide(unsigned int ucs) +{ + return (ucs >= 0x1100 && + (ucs <= 0x115f || /* Hangul Jamo */ + (ucs >= 0x2e80 && ucs <= 0xa4cf && + (ucs & ~0x0011) != 0x300a && ucs != 0x303f) || /* CJK .. Yi */ + (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ + (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Comp. Ideographs */ + (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Comp. Forms */ + (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ + (ucs >= 0xffe0 && ucs <= 0xffe6) || + (ucs >= 0x20000 && ucs <= 0x2ffff))); +} + +static void +usage(void) +{ + fprintf(stderr, + "Usage: bdftruncate [+w|-w] threshold <source.bdf >destination.bdf\n" + "\n" + "Example:\n" + "\n" + " bdftruncate 0x3200 <6x13.bdf >6x13t.bdf\n" + "\n" + "will generate the file 6x13t.bdf in which all glyphs with codes\n" + ">= 0x3200 will only be stored unencoded (i.e., ENCODING -1).\n" + "Option -w removes East Asian Wide and East Asian FullWidth characters\n" + "(default if threshold <= 0x3200), and option +w keeps them.\n"); + exit(EXIT_FAILURE); +} diff --git a/bdftruncate.pl b/bdftruncate.pl deleted file mode 100644 index 0df06e5..0000000 --- a/bdftruncate.pl +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/perl -# -# bdftruncate.pl -- Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> -# -# This Perl script allows you to generate from an ISO10646-1 encoded -# BDF font other ISO10646-1 BDF fonts in which all characters above -# a threshold code value are stored unencoded. -# -# $ucs-fonts: bdftruncate.pl,v 1.7 2004-11-28 18:41:13+00 mgk25 Rel $ - -# Subroutine to identify whether the ISO 10646/Unicode character code -# ucs belongs into the East Asian Wide (W) or East Asian FullWidth -# (F) category as defined in Unicode Technical Report #11. -sub iswide ($) { - my $ucs = shift(@_); - - return ($ucs >= 0x1100 && - ($ucs <= 0x115f || # Hangul Jamo - ($ucs >= 0x2e80 && $ucs <= 0xa4cf && - ($ucs & ~0x0011) != 0x300a && $ucs != 0x303f) || # CJK .. Yi - ($ucs >= 0xac00 && $ucs <= 0xd7a3) || # Hangul Syllables - ($ucs >= 0xf900 && $ucs <= 0xfaff) || # CJK Comp. Ideographs - ($ucs >= 0xfe30 && $ucs <= 0xfe6f) || # CJK Comp. Forms - ($ucs >= 0xff00 && $ucs <= 0xff5f) || # Fullwidth Forms - ($ucs >= 0xffe0 && $ucs <= 0xffe6) || - ($ucs >= 0x20000 && $ucs <= 0x2ffff))); -} - -# parse options -if ($ARGV[0] eq '-w' || $ARGV[0] eq '+w') { - $removewide = $ARGV[0] eq '-w'; - shift @ARGV; -} - -print STDERR <<End if $#ARGV != 0; - -Usage: bdftruncate.pl [+w|-w] threshold <source.bdf >destination.bdf - -Example: - - bdftruncate.pl 0x3200 <6x13.bdf >6x13t.bdf - -will generate the file 6x13t.bdf in which all glyphs with codes ->= 0x3200 will only be stored unencoded (i.e., ENCODING -1). -Option -w removes East Asian Wide and East Asian FullWidth characters -(default if threshold <= 0x3200), and option +w keeps them. - -End - -exit 1 if $#ARGV != 0; - -# read threshold value from command line -$threshold = $ARGV[0]; -if ($threshold =~ /^(0[xX]|U[+-]?)([0-9a-fA-F]+)$/) { - $threshold = hex($2); -} elsif (!($threshold =~ /^[0-9]+$/)) { - die("Illegal threshold '$threshold'!\n"); -} -$removewide = $threshold <= 0x3200 unless defined $removewide; - -# filter file -while (<STDIN>) { - if (/^ENCODING\s+(-?\d+)/ && - ($1 >= $threshold || ($removewide && iswide($1)))) { - print "ENCODING -1\n"; - } elsif (/^STARTFONT/) { - print; - print "COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT!\n"; - printf("COMMENT In this version of the font file, all characters >= " . - "U+%04X are\nCOMMENT not encoded to keep XFontStruct small.\n", - $threshold); - } else { - s/^COMMENT\s+\"(.*)\"$/COMMENT $1/; - s/^COMMENT\s+\$[I]d: (.*)\$\s*$/COMMENT Derived from $1\n/; - print; - } -} |