summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/font/mapfile.c
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/texk/web2c/luatexdir/font/mapfile.c
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/font/mapfile.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/font/mapfile.c773
1 files changed, 0 insertions, 773 deletions
diff --git a/Build/source/texk/web2c/luatexdir/font/mapfile.c b/Build/source/texk/web2c/luatexdir/font/mapfile.c
deleted file mode 100644
index 7b661640403..00000000000
--- a/Build/source/texk/web2c/luatexdir/font/mapfile.c
+++ /dev/null
@@ -1,773 +0,0 @@
-/*
-
-Copyright 1996-2006 Han The Thanh <thanh@pdftex.org>
-Copyright 2006-2010 Taco Hoekwater <taco@luatex.org>
-
-This file is part of LuaTeX.
-
-LuaTeX 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.
-
-LuaTeX 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 Lesser General Public
-License for more details.
-
-You should have received a copy of the GNU General Public License along
-with LuaTeX; if not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "ptexlib.h"
-#include <math.h>
-#include <kpathsea/c-auto.h>
-#include <kpathsea/c-memstr.h>
-#include <string.h>
-
-#define FM_BUF_SIZE 1024
-
-static FILE *fm_file;
-
-static unsigned char *fm_buffer = NULL;
-static int fm_size = 0;
-static int fm_curbyte = 0;
-
-#define fm_open(a) (fm_file = fopen((char *)(a), FOPEN_RBIN_MODE))
-#define fm_read_file() readbinfile(fm_file,&fm_buffer,&fm_size)
-#define fm_close() xfclose(fm_file, cur_file_name)
-#define fm_getchar() fm_buffer[fm_curbyte++]
-#define fm_eof() (fm_curbyte>fm_size)
-#define is_cfg_comment(c) (c == 10 || c == '*' || c == '#' || c == ';' || c == '%')
-
-typedef enum { FM_DUPIGNORE, FM_REPLACE, FM_DELETE } updatemode;
-
-typedef struct mitem {
- /*tex |FM_DUPIGNORE| or |FM_REPLACE| or |FM_DELETE| */
- updatemode mode;
- /*tex map file or map line */
- maptype type;
- /*tex pointer to map file name or map line */
- char *line;
- /*tex line number in map file */
- int lineno;
-} mapitem;
-
-mapitem *mitem = NULL;
-
-#define read_field(r, q, buf) do { \
- q = buf; \
- while (*r != ' ' && *r != '<' && *r != '"' && *r != '\0') \
- *q++ = *r++; \
- *q = '\0'; \
- skip_char(r, ' '); \
-} while (0)
-
-#define set_field(F) do { \
- if (q > buf) \
- fm->F = xstrdup(buf); \
- if (*r == '\0') \
- goto done; \
-} while (0)
-
-fm_entry *new_fm_entry(void)
-{
- fm_entry *fm;
- fm = xtalloc(1, fm_entry);
- fm->tfm_name = NULL;
- fm->ps_name = NULL;
- fm->fd_flags = FD_FLAGS_NOT_SET_IN_MAPLINE;
- fm->ff_name = NULL;
- fm->encname = NULL;
- fm->subfont = 0;
- fm->type = 0;
- fm->slant = 0;
- fm->extend = 1000;
- unset_slantset(fm);
- unset_extendset(fm);
- unset_inuse(fm);
- return fm;
-}
-
-void delete_fm_entry(fm_entry * fm)
-{
- xfree(fm->tfm_name);
- xfree(fm->ps_name);
- xfree(fm->ff_name);
- xfree(fm);
-}
-
-static ff_entry *new_ff_entry(void)
-{
- ff_entry *ff;
- ff = xtalloc(1, ff_entry);
- ff->ff_name = NULL;
- ff->ff_path = NULL;
- return ff;
-}
-
-static void delete_ff_entry(ff_entry * ff)
-{
- xfree(ff->ff_name);
- xfree(ff->ff_path);
- xfree(ff);
-}
-
-static struct avl_table *tfm_tree = NULL;
-static struct avl_table *ff_tree = NULL;
-static struct avl_table *encname_tree = NULL;
-
-/*tex
-
- We sort |fm_entry| into |tfm_tree| by |tfm_name|:
-
-*/
-
-static int comp_fm_entry_tfm(const void *pa, const void *pb, void *p)
-{
- (void) p;
- return strcmp(((const fm_entry *) pa)->tfm_name, ((const fm_entry *) pb)->tfm_name);
-}
-
-/* We sort |ff_entry| into |ff_tree| by |ff_name|: */
-
-static int comp_ff_entry(const void *pa, const void *pb, void *p)
-{
- (void) p;
- return strcmp(((const ff_entry *) pa)->ff_name, ((const ff_entry *) pb)->ff_name);
-}
-
-static void create_avl_trees(void)
-{
- tfm_tree = avl_create(comp_fm_entry_tfm, NULL, &avl_xallocator);
- ff_tree = avl_create(comp_ff_entry, NULL, &avl_xallocator);
- encname_tree = avl_create(comp_string_entry, NULL, &avl_xallocator);
-}
-
-int avl_do_entry(fm_entry * fm, int mode)
-{
- fm_entry *p;
- void *a;
- void **aa;
- int delete_new = 0;
- if (tfm_tree == NULL)
- create_avl_trees();
- p = (fm_entry *) avl_find(tfm_tree, fm);
- if (p != NULL) {
- switch (mode) {
- case FM_DUPIGNORE:
- formatted_warning("map file", "entry for '%s' already exists, duplicates ignored", fm->tfm_name);
- delete_new = 1;
- break;
- case FM_REPLACE:
- case FM_DELETE:
- if (is_inuse(p)) {
- formatted_warning("map file", "entry for '%s' has been used, replace/delete not allowed", fm->tfm_name);
- delete_new = 1;
- } else {
- a = avl_delete(tfm_tree, p);
- assert(a != NULL);
- delete_fm_entry(p);
- }
- break;
- default:
- formatted_error("map file", "something bad happened",0);
- }
- }
- if ((mode == FM_DUPIGNORE || mode == FM_REPLACE) && delete_new == 0) {
- aa = avl_probe(tfm_tree, fm);
- if (aa == NULL) {
- /*tex Is this a problem? */
- }
- } else
- delete_new = 1;
- return delete_new;
-}
-
-/*tex
-
- Add the encoding name to an AVL tree. This has nothing to do with |writeenc.c|.
-
-*/
-
-static char *add_encname(char *s)
-{
- char *p;
- void **aa;
- if ((p = (char *) avl_find(encname_tree, s)) == NULL) {
- /*tex The encoding name has not yet been registered. */
- p = xstrdup(s);
- aa = avl_probe(encname_tree, p);
- if (aa == NULL) {
- /*tex Is this a problem? */
- }
- }
- return p;
-}
-
-/*tex
-
- A consistency check for map entry, with warn flag.
-
-*/
-
-static int check_fm_entry(fm_entry * fm, boolean warn)
-{
- int a = 0;
- if (is_fontfile(fm) && !is_included(fm)) {
- if (warn)
- formatted_warning("map file",
- "ambiguous entry for '%s': font file present but not included, "
- "will be treated as font file not present", fm->tfm_name);
- xfree(fm->ff_name);
- /*tex Do not set variable |a| as this entry will be still accepted. */
- }
- /*tex If both ps_name and font file are missing, drop this entry. */
- if (fm->ps_name == NULL && !is_fontfile(fm)) {
- if (warn)
- formatted_warning("map file", "invalid entry for '%s': both ps_name and font file missing", fm->tfm_name);
- a += 1;
- }
- /*tex \TRUETYPE\ fonts cannot be reencoded without subsetting. */
- if (is_truetype(fm) && is_reencoded(fm) && !is_subsetted(fm)) {
- if (warn)
- formatted_warning("map file", "invalid entry for '%s': only subsetted TrueType font can be reencoded", fm->tfm_name);
- a += 2;
- }
- /*tex The value of |SlantFont| and |ExtendFont| must be reasonable. */
- if (fm->slant < FONT_SLANT_MIN || fm->slant > FONT_SLANT_MAX) {
- if (warn)
- formatted_warning("map file", "invalid entry for '%s': value '%g' is to large for SlantFont",
- fm->tfm_name, fm->slant / 1000.0);
- a += 8;
- }
- if (fm->extend < FONT_EXTEND_MIN || fm->extend > FONT_EXTEND_MAX) {
- if (warn)
- formatted_warning("map file", "invalid entry for '%s': value '%g' is too large for ExtendFont",
- fm->tfm_name, fm->extend / 1000.0);
- a += 16;
- }
- return a;
-}
-
-/*tex
-
- Returns the font number if s is one of the 14 std. font names, -1 otherwise.
- A bit speed trimmed. Using these base fonts is oldfashioned and doesn't
- happen in a decent \LUATEX\ produced file.
-
-*/
-
-int check_std_t1font(char *s)
-{
- static const char *std_t1font_names[] = {
- "Courier", /* 0:7 */
- "Courier-Bold", /* 1:12 */
- "Courier-Oblique", /* 2:15 */
- "Courier-BoldOblique", /* 3:19 */
- "Helvetica", /* 4:9 */
- "Helvetica-Bold", /* 5:14 */
- "Helvetica-Oblique", /* 6:17 */
- "Helvetica-BoldOblique", /* 7:21 */
- "Symbol", /* 8:6 */
- "Times-Roman", /* 9:11 */
- "Times-Bold", /* 10:10 */
- "Times-Italic", /* 11:12 */
- "Times-BoldItalic", /* 12:16 */
- "ZapfDingbats" /* 13:12 */
- };
- static const int index[] = {
- -1, -1, -1, -1, -1, -1, 8, 0, -1, 4, 10,
- 9, -1, -1, 5, 2, 12, 6, -1, 3, -1, 7
- };
- size_t n;
- int k = -1;
- n = strlen(s);
- if (n > 21)
- return -1;
- if (n == 12) {
- /*tex three names have length 12 */
- switch (*s) {
- case 'C':
- /*tex Courier-Bold */
- k = 1;
- break;
- case 'T':
- /*tex Times-Italic */
- k = 11;
- break;
- case 'Z':
- /*tex ZapfDingbats */
- k = 13;
- break;
- default:
- return -1;
- }
- } else
- k = index[n];
- if (k > -1 && !strcmp(std_t1font_names[k], s))
- return k;
- return -1;
-}
-
-static void fm_scan_line(void)
-{
- int a, b, c, j, u = 0, v = 0;
- char cc;
- float d;
- fm_entry *fm;
- char fm_line[FM_BUF_SIZE], buf[FM_BUF_SIZE];
- char *p, *q, *s;
- char *r = NULL;
- switch (mitem->type) {
- case MAPFILE:
- p = fm_line;
- while (!fm_eof()) {
- if (fm_curbyte == fm_size) {
- fm_curbyte++;
- cc = 10;
- } else {
- cc = (char) fm_getchar();
- }
- append_char_to_buf(cc, p, fm_line, FM_BUF_SIZE);
- if (cc == 10)
- break;
- }
- *(--p) = '\0';
- r = fm_line;
- break;
- case MAPLINE:
- /*tex Work on a string from |makecstring|. */
- r = mitem->line;
- break;
- default:
- assert(0);
- }
- if (*r == '\0' || is_cfg_comment(*r))
- return;
- fm = new_fm_entry();
- read_field(r, q, buf);
- set_field(tfm_name);
- if (!isdigit((unsigned char)*r)) {
- /*tex The 2nd field |ps_name| may not start with a digit. */
- read_field(r, q, buf);
- set_field(ps_name);
- }
- if (isdigit((unsigned char)*r)) {
- /*tex Is the font descriptor |/Flags| given? */
- for (s = r; isdigit((unsigned char)*s); s++);
- if (*s == ' ' || *s == '"' || *s == '<' || *s == '\0') {
- /*tex not e.g.\ |8r.enc| */
- fm->fd_flags = atoi(r);
- while (isdigit((unsigned char)*r))
- r++;
- }
- }
- /*tex Loop through specials, encoding, font file:*/
- while (1) {
- skip_char(r, ' ');
- switch (*r) {
- case '\0':
- goto done;
- case '"':
- /*tex The pening quote. */
- r++;
- u = v = 0;
- do {
- skip_char(r, ' ');
- if (sscanf(r, "%f %n", &d, &j) > 0) {
- /*tex Jump behind number, eat also blanks, if any. */
- s = r + j;
- if (*(s - 1) == 'E' || *(s - 1) == 'e') {
- /*tex e.g.\ |0.5ExtendFont|: |%f = 0.5E| */
- s--;
- }
- if (str_prefix(s, "SlantFont")) {
- /*tex Correct rounding also for negative numbers. */
- d *= (float) 1000.0;
- fm->slant = (int) (d > 0 ? d + 0.5 : d - 0.5);
- set_slantset(fm);
- r = s + strlen("SlantFont");
- } else if (str_prefix(s, "ExtendFont")) {
- d *= (float) 1000.0;
- fm->extend = (int) (d > 0 ? d + 0.5 : d - 0.5);
- set_extendset(fm);
- r = s + strlen("ExtendFont");
- } else {
- /*tex unknown name, jump over it */
- for (r = s; *r != ' ' && *r != '"' && *r != '\0'; r++);
- c = *r;
- *r = '\0';
- formatted_warning("map file", "invalid entry for '%s': unknown name '%s' ignored", fm->tfm_name, s);
- *r = (char) c;
- }
- } else
- for (; *r != ' ' && *r != '"' && *r != '\0'; r++);
- }
- while (*r == ' ');
- if (*r == '"') {
- /*tex The closing quote. */
- r++;
- } else {
- formatted_warning("map file", "invalid entry for '%s': closing quote missing", fm->tfm_name);
- goto bad_line;
- }
- break;
- case 'P':
- /*tex Handle cases for sub fonts like |PidEid=3,1| */
- formatted_warning("map file", "invalid entry for '%s': subfonts are not supported", fm->tfm_name);
- goto bad_line;
- break;
- default:
- /*tex Encoding or font file specification. */
- a = b = 0;
- if (*r == '<') {
- a = *r++;
- if (*r == '<' || *r == '[')
- b = *r++;
- }
- read_field(r, q, buf);
- /*tex Encoding, Formats: |8r.enc| or |<8r.enc| or |<[8r.enc| */
- if (strlen(buf) > 4 && strcasecmp(strend(buf) - 4, ".enc") == 0) {
- /*tex |u|, |v| used if intervening blank: |<< foo| */
- fm->encname = add_encname(buf);
- u = v = 0;
- } else if (strlen(buf) > 0) {
- /*tex
-
- We get the file name given where possible formats are:
-
- \starttabulate[|||]
- \NC subsetting \NC \tpe {<cmr10.pfa} \NC \NR
- \NC no subsetting \NC \tpe {<<cmr10.pfa} \NC \NR
- \NC no embedding \NC \tpe {cmr10.pfa} \NC \NR
- \stoptabulate
-
- */
- if (a == '<' || u == '<') {
- set_included(fm);
- if ((a == '<' && b == 0) || (a == 0 && v == 0)) {
- set_subsetted(fm);
- } else {
- /*tex
-
- Otherwise |b| equals |<| or |[| which means that we have no subsetting.
- */
- }
- }
- set_field(ff_name);
- u = v = 0;
- } else {
- u = a;
- v = b;
- }
- }
- }
- done:
- if (fm->ps_name != NULL && (check_std_t1font(fm->ps_name) >= 0))
- set_std_t1font(fm);
- if (is_fontfile(fm) && strlen(fm_fontfile(fm)) > 3) {
- if (strcasecmp(strend(fm_fontfile(fm)) - 4, ".ttf") == 0)
- set_truetype(fm);
- else if (strcasecmp(strend(fm_fontfile(fm)) - 4, ".ttc") == 0)
- set_truetype(fm);
- else if (strcasecmp(strend(fm_fontfile(fm)) - 4, ".otf") == 0)
- set_opentype(fm);
- else
- set_type1(fm);
- } else {
- /*tex Assume a builtin font is \TYPEONE\: */
- set_type1(fm);
- }
- if (check_fm_entry(fm, true) != 0)
- goto bad_line;
- /*tex
-
- Until here the map line has been completely scanned without errors; |fm|
- points to a valid, freshly filled-out |fm_entry| structure. Now follows
- the actual work of registering or deleting.
-
- */
- if (avl_do_entry(fm, mitem->mode) == 0)
- return;
- bad_line:
- delete_fm_entry(fm);
-}
-
-static void fm_read_info(void)
-{
- int callback_id;
- int file_opened = 0;
-
- if (tfm_tree == NULL)
- create_avl_trees();
- if (mitem->line == NULL) {
- /*tex There is nothing to do. */
- return;
- }
- mitem->lineno = 1;
- switch (mitem->type) {
- case MAPFILE:
- xfree(fm_buffer);
- fm_curbyte = 0;
- fm_size = 0;
- cur_file_name = luatex_find_file(mitem->line, find_map_file_callback);
- if (cur_file_name) {
- callback_id = callback_defined(read_map_file_callback);
- if (callback_id > 0) {
- if (run_callback(callback_id, "S->bSd", cur_file_name,
- &file_opened, &fm_buffer, &fm_size)) {
- if (file_opened) {
- if (fm_size > 0) {
-recorder_record_input(cur_file_name);
- report_start_file(filetype_map,cur_file_name);
- while (!fm_eof()) {
- fm_scan_line();
- mitem->lineno++;
- }
- report_stop_file(filetype_map);
- fm_file = NULL;
- }
- } else {
- formatted_warning("map file", "cannot open font map file '%s'", cur_file_name);
- }
- } else {
- formatted_warning("map file", "cannot open font map file '%s'", cur_file_name);
- }
- } else {
- if (!fm_open(cur_file_name)) {
- formatted_warning("map file", "cannot open font map file '%s'", cur_file_name);
- } else {
- fm_read_file();
- report_start_file(filetype_map,cur_file_name);
-recorder_record_input(cur_file_name);
- while (!fm_eof()) {
- fm_scan_line();
- mitem->lineno++;
- }
- fm_close();
- report_stop_file(filetype_map);
- fm_file = NULL;
- }
- }
- cur_file_name = NULL;
- }
- break;
- case MAPLINE:
- cur_file_name = NULL;
- fm_scan_line();
- break;
- default:
- assert(0);
- }
- /*tex Done with this line: */
- mitem->line = NULL;
- cur_file_name = NULL;
- return;
-}
-
-fm_entry *getfontmap(char *tfm_name)
-{
- fm_entry *fm;
- fm_entry tmp;
- if (tfm_name == NULL) {
- /*tex Wide \LUA\ loaded fonts may not have a name. */
- return NULL;
- }
- if (tfm_tree == NULL) {
- /*tex Only read the default map file. */
- fm_read_info();
- }
- /*tex Look up the name. */
- tmp.tfm_name = tfm_name;
- fm = (fm_entry *) avl_find(tfm_tree, &tmp);
- if (fm == NULL)
- return NULL;
- set_inuse(fm);
- return fm;
-}
-
-/*tex
-
- Process map file given by its name or map line contents. Items not beginning
- with [+-=] flush default map file, if it has not yet been read. Leading
- blanks and blanks immediately following [+-=] are ignored.
-
-*/
-
-void process_map_item(char *s, int type)
-{
- char *p;
- int mode;
- if (*s == ' ') {
- /*tex Ignore leading blanks: */
- s++;
- }
- switch (*s) {
- case '+':
- /* +mapfile.map, +mapline: insert an entry, if it is not duplicate */
- mode = FM_DUPIGNORE;
- s++;
- break;
- case '=':
- /* =mapfile.map, =mapline: try to replace an existing entry */
- mode = FM_REPLACE;
- s++;
- break;
- case '-':
- /* -mapfile.map, -mapline: try to delete an entry */
- mode = FM_DELETE;
- s++;
- break;
- default:
- /* like +, but also: flush the default map file name */
- mode = FM_DUPIGNORE;
- mitem->line = NULL;
- }
- if (*s == ' ') {
- /*tex Ignore a blank after |[+-=]| */
- s++;
- }
- /*tex The map item starts here. */
- p = s;
- switch (type) {
- case MAPFILE:
- /*tex Remove blank at the end. */
- while (*p != '\0' && *p != ' ')
- p++;
- *p = '\0';
- break;
- case MAPLINE:
- /*tex A blank at end is allowed. */
- break;
- default:
- assert(0);
- }
- if (mitem->line != NULL) {
- /*tex Read default map file first */
- fm_read_info();
- }
- if (*s != '\0') {
- /*tex Only if real item to process. */
- mitem->mode = mode;
- mitem->type = type;
- mitem->line = s;
- fm_read_info();
- }
-}
-
-void pdfmapfile(int t)
-{
- char *s = tokenlist_to_cstring(t, true, NULL);
- process_map_item(s, MAPFILE);
- free(s);
-}
-
-void pdfmapline(int t)
-{
- char *s = tokenlist_to_cstring(t, true, NULL);
- process_map_item(s, MAPLINE);
- free(s);
-}
-
-void pdf_init_map_file(const char *map_name)
-{
- assert(mitem == NULL);
- mitem = xtalloc(1, mapitem);
- mitem->mode = FM_DUPIGNORE;
- mitem->type = MAPFILE;
- mitem->line = xstrdup(map_name);
-}
-
-/*tex
-
- An early check whether a font file exists. Search tree |ff_tree| is used in
- 1st instance, as it may be faster than the |kpse_find_file|, and
- |kpse_find_file| is called only once per font file name plus expansion
- parameter. This might help keeping speed, if many \PDF\ pages with same fonts
- are to be embedded (not that we deal with that fragile approach any longer in
- \LUATEX).
-
- The |ff_tree| contains only font files, which are actually needed, so this tree
- typically is much smaller than the tfm_tree.
-
-*/
-
-ff_entry *check_ff_exist(char *ff_name, boolean is_tt)
-{
- ff_entry *ff;
- ff_entry tmp;
- void **aa;
- int callback_id;
- char *filepath = NULL;
- tmp.ff_name = ff_name;
- ff = (ff_entry *) avl_find(ff_tree, &tmp);
- if (ff == NULL) {
- /*tex The name is not yet in the database. */
- ff = new_ff_entry();
- ff->ff_name = xstrdup(ff_name);
- if (is_tt) {
- callback_id = callback_defined(find_truetype_file_callback);
- if (callback_id > 0) {
- run_callback(callback_id, "S->S", ff_name, &filepath);
- if (filepath && strlen(filepath) == 0)
- filepath = NULL;
- ff->ff_path = filepath;
- } else {
- ff->ff_path = kpse_find_file(ff_name, kpse_truetype_format, 0);
- }
- } else {
- callback_id = callback_defined(find_type1_file_callback);
- if (callback_id > 0) {
- run_callback(callback_id, "S->S", ff_name, &filepath);
- if (filepath && strlen(filepath) == 0)
- filepath = NULL;
- ff->ff_path = filepath;
- } else {
- ff->ff_path = kpse_find_file(ff_name, kpse_type1_format, 0);
- }
- }
- aa = avl_probe(ff_tree, ff);
- if (aa == NULL) {
- /*tex Is this a problem? */
- }
- }
- return ff;
-}
-
-int is_subsetable(fm_entry * fm)
-{
- assert(is_included(fm));
- return is_subsetted(fm);
-}
-
-/*tex Cleaning up: */
-
-static void destroy_fm_entry_tfm(void *pa, void *pb)
-{
- fm_entry *fm;
- (void) pb;
- fm = (fm_entry *) pa;
- delete_fm_entry(fm);
-}
-
-static void destroy_ff_entry(void *pa, void *pb)
-{
- ff_entry *ff;
- (void) pb;
- ff = (ff_entry *) pa;
- delete_ff_entry(ff);
-}
-
-void fm_free(void)
-{
- if (tfm_tree != NULL) {
- avl_destroy(tfm_tree, destroy_fm_entry_tfm);
- tfm_tree = NULL;
- }
- if (ff_tree != NULL) {
- avl_destroy(ff_tree, destroy_ff_entry);
- ff_tree = NULL;
- }
-}