X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsymbol.c;h=2dd32d338fdc339af1b77ccec508ccc45b2741a4;hb=ebb9aa922a01d5052acee38d06d4b175086ba725;hp=b0741a530a36b5a7ad444edb13b823fbf0b71da4;hpb=3dcdf34e0cc213aad605f20006a5214828525064;p=m17n%2Fm17n-lib.git diff --git a/src/symbol.c b/src/symbol.c index b0741a5..2dd32d3 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -148,8 +148,7 @@ void msymbol__fini () { int i; - MSymbol sym, next; - int freed_symbols = 0; + MSymbol sym; for (i = 0; i < SYMBOL_TABLE_SIZE; i++) for (sym = symbol_table[i]; sym; sym = sym->next) @@ -158,7 +157,17 @@ msymbol__fini () if (sym->plist.key->managing_key) M17N_OBJECT_UNREF (sym->plist.val); M17N_OBJECT_UNREF (sym->plist.next); + sym->plist.key = Mnil; } +} + +void +msymbol__free_table () +{ + int i; + MSymbol sym, next; + int freed_symbols = 0; + for (i = 0; i < SYMBOL_TABLE_SIZE; i++) { for (sym = symbol_table[i]; sym; sym = next) @@ -187,6 +196,24 @@ msymbol__with_len (const char *name, int len) return msymbol (p); } +/** Return a plist of symbols that has non-NULL property PROP. If + PROP is Mnil, return a plist of all symbols. Values of the plist + is NULL. */ + +MPlist * +msymbol__list (MSymbol prop) +{ + MPlist *plist = mplist (); + int i; + MSymbol sym; + + for (i = 0; i < SYMBOL_TABLE_SIZE; i++) + for (sym = symbol_table[i]; sym; sym = sym->next) + if (prop == Mnil || msymbol_get (sym, prop)) + mplist_push (plist, sym, NULL); + return plist; +} + /** Canonicalize the name of SYM, and return a symbol of the canonicalized name. Canonicalization is done by this rule: @@ -451,6 +478,23 @@ msymbol_as_managing_key (const char *name) /*=*/ /***en + @brief Check if a symbol is a managing key. + + The msymbol_is_managing_key () function checks if the sysmbol + $SYMBOL is a managing key or not. + + @return Return 1 if the symbol is a managing key. Otherwise, + return 0. */ + +int +msymbol_is_managing_key (MSymbol symbol) +{ + return (symbol->managing_key == 1); +} + +/*=*/ + +/***en @brief Search for a symbol that has a specified name. The msymbol_exist () function searches for the symbol whose name @@ -704,7 +748,7 @@ MSymbol mdebug_dump_all_symbols (int indent) { char *prefix; - int i; + int i, n; MSymbol sym; if (indent < 0) @@ -714,14 +758,15 @@ mdebug_dump_all_symbols (int indent) prefix[indent] = 0; fprintf (stderr, "(symbol-list"); - for (i = 0; i < SYMBOL_TABLE_SIZE; i++) + for (i = n = 0; i < SYMBOL_TABLE_SIZE; i++) if ((sym = symbol_table[i])) { fprintf (stderr, "\n%s (%4d", prefix, i); - for (; sym; sym = sym->next) + for (; sym; sym = sym->next, n++) fprintf (stderr, " '%s'", sym->name); fprintf (stderr, ")"); } + fprintf (stderr, "\n%s (total %d)", prefix, n); fprintf (stderr, ")"); return Mnil; }