Make pointer-printing in (penv) optional.
Colorize (penv) output.
This commit is contained in:
parent
fb2e1811ff
commit
ac04fa1a96
28
src/env.c
28
src/env.c
|
@ -137,7 +137,7 @@ void addToEnv(struct Environment* env, const char* name, const Object obj)
|
||||||
addToEnvAt(old_size, env, name, obj);
|
addToEnvAt(old_size, env, name, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printEnv(struct Environment* env)
|
void printEnv(struct Environment* env, int printPointers)
|
||||||
{
|
{
|
||||||
if (!env) {
|
if (!env) {
|
||||||
printf("NULL env\n");
|
printf("NULL env\n");
|
||||||
|
@ -145,14 +145,32 @@ void printEnv(struct Environment* env)
|
||||||
}
|
}
|
||||||
printf("env->capacity = %d\n", env->capacity);
|
printf("env->capacity = %d\n", env->capacity);
|
||||||
for (int i = 0; i < env->capacity; i++) {
|
for (int i = 0; i < env->capacity; i++) {
|
||||||
|
printf("[0m");
|
||||||
if (env->strings[i] == NULL) {
|
if (env->strings[i] == NULL) {
|
||||||
printf("env[%d]: NULL %p\n", i, env->strings[i]);
|
printf("[%d]: NULL - End of Environment\n", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf("env[%d]: `%s` %p :: ", i, env->strings[i], env->strings[i]);
|
if (printPointers) {
|
||||||
printf("[1m");
|
printf("[%d]: `%s` %p :: ", i, env->strings[i], env->strings[i]);
|
||||||
printObj(&env->objects[i]);
|
} else {
|
||||||
|
printf("[%d]: `%s` :: ", i, env->strings[i]);
|
||||||
|
}
|
||||||
printf("[0m");
|
printf("[0m");
|
||||||
|
if (env->objects[i].type == TYPE_STRING) {
|
||||||
|
printf("\"");
|
||||||
|
}
|
||||||
|
if (env->objects[i].type == TYPE_FUNC && !printPointers) {
|
||||||
|
printf("Native");
|
||||||
|
} else {
|
||||||
|
size_t length;
|
||||||
|
char* s = stringObj(&env->objects[i], &length);
|
||||||
|
printColored(s);
|
||||||
|
if (env->objects[i].type == TYPE_STRING) {
|
||||||
|
printf("\"");
|
||||||
|
}
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ struct Environment envForLambda(const Object* params, const Object* arg_forms, i
|
||||||
|
|
||||||
void addToEnv(struct Environment* env, const char* name, Object obj);
|
void addToEnv(struct Environment* env, const char* name, Object obj);
|
||||||
|
|
||||||
void printEnv(struct Environment* env);
|
void printEnv(struct Environment* env, int printPointers);
|
||||||
|
|
||||||
void addFunc(const char* name,
|
void addFunc(const char* name,
|
||||||
Object (* func)(Object*, int, struct Environment*),
|
Object (* func)(Object*, int, struct Environment*),
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
#include "env.h"
|
#include "env.h"
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
|
|
||||||
#define static_assert _Static_assert
|
|
||||||
|
|
||||||
#define array_length(_array) (sizeof(_array) / sizeof((_array)[0]))
|
#define array_length(_array) (sizeof(_array) / sizeof((_array)[0]))
|
||||||
|
|
||||||
#define UNPACK(...) __VA_ARGS__
|
#define UNPACK(...) __VA_ARGS__
|
||||||
|
@ -15,7 +13,7 @@
|
||||||
#define fnn(_name, _docs, ...) \
|
#define fnn(_name, _docs, ...) \
|
||||||
static const char * const _name ## Doc = _docs; \
|
static const char * const _name ## Doc = _docs; \
|
||||||
static const char * const _name ## Tests[] = {__VA_ARGS__}; \
|
static const char * const _name ## Tests[] = {__VA_ARGS__}; \
|
||||||
static_assert(array_length(_name ## Tests) % 2 == 0, "Array of test strings must have exactly one expected result for each test."); \
|
_Static_assert(array_length(_name ## Tests) % 2 == 0, "Array of test strings must have exactly one expected result for each test."); \
|
||||||
Object _name(Object* params, int length, struct Environment* env)
|
Object _name(Object* params, int length, struct Environment* env)
|
||||||
|
|
||||||
// GCC warns without the attribute, even when typeChecks are used
|
// GCC warns without the attribute, even when typeChecks are used
|
||||||
|
|
|
@ -358,7 +358,11 @@ Object numToChar(Object* params, int length, struct Environment* env)
|
||||||
|
|
||||||
Object printEnvO(Object* params, int length, struct Environment* env)
|
Object printEnvO(Object* params, int length, struct Environment* env)
|
||||||
{
|
{
|
||||||
printEnv(global());
|
int printPointers = 0;
|
||||||
|
if (length > 0 && params[0].type == TYPE_BOOL) {
|
||||||
|
printPointers = params[0].number;
|
||||||
|
}
|
||||||
|
printEnv(global(), printPointers);
|
||||||
return numberObject(0);
|
return numberObject(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
src/plfunc.h
13
src/plfunc.h
|
@ -200,7 +200,12 @@ tfn(numToChar, "ch",
|
||||||
"(ch 0x21)", "!",
|
"(ch 0x21)", "!",
|
||||||
);
|
);
|
||||||
|
|
||||||
fn(printEnvO, "penv", "Prints out the current scoped environment.");
|
fn(printEnvO, "penv",
|
||||||
|
"Prints out the current scoped environment.\n"
|
||||||
|
"(penv) prints a mostly human-readable list of env variables.\n"
|
||||||
|
"(penv T) prints a mostly list of env variables, including pointer addresses.\n"
|
||||||
|
"Calling (penv) with no argument is equivalent to (penv F)"
|
||||||
|
);
|
||||||
|
|
||||||
tfn(systemCall, "sys",
|
tfn(systemCall, "sys",
|
||||||
({ isStringy, isNumber }),
|
({ isStringy, isNumber }),
|
||||||
|
@ -238,9 +243,9 @@ tfn(getEnvVar, "env",
|
||||||
"(env HOME) => /home/sagevaillancourt"
|
"(env HOME) => /home/sagevaillancourt"
|
||||||
);
|
);
|
||||||
|
|
||||||
/// () => struct Time
|
tfn(getTime, "time",
|
||||||
fn(getTime, "time",
|
({ isStruct }),
|
||||||
"Get a struct of the current time with fields (minute hour sec)."
|
"Get a struct of the current time with fields (minute hour sec)."
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // STANDALONE
|
#endif // STANDALONE
|
||||||
|
|
Loading…
Reference in New Issue