|
- typedef enum {
- Log_Level_Critical,
- Log_Level_Warning,
- Log_Level_Info,
- Log_Level_Debug,
- } Log_Level;
-
- void log_message(Log_Level type, char* message) {
- char* prefix;
- switch (type) {
- case Log_Level_Critical: prefix = "CRIT"; break;
- case Log_Level_Warning: prefix = "WARN"; break;
- case Log_Level_Info: prefix = "INFO"; break;
- case Log_Level_Debug: prefix = "DBUG"; break;
- }
- printf("%s: %s",prefix, message);
- }
-
- char* read_entire_file (char* filename) {
- char *fileContent = NULL;
- FILE *fp = fopen(filename, "r");
- if (fp != NULL) {
- /* Go to the end of the file. */
- if (fseek(fp, 0L, SEEK_END) == 0) {
- /* Get the size of the file. */
- long bufsize = ftell(fp);
- if (bufsize == -1) {
- fputs("Empty file", stderr);
- goto closeFile;
- }
-
- /* Go back to the start of the file. */
- if (fseek(fp, 0L, SEEK_SET) != 0) {
- fputs("Error reading file", stderr);
- goto closeFile;
- }
-
- /* Allocate our buffer to that size. */
- fileContent = malloc(sizeof(char) * (bufsize));
-
- /* Read the entire file into memory. */
- size_t newLen = fread(fileContent, sizeof(char), bufsize, fp);
- if ( ferror( fp ) != 0 ) {
- fputs("Error reading file", stderr);
- }
- }
- closeFile:
- fclose(fp);
- }
-
- return fileContent;
- /* Don't forget to call free() later! */
- }
-
- void print(Ast_Node* node) {
- switch (node->type) {
- case (Ast_Node_Type_Nil): {
- printf("nil");
- } break;
- case (Ast_Node_Type_Number): {
- printf("%f", node->value.number->value);
- } break;
- case (Ast_Node_Type_String): {
- printf("\"%s\"", node->value.string->value);
- } break;
- case (Ast_Node_Type_Symbol): {
- printf("%s", node->value.symbol->identifier);
- } break;
- case (Ast_Node_Type_Function): {
- printf("[lambda]");
- } break;
- case (Ast_Node_Type_Built_In_Function): {
- printf("[built-in-function %s]", node->value.built_in_function->identifier);
- } break;
- case (Ast_Node_Type_Cons_Cell): {
- printf("(");
- if (node->value.cons_cell->first)
- print(node->value.cons_cell->first);
- else
- printf("nil");
-
- printf(" . ");
-
- if (node->value.cons_cell->rest)
- print(node->value.cons_cell->rest);
- else
- printf("nil");
- printf(")");
- } break;
- }
- }
|