ekBool ekCompilerFormatErrors(ekCompiler *compiler, ekString *output) { struct ekContext *E = compiler->E; ekS32 i; for(i = 0; i < ekArraySize(E, &compiler->errors); i++) { ekError *error = compiler->errors[i]; ekStringConcat(E, output, ekStringSafePtr(&error->filename)); ekStringConcat(E, output, ":"); appendInt(E, output, error->lineNo); ekStringConcat(E, output, ":"); appendInt(E, output, error->col + 1); // "column" in an error is 1-indexed ekStringConcat(E, output, ": error: "); ekStringConcat(E, output, ekStringSafePtr(&error->explanation)); ekStringConcat(E, output, "\n"); if(error->line.len > 0) { ekS32 caratPos = error->col; ekStringConcat(E, output, ekStringSafePtr(&error->line)); ekStringConcat(E, output, "\n"); // draw the carat! for(; caratPos > 0; --caratPos) { ekStringConcat(E, output, " "); // how about that efficiency! /s } ekStringConcat(E, output, "^\n"); } } return (ekArraySize(E, &compiler->errors) > 0) ? ekTrue : ekFalse; }
static void fileFuncDump(struct ekContext *E, ekDumpParams *params, struct ekValue *p) { ekFile *file = (ekFile *)p->ptrVal; ekStringConcat(E, ¶ms->output, "{ "); ekStringConcat(E, ¶ms->output, "FILE: "); ekStringConcat(E, ¶ms->output, ekValueSafeStr(file->filename)); ekStringConcat(E, ¶ms->output, " }"); }
static void regexFuncDump(struct ekContext * E, ekDumpParams * params, struct ekValue * p) { // TODO: implement something interesting ekStringConcat(E, ¶ms->output, "regex"); }
static void intFuncDump(struct ekContext * E, ekDumpParams * params, struct ekValue * p) { char temp[64]; sprintf(temp, "%d", p->intVal); ekStringConcat(E, ¶ms->output, temp); }
static void appendInt(ekContext *E, ekString *str, ekS32 i) { char temp[32]; sprintf(temp, "%d", i); ekStringConcat(E, str, temp); }