diff options
Diffstat (limited to 'Build/source/texk/web2c/mpdir/writeenc.c')
-rw-r--r-- | Build/source/texk/web2c/mpdir/writeenc.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mpdir/writeenc.c b/Build/source/texk/web2c/mpdir/writeenc.c new file mode 100644 index 00000000000..30673cd6aa3 --- /dev/null +++ b/Build/source/texk/web2c/mpdir/writeenc.c @@ -0,0 +1,142 @@ +/* Copyright (c) 2006 Taco Hoekwater <taco@elvenkind.com> + +This file is part of MetaPost. + +MetaPost is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +MetaPost is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with MetaPost; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +$Id $ +*/ + +#include "mplib.h" + +/*@unused@*/ +static const char perforce_id[] = + "$Id: writeenc.c,v 1.3 2005/12/26 14:20:13 hahe Exp hahe $"; + +void read_enc (enc_entry * e) +{ + assert (e != NULL); + if (e->loaded) + return; + e->encname = NULL; + load_enc (e->name, &e->encname, e->glyph_names); + e->loaded = true; +} + +/* write_enc is used to write either external encoding (given in map file) or + * internal encoding (read from the font file); when glyph_names is NULL + * the 2nd argument is a pointer to the encoding entry; otherwise the 3rd is + * the object number of the Encoding object + */ +void write_enc (char **glyph_names, enc_entry * e, integer eobjnum) +{ + boolean is_notdef; + int i; + int s; + int foffset; + char **g; + if (glyph_names == NULL) { + assert (e != NULL); + if (e->objnum != 0) /* the encoding has been written already */ + return; + e->objnum = 1; + g = e->glyph_names; + } else { + g = glyph_names; + } + pdf_printf("\n%%%%BeginResource: encoding %s",e->encname); + pdf_printf ("\n/%s [ ", e->encname); + foffset = strlen(e->name)+3; + for (i = 0; i < 256; i++) { + s = strlen(g[i]); + if (s+1+foffset>=80) { + pdf_printf ("\n"); + foffset = 0; + } + foffset += s+2; + pdf_printf ("/%s ", g[i]); + } + if (foffset>75) + pdf_printf ("\n"); + pdf_puts ("] def\n"); + pdf_printf("%%%%EndResource"); +} + +/**********************************************************************/ +/* All encoding entries go into AVL tree for fast search by name. */ + +struct avl_table *enc_tree = NULL; + +/* AVL sort enc_entry into enc_tree by name */ + +static int comp_enc_entry (const void *pa, const void *pb, void *p) +{ + return strcmp (((const enc_entry *) pa)->name, + ((const enc_entry *) pb)->name); +} + +enc_entry *add_enc (char *s) +{ + int i; + enc_entry tmp, *p; + void **aa; + + assert (s != NULL); + if (enc_tree == NULL) { + enc_tree = avl_create (comp_enc_entry, NULL, &avl_xallocator); + assert (enc_tree != NULL); + } + tmp.name = s; + p = (enc_entry *) avl_find (enc_tree, &tmp); + if (p != NULL) /* encoding already registered */ + return p; + p = xtalloc (1, enc_entry); + p->loaded = false; + p->name = xstrdup (s); + p->objnum = 0; + p->tounicode = 0; + p->glyph_names = xtalloc (256, char *); + for (i = 0; i < 256; i++) + p->glyph_names[i] = (char *) notdef; + aa = avl_probe (enc_tree, p); + assert (aa != NULL); + return p; +} + +/**********************************************************************/ +/* cleaning up... */ + +static void destroy_enc_entry (void *pa, void *pb) +{ + enc_entry *p; + int i; + + p = (enc_entry *) pa; + xfree (p->name); + if (p->glyph_names != NULL) + for (i = 0; i < 256; i++) + if (p->glyph_names[i] != notdef) + xfree (p->glyph_names[i]); + xfree (p->glyph_names); + xfree (p); +} + +void enc_free () +{ + if (enc_tree != NULL) + avl_destroy (enc_tree, destroy_enc_entry); +} + +/**********************************************************************/ |