summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-10-26 12:51:57 +0000
committerPaul Buetow <paul@buetow.org>2008-10-26 12:51:57 +0000
commita1c3f47491b98cd9026f8e853cc9e72630805c12 (patch)
treeec2ea29640b43f2c1f820fd3fee317beec27d130
parent380eacd0f4037ec00f37ad5b5e4baa18301cf3dd (diff)
added the "scope" function
-rw-r--r--README9
-rw-r--r--TODO6
-rw-r--r--docs/help.txt2
-rw-r--r--docs/pod/fype.1.gzbin6475 -> 6545 bytes
-rw-r--r--docs/pod/fype.html8
-rw-r--r--docs/pod/fype.man12
-rw-r--r--docs/pod/fype.pod6
-rw-r--r--docs/pod/fype.tex7
-rw-r--r--docs/pod/fype.txt9
-rw-r--r--docs/stats.txt2
-rw-r--r--docs/version.txt2
-rw-r--r--examples/scopeing.fy4
-rwxr-xr-xfypebin431269 -> 435103 bytes
-rw-r--r--src/build.h2
-rw-r--r--src/core/function.c7
-rw-r--r--src/core/scope.c17
-rw-r--r--src/core/scope.h1
-rw-r--r--src/core/symbol.c46
-rw-r--r--src/core/symbol.h3
-rw-r--r--src/data/hash.c13
-rw-r--r--src/data/hash.h3
-rw-r--r--src/data/stack.c29
-rw-r--r--src/data/stack.h4
-rw-r--r--src/defines.h2
-rw-r--r--tags8
25 files changed, 178 insertions, 24 deletions
diff --git a/README b/README
index 4e82ce6..a6be7b8 100644
--- a/README
+++ b/README
@@ -134,8 +134,9 @@ SYNTAX
Scopeing
A new scope starts with an { and ends with an }. An exception is a
procedure, which does not use its own scope (see later in this manual).
- Control statements and functions support scopeings. Here is a small
- example how to use scopes:
+ Control statements and functions support scopeings. The scope function
+ will print out all available symbols at the current position. Here is a
+ small example of how to use scopes:
my foo = 1;
@@ -147,6 +148,10 @@ SYNTAX
# Prints out 1
put defined bar;
+
+ # Prints out all available symbols at this
+ # point to stdout. Those are: bar and foo
+ scope;
}
# Prints out 0
diff --git a/TODO b/TODO
index 781e7d0..39e51e0 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,10 @@
Todo's (not in any specific order)
+Scopes/Garbage output for detailed infos
+ scopes_print(Scope *p_scope)
+ for all scopes
+ for all syms
+ print
Arrays
Closures
Function arguments and return values
@@ -7,3 +12,4 @@ Interactive shell
Labels
String operators/functions
loop, next, break, do
+
diff --git a/docs/help.txt b/docs/help.txt
index c0fbcdc..584924e 100644
--- a/docs/help.txt
+++ b/docs/help.txt
@@ -1,4 +1,4 @@
-Fype v0.1-devel Build 9260
+Fype v0.1-devel Build 9276
(c) Paul C. Buetow (2005 - 2008) <fype@dev.buetow.org>
-e Executes given code string (see synopses)
-h Prints this help
diff --git a/docs/pod/fype.1.gz b/docs/pod/fype.1.gz
index 64bebfb..164c95c 100644
--- a/docs/pod/fype.1.gz
+++ b/docs/pod/fype.1.gz
Binary files differ
diff --git a/docs/pod/fype.html b/docs/pod/fype.html
index 6400295..0a709bb 100644
--- a/docs/pod/fype.html
+++ b/docs/pod/fype.html
@@ -228,7 +228,7 @@ TODO file of the source distribution of Fype!</p>
<p>
</p>
<h2><a name="scopeing">Scopeing</a></h2>
-<p>A new scope starts with an { and ends with an }. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. Here is a small example how to use scopes:</p>
+<p>A new scope starts with an { and ends with an }. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. The <strong>scope</strong> function will print out all available symbols at the current position. Here is a small example of how to use scopes:</p>
<pre>
my foo = 1;</pre>
<pre>
@@ -239,7 +239,11 @@ TODO file of the source distribution of Fype!</p>
my bar = 2;</pre>
<pre>
# Prints out 1
- put defined bar;
+ put defined bar;</pre>
+<pre>
+ # Prints out all available symbols at this
+ # point to stdout. Those are: bar and foo
+ scope;
}</pre>
<pre>
# Prints out 0
diff --git a/docs/pod/fype.man b/docs/pod/fype.man
index 36f3ef2..e9b95a7 100644
--- a/docs/pod/fype.man
+++ b/docs/pod/fype.man
@@ -129,7 +129,7 @@
.\" ========================================================================
.\"
.IX Title "FYPE 1"
-.TH FYPE 1 "2008-10-19" "Fype v0.1-devel Build 9240" "The Fype Users Manual Page"
+.TH FYPE 1 "2008-10-26" "Fype v0.1-devel Build 9276" "The Fype Users Manual Page"
.SH "NAME"
\&\fBFype\fR is \fBF\fRor \fBY\fRour \fBP\fRrogram \fBE\fRxecution
.PP
@@ -257,7 +257,7 @@ A Fype program is a list of statements. Each keyword, expression or function cal
All paranthesis of function calls are optional. They help to make the code better readable. They also help to force precedences of expressions.
.Sh "Scopeing"
.IX Subsection "Scopeing"
-A new scope starts with an { and ends with an }. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. Here is a small example how to use scopes:
+A new scope starts with an { and ends with an }. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. The \fBscope\fR function will print out all available symbols at the current position. Here is a small example of how to use scopes:
.PP
.Vb 1
\& my foo = 1;
@@ -271,9 +271,15 @@ A new scope starts with an { and ends with an }. An exception is a procedure, wh
\& my bar = 2;
.Ve
.PP
-.Vb 3
+.Vb 2
\& # Prints out 1
\& put defined bar;
+.Ve
+.PP
+.Vb 4
+\& # Prints out all available symbols at this
+\& # point to stdout. Those are: bar and foo
+\& scope;
\& }
.Ve
.PP
diff --git a/docs/pod/fype.pod b/docs/pod/fype.pod
index 1e29a6d..5006345 100644
--- a/docs/pod/fype.pod
+++ b/docs/pod/fype.pod
@@ -144,7 +144,7 @@ All paranthesis of function calls are optional. They help to make the code bette
=head2 Scopeing
-A new scope starts with an { and ends with an }. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. Here is a small example how to use scopes:
+A new scope starts with an { and ends with an }. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. The B<scope> function will print out all available symbols at the current position. Here is a small example of how to use scopes:
my foo = 1;
@@ -156,6 +156,10 @@ A new scope starts with an { and ends with an }. An exception is a procedure, wh
# Prints out 1
put defined bar;
+
+ # Prints out all available symbols at this
+ # point to stdout. Those are: bar and foo
+ scope;
}
# Prints out 0
diff --git a/docs/pod/fype.tex b/docs/pod/fype.tex
index 8bdd585..7609a00 100644
--- a/docs/pod/fype.tex
+++ b/docs/pod/fype.tex
@@ -179,7 +179,7 @@ All paranthesis of function calls are optional. They help to make the code bette
\subsection*{Scopeing\label{Scopeing}\index{Scopeing}}
-A new scope starts with an \{ and ends with an \}. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. Here is a small example how to use scopes:
+A new scope starts with an \{ and ends with an \}. An exception is a procedure, which does not use its own scope (see later in this manual). Control statements and functions support scopeings. The \textbf{scope} function will print out all available symbols at the current position. Here is a small example of how to use scopes:
\begin{verbatim}
my foo = 1;
@@ -194,6 +194,11 @@ A new scope starts with an \{ and ends with an \}. An exception is a procedure,
\begin{verbatim}
# Prints out 1
put defined bar;
+\end{verbatim}
+\begin{verbatim}
+ # Prints out all available symbols at this
+ # point to stdout. Those are: bar and foo
+ scope;
}
\end{verbatim}
\begin{verbatim}
diff --git a/docs/pod/fype.txt b/docs/pod/fype.txt
index 4e82ce6..a6be7b8 100644
--- a/docs/pod/fype.txt
+++ b/docs/pod/fype.txt
@@ -134,8 +134,9 @@ SYNTAX
Scopeing
A new scope starts with an { and ends with an }. An exception is a
procedure, which does not use its own scope (see later in this manual).
- Control statements and functions support scopeings. Here is a small
- example how to use scopes:
+ Control statements and functions support scopeings. The scope function
+ will print out all available symbols at the current position. Here is a
+ small example of how to use scopes:
my foo = 1;
@@ -147,6 +148,10 @@ SYNTAX
# Prints out 1
put defined bar;
+
+ # Prints out all available symbols at this
+ # point to stdout. Those are: bar and foo
+ scope;
}
# Prints out 0
diff --git a/docs/stats.txt b/docs/stats.txt
index 163f9b6..dd0d237 100644
--- a/docs/stats.txt
+++ b/docs/stats.txt
@@ -1,4 +1,4 @@
===> Num of C source files : 42
-===> Num of C source lines : 7577
+===> Num of C source lines : 7689
===> Num of Fype source examples : 14
===> Num of Fype source lines : 358
diff --git a/docs/version.txt b/docs/version.txt
index c263f95..e9c3078 100644
--- a/docs/version.txt
+++ b/docs/version.txt
@@ -1 +1 @@
-Fype v0.1-devel Build 9260
+Fype v0.1-devel Build 9276
diff --git a/examples/scopeing.fy b/examples/scopeing.fy
index 2e36c2c..434f38f 100644
--- a/examples/scopeing.fy
+++ b/examples/scopeing.fy
@@ -13,6 +13,10 @@ my foo = 1;
# Prints out 1
assert 1 == (put defined bar);
+
+ # Prints out all available symbols at
+ # the current program position.
+ scope;
}
# Prints out 0
diff --git a/fype b/fype
index fe23a6c..d3856ed 100755
--- a/fype
+++ b/fype
Binary files differ
diff --git a/src/build.h b/src/build.h
index d0cf034..303e86b 100644
--- a/src/build.h
+++ b/src/build.h
@@ -35,7 +35,7 @@
#ifndef BUILD_H
#define BUILD_H
-#define BUILDNR 9260
+#define BUILDNR 9299
#define OS_FREEBSD
#endif
diff --git a/src/core/function.c b/src/core/function.c
index a528aa1..8541960 100644
--- a/src/core/function.c
+++ b/src/core/function.c
@@ -524,6 +524,7 @@ function_process(Interpret *p_interpret, Token *p_token_op,
_Bool
function_is_buildin(Token *p_token_ident) {
+ /* TODO: optimize this function */
if (strcmp("assert", token_get_val(p_token_ident)) == 0)
return (true);
@@ -563,6 +564,9 @@ function_is_buildin(Token *p_token_ident) {
if (strcmp("put", token_get_val(p_token_ident)) == 0)
return (true);
+ if (strcmp("scope", token_get_val(p_token_ident)) == 0)
+ return (true);
+
if (strcmp("say", token_get_val(p_token_ident)) == 0)
return (true);
@@ -751,6 +755,9 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident,
}
stackiterator_delete(p_iter);
+ } else if (strcmp("scope", token_get_val(p_token_ident)) == 0) {
+ scope_print(p_interpret->p_scope);
+
} else if (strcmp("say", token_get_val(p_token_ident)) == 0) {
StackIterator *p_iter = stackiterator_new(p_stack_args);
while (stackiterator_has_next(p_iter)) {
diff --git a/src/core/scope.c b/src/core/scope.c
index 2a19390..8c3d4bf 100644
--- a/src/core/scope.c
+++ b/src/core/scope.c
@@ -150,8 +150,19 @@ scope_newset(Scope *p_scope, char *c_key, Symbol *p_symbol) {
}
void
-scopes_print(Scope *p_scope) {
+_scope_print_cb(void *p_void, int i_level) {
+ Hash *p_hash_syms = p_void;
+ if (i_level > 0)
+ printf("%d level(s) up:\n", i_level);
+ hash_iterate_key(p_hash_syms, symbol_print_cb);
+}
+
+void
+scope_print(Scope *p_scope) {
printf("Scopes:\n");
- printf("Scope stack size: %d\n", p_scope->p_stack_scopes);
-
+ printf("Scope stack size: %d\n", stack_size(p_scope->p_stack_scopes));
+ printf("Global symbols:\n");
+ hash_iterate_key(p_scope->p_hash_global, symbol_print_cb);
+ printf("Local symbols:\n");
+ stack_iterate_level(p_scope->p_stack_scopes, _scope_print_cb);
}
diff --git a/src/core/scope.h b/src/core/scope.h
index be29e67..4954344 100644
--- a/src/core/scope.h
+++ b/src/core/scope.h
@@ -40,7 +40,6 @@
#include "../defines.h"
#include "symbol.h"
-
typedef struct {
Hash *p_hash_global;
Stack *p_stack_scopes;
diff --git a/src/core/symbol.c b/src/core/symbol.c
index 8c39f5c..ef5957b 100644
--- a/src/core/symbol.c
+++ b/src/core/symbol.c
@@ -35,6 +35,7 @@
#include "symbol.h"
#include "../data/list.h"
+#include "token.h"
Symbol*
symbol_new(SymbolType sym, void *p_val) {
@@ -67,3 +68,48 @@ void
symbol_cleanup_hash_syms_cb(void *p_void) {
symbol_delete(p_void);
}
+
+void
+symbol_print(Symbol *p_symbol, char *c_key) {
+ printf("%s: %s", sym_get_name(p_symbol->sym), c_key);
+
+ switch (p_symbol->sym) {
+ case SYM_BUILDIN:
+ case SYM_CONSTANT:
+ break;
+ case SYM_PROCEDURE:
+ case SYM_FUNCTION:
+ //list_iterate(symbol_get_val(p_symbol), token_print_cb);
+ break;
+ case SYM_VARIABLE:
+ printf(" ");
+ token_print(symbol_get_val(p_symbol));
+ break;
+ }
+
+ printf("\n");
+}
+
+void
+symbol_print_cb(void *p_void, char *c_key) {
+ symbol_print(p_void, c_key);
+}
+
+char*
+sym_get_name(SymbolType sym) {
+ switch (sym) {
+ case SYM_CONSTANT:
+ return ("SYM_CONSTANT");
+ case SYM_VARIABLE:
+ return ("SYM_VARIABLE");
+ case SYM_BUILDIN:
+ return ("SYM_BUILDIN");
+ case SYM_PROCEDURE:
+ return ("SYM_PROCEDURE");
+ case SYM_FUNCTION:
+ return ("SYM_FUNCTION");
+ }
+
+ // Never reach this point
+ return ("NONE");
+}
diff --git a/src/core/symbol.h b/src/core/symbol.h
index 2abc67e..e0f8337 100644
--- a/src/core/symbol.h
+++ b/src/core/symbol.h
@@ -62,5 +62,8 @@ typedef struct {
Symbol* symbol_new(SymbolType sym, void *p_val);
void symbol_delete(Symbol *p_symbol);
void symbol_cleanup_hash_syms_cb(void *p_void);
+void symbol_print(Symbol *p_symbol, char *c_key);
+void symbol_print_cb(void *p_void, char *c_key);
+char* sym_get_name(SymbolType sym);
#endif
diff --git a/src/data/hash.c b/src/data/hash.c
index 3c01042..53a1b50 100644
--- a/src/data/hash.c
+++ b/src/data/hash.c
@@ -68,7 +68,7 @@ hash_insert_ht(Hash *p_hash, char *c_key, void *p_val, TYPE type) {
if (p_hash->i_cur_size == p_hash->i_size)
hash_size(p_hash, p_hash->i_size *2);
- int i_addr = hash_getaddr(p_hash, c_key, free_ADDR);
+ int i_addr = hash_getaddr(p_hash, c_key, FREE_ADDR);
if (i_addr == RET_ERROR )
return (RET_NO_SPACE);
@@ -144,7 +144,7 @@ hash_getaddr(Hash *p_hash, char *c_key, HASH_OP OP) {
i_addr = (i_addr *p_hash->i_size + (int) c_key[i]) % p_hash->i_size;
switch (OP) {
- case free_ADDR:
+ case FREE_ADDR:
if (!hash_addrisfree(p_hash,i_addr))
return (i_addr);
break;
@@ -188,7 +188,7 @@ hash_nextaddr(Hash *p_hash, int i_max_tries, char *c_key, int i_addr,
i_addr = (i_addr + 1) % p_hash->i_size;
switch (OP) {
- case free_ADDR:
+ case FREE_ADDR:
if (!hash_addrisfree(p_hash,i_addr))
return (i_addr);
break;
@@ -289,3 +289,10 @@ hash_iterate(Hash *p_hash, void (*func)(void *)) {
if (p_hash->p_elems[i].flag == 'o')
(*func) (p_hash->p_elems[i].p_val);
}
+
+void
+hash_iterate_key(Hash *p_hash, void (*func)(void *, char *)) {
+ for (int i = 0; i < p_hash->i_size; ++i)
+ if (p_hash->p_elems[i].flag == 'o')
+ (*func) (p_hash->p_elems[i].p_val, p_hash->p_elems[i].c_key);
+}
diff --git a/src/data/hash.h b/src/data/hash.h
index e49f3c3..9ee8640 100644
--- a/src/data/hash.h
+++ b/src/data/hash.h
@@ -39,7 +39,7 @@
#include "types.h"
typedef enum HASH_OP_ {
- free_ADDR,
+ FREE_ADDR,
OCC_ADDR
} HASH_OP;
@@ -75,6 +75,7 @@ int hash_nextaddr(Hash *p_hash, int i_max_tries,
char *c_key, int i_addr,
HASH_OP OP);
void hash_iterate(Hash *p_hash, void (*func)(void *));
+void hash_iterate_key(Hash *p_hash, void (*func)(void *, char *));
#define hash_get_cur_size(hash) hash->i_cur_size
#define hash_get_size(hash) hash->i_size
diff --git a/src/data/stack.c b/src/data/stack.c
index 5997c86..e7d5766 100644
--- a/src/data/stack.c
+++ b/src/data/stack.c
@@ -173,6 +173,35 @@ stack_iterate(Stack *p_stack, void (*func)(void *p_void)) {
}
}
+void
+stack_iterate2(Stack *p_stack, void (*func)(void *p_void, void *p_void2),
+ void *p_void_arg) {
+ if (!p_stack)
+ return;
+
+ StackElem *p_elem = p_stack->p_first;
+
+ while (p_elem) {
+ (*func)(p_elem->p_val, p_void_arg);
+ p_elem = p_elem->p_next;
+ }
+}
+
+void
+stack_iterate_level(Stack *p_stack, void (*func)(void *p_void,
+ int i_level)) {
+ if (!p_stack)
+ return;
+
+ StackElem *p_elem = p_stack->p_first;
+
+ int i_level = 0;
+ while (p_elem) {
+ (*func)(p_elem->p_val, i_level++);
+ p_elem = p_elem->p_next;
+ }
+}
+
StackIterator*
stackiterator_new(Stack *p_stack) {
StackIterator *p_iter = malloc(sizeof(StackIterator));
diff --git a/src/data/stack.h b/src/data/stack.h
index 88bde8d..45acdf8 100644
--- a/src/data/stack.h
+++ b/src/data/stack.h
@@ -59,6 +59,10 @@ Stack *stack_new();
StackElem *stackelem_new();
_Bool stack_empty(Stack *p_stack);
void stack_iterate(Stack *p_stack, void (*func)(void *p_void));
+void stack_iterate2(Stack *p_stack, void (*func)(void *p_void, void *p_void2),
+ void *p_void_arg);
+void stack_iterate_level(Stack *p_stack, void (*func)(void *p_void,
+ int i_level));
void stack_push(Stack *p_stack, void *p_val);
void *stack_pop(Stack *p_stack);
void stack_clear(Stack *p_stack);
diff --git a/src/defines.h b/src/defines.h
index 6ff662a..90ed947 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -75,7 +75,7 @@
exit(1); }
#define DPRINTF(...) printf("DEBUG("); printf(__VA_ARGS__); printf(")\n");
-#define DEBUG_GC
+//#define DEBUG_GC
//#define DEBUG_TOKEN_REFCOUNT
//#define DEBUG_FUNCTION_PROCESS
//#define DEBUG_TRACK
diff --git a/tags b/tags
index 5cddd67..fe248d5 100644
--- a/tags
+++ b/tags
@@ -28,6 +28,7 @@ _program ./src/core/interpret.c /^_program(Interpret *p_interpret) {$/
_scanner_get_next_char ./src/core/scanner.c /^_scanner_get_next_char(Scanner *p_scanner) {$/
_scanner_has_next_char ./src/core/scanner.c /^_scanner_has_next_char(Scanner *p_scanner) {$/
_scope_get_hash ./src/core/scope.c /^_scope_get_hash(Scope *p_scope, char *c_key) {$/
+_scope_print_cb ./src/core/scope.c /^_scope_print_cb(void *p_void, int i_level) {$/
_statement ./src/core/interpret.c /^_statement(Interpret *p_interpret) {$/
_sum ./src/core/interpret.c /^_sum(Interpret *p_interpret) {$/
_term ./src/core/interpret.c /^_term(Interpret *p_interpret) {$/
@@ -126,6 +127,7 @@ hash_getaddr ./src/data/hash.c /^hash_getaddr(Hash *p_hash, char *c_key, HASH_OP
hash_insert ./src/data/hash.c /^hash_insert(Hash *p_hash, char *c_key, void *p_val/
hash_insert_ht ./src/data/hash.c /^hash_insert_ht(Hash *p_hash, char *c_key, void *p_/
hash_iterate ./src/data/hash.c /^hash_iterate(Hash *p_hash, void (*func)(void *)) {/
+hash_iterate_key ./src/data/hash.c /^hash_iterate_key(Hash *p_hash, void (*func)(void */
hash_new ./src/data/hash.c /^hash_new(unsigned i_size) {$/
hash_nextaddr ./src/data/hash.c /^hash_nextaddr(Hash *p_hash, int i_max_tries, char /
hash_print ./src/data/hash.c /^hash_print(Hash *p_hash) {$/
@@ -231,6 +233,7 @@ scope_exists ./src/core/scope.c /^scope_exists(Scope *p_scope, char *c_key) {$/
scope_get ./src/core/scope.c /^scope_get(Scope *p_scope, char *c_key) {$/
scope_new ./src/core/scope.c /^scope_new(Hash *p_hash_syms) {$/
scope_newset ./src/core/scope.c /^scope_newset(Scope *p_scope, char *c_key, Symbol */
+scope_print ./src/core/scope.c /^scope_print(Scope *p_scope) {$/
scope_remove ./src/core/scope.c /^scope_remove(Scope *p_scope, char *c_key) {$/
scope_reset ./src/core/scope.c /^scope_reset(Scope *p_scope, char *c_key, Symbol *p/
scope_up ./src/core/scope.c /^scope_up(Scope *p_scope) {$/
@@ -240,6 +243,8 @@ stack_delete ./src/data/stack.c /^stack_delete(Stack *p_stack) {$/
stack_delete_and_free ./src/data/stack.c /^stack_delete_and_free(Stack *p_stack) {$/
stack_empty ./src/data/stack.c /^stack_empty(Stack *p_stack) {$/
stack_iterate ./src/data/stack.c /^stack_iterate(Stack *p_stack, void (*func)(void *p/
+stack_iterate2 ./src/data/stack.c /^stack_iterate2(Stack *p_stack, void (*func)(void */
+stack_iterate_level ./src/data/stack.c /^stack_iterate_level(Stack *p_stack, void (*func)(v/
stack_merge ./src/data/stack.c /^stack_merge(Stack *p_stack, Stack *p_stack_merge) /
stack_new ./src/data/stack.c /^stack_new() {$/
stack_pop ./src/data/stack.c /^stack_pop(Stack *p_stack) {$/
@@ -251,9 +256,12 @@ stackiterator_has_next ./src/data/stack.c /^stackiterator_has_next(StackIterator
stackiterator_new ./src/data/stack.c /^stackiterator_new(Stack *p_stack) {$/
stackiterator_next ./src/data/stack.c /^stackiterator_next(StackIterator *p_iter) {$/
stackiterator_remove_prev ./src/data/stack.c /^stackiterator_remove_prev(StackIterator *p_iter) {/
+sym_get_name ./src/core/symbol.c /^sym_get_name(SymbolType sym) {$/
symbol_cleanup_hash_syms_cb ./src/core/symbol.c /^symbol_cleanup_hash_syms_cb(void *p_void) {$/
symbol_delete ./src/core/symbol.c /^symbol_delete(Symbol *p_symbol) {$/
symbol_new ./src/core/symbol.c /^symbol_new(SymbolType sym, void *p_val) {$/
+symbol_print ./src/core/symbol.c /^symbol_print(Symbol *p_symbol, char *c_key) {$/
+symbol_print_cb ./src/core/symbol.c /^symbol_print_cb(void *p_void, char *c_key) {$/
token_copy_cb ./src/core/token.c /^token_copy_cb(void *p_void) {$/
token_copy_vals ./src/core/token.c /^void token_copy_vals(Token *p_token_to, Token *p_t/
token_delete ./src/core/token.c /^token_delete(Token *p_token) {$/