diff options
| author | Paul Buetow <paul@buetow.org> | 2008-10-26 12:51:57 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-10-26 12:51:57 +0000 |
| commit | a1c3f47491b98cd9026f8e853cc9e72630805c12 (patch) | |
| tree | ec2ea29640b43f2c1f820fd3fee317beec27d130 | |
| parent | 380eacd0f4037ec00f37ad5b5e4baa18301cf3dd (diff) | |
added the "scope" function
| -rw-r--r-- | README | 9 | ||||
| -rw-r--r-- | TODO | 6 | ||||
| -rw-r--r-- | docs/help.txt | 2 | ||||
| -rw-r--r-- | docs/pod/fype.1.gz | bin | 6475 -> 6545 bytes | |||
| -rw-r--r-- | docs/pod/fype.html | 8 | ||||
| -rw-r--r-- | docs/pod/fype.man | 12 | ||||
| -rw-r--r-- | docs/pod/fype.pod | 6 | ||||
| -rw-r--r-- | docs/pod/fype.tex | 7 | ||||
| -rw-r--r-- | docs/pod/fype.txt | 9 | ||||
| -rw-r--r-- | docs/stats.txt | 2 | ||||
| -rw-r--r-- | docs/version.txt | 2 | ||||
| -rw-r--r-- | examples/scopeing.fy | 4 | ||||
| -rwxr-xr-x | fype | bin | 431269 -> 435103 bytes | |||
| -rw-r--r-- | src/build.h | 2 | ||||
| -rw-r--r-- | src/core/function.c | 7 | ||||
| -rw-r--r-- | src/core/scope.c | 17 | ||||
| -rw-r--r-- | src/core/scope.h | 1 | ||||
| -rw-r--r-- | src/core/symbol.c | 46 | ||||
| -rw-r--r-- | src/core/symbol.h | 3 | ||||
| -rw-r--r-- | src/data/hash.c | 13 | ||||
| -rw-r--r-- | src/data/hash.h | 3 | ||||
| -rw-r--r-- | src/data/stack.c | 29 | ||||
| -rw-r--r-- | src/data/stack.h | 4 | ||||
| -rw-r--r-- | src/defines.h | 2 | ||||
| -rw-r--r-- | tags | 8 |
25 files changed, 178 insertions, 24 deletions
@@ -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 @@ -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 Binary files differindex 64bebfb..164c95c 100644 --- a/docs/pod/fype.1.gz +++ b/docs/pod/fype.1.gz 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 Binary files differdiff --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 @@ -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) {$/ |
