Skip to content

Commit

Permalink
Merge pull request #9 from aodinokov/logging_attempt_2
Browse files Browse the repository at this point in the history
Logging attempt 2
  • Loading branch information
aodinokov authored Jun 19, 2024
2 parents 25afc71 + ee55209 commit 81bdf27
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 150 deletions.
8 changes: 6 additions & 2 deletions examples/c_print_args/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ clean:
$(MAKE) -C $(METAC_ROOT) M=$(PWD) clean

test:
$(MAKE) -C $(METAC_ROOT) M=$(PWD) test

.PHONY: all clean
endif
Expand All @@ -22,12 +23,12 @@ rules+=\
main.reflect.c

TPL-c_print_args:=bin_target
IN-c_print_args=main.o main.reflect.o
IN-c_print_args=print_args.o main.o main.reflect.o
LDFLAGS-c_print_args=-Lsrc -lmetac
DEPS-c_print_args=src/libmetac.a

TPL-_meta_c_print_args:=bin_target
IN-_meta_c_print_args=main.meta.o
IN-_meta_c_print_args=print_args.meta.o main.meta.o
LDFLAGS-_meta_c_print_args=-Lsrc -lmetac
DEPS-_meta_c_print_args=src/libmetac.a
POST-_meta_c_print_args=$(METAC_POST_META)
Expand All @@ -36,3 +37,6 @@ TPL-main.reflect.c:=metac_target
METACFLAGS-main.reflect.c+=run metac-reflect-gen $(METAC_OVERRIDE_IN_TYPE)
IN-main.reflect.c=_meta_c_print_args

#link tests with libmetac
LDFLAGS-print_args_test=-Lsrc -lmetac
DEPS-print_args_test=src/libmetac.a
149 changes: 1 addition & 148 deletions examples/c_print_args/main.c
Original file line number Diff line number Diff line change
@@ -1,153 +1,6 @@
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

#include "metac/reflect.h"

static metac_flag_t handle_sz(va_list *p_args, metac_size_t sz, char * p_buf /*max 16b */) {
if (p_buf == NULL) {
return 0;
}
#define _handle_sz_(_sz_) \
do { \
if (sz == _sz_) { \
char *x = va_arg(*p_args, char[_sz_]); \
memcpy(p_buf, x, sz); \
return 1; \
} \
} while(0)
_handle_sz_(1);
_handle_sz_(2);
_handle_sz_(3);
_handle_sz_(4);
_handle_sz_(5);
_handle_sz_(6);
_handle_sz_(7);
_handle_sz_(8);
_handle_sz_(9);
_handle_sz_(10);
_handle_sz_(11);
_handle_sz_(12);
_handle_sz_(13);
_handle_sz_(14);
_handle_sz_(15);
_handle_sz_(16);
#undef _handle_sz_
return 0;
}

void vprint_args(metac_tag_map_t * p_tag_map, metac_flag_t calling, metac_entry_t *p_entry, metac_value_t * p_res, va_list args) {
if (p_entry == NULL || metac_entry_has_paremeters(p_entry) == 0) {
return;
}

if (calling == 1) {
printf("calling ");
}

printf("%s(", metac_entry_name(p_entry));

char buf[16];

for (int i = 0; i < metac_entry_paremeters_count(p_entry); ++i) {
if (i > 0) {
printf(", ");
}

metac_entry_t * p_param_entry = metac_entry_by_paremeter_id(p_entry, i);
if (metac_entry_is_parameter(p_param_entry) == 0) {
// something is wrong
break;
}
if (metac_entry_is_unspecified_parameter(p_param_entry) != 0) {
// we don't support printing va_args... there is no generic way
printf("...");
break;
}

metac_name_t param_name = metac_entry_name(p_param_entry);
metac_entry_t * p_param_type_entry = metac_entry_parameter_entry(p_param_entry);
if (param_name == NULL || p_param_type_entry == NULL) {
// something is wrong
break;
}

metac_size_t param_byte_sz = 0;
if (metac_entry_byte_size(p_param_type_entry, &param_byte_sz) != 0) {
// something is wrong
break;
}

int handled = handle_sz(&args, param_byte_sz, &buf[0]);
if (handled == 0) {
break;
}

metac_value_t * p_val = metac_new_value(p_param_type_entry, &buf[0]);
if (p_val == NULL) {
break;
}
char * v = metac_value_string_ex(p_val, METAC_WMODE_deep, p_tag_map);
if (v == NULL) {
metac_value_delete(p_val);
break;
}
char * arg_decl = metac_entry_cdecl(p_param_type_entry);
if (arg_decl == NULL) {
free(v);
metac_value_delete(p_val);
break;
}

printf(arg_decl, param_name);
printf(" = %s", v);

free(arg_decl);
free(v);

metac_value_delete(p_val);

}
printf(")");

if (calling == 0) {
printf(" returned");
if (p_res != NULL) {
char * v = metac_value_string_ex(p_res, METAC_WMODE_deep, p_tag_map);
if (v == NULL) {
return;
}
printf(" %s", v);

free(v);

metac_value_delete(p_res);
}
}

printf("\n");
}

void print_args(metac_tag_map_t * p_tag_map, metac_flag_t calling, metac_entry_t *p_entry, metac_value_t * p_res, ...) {
va_list args;
va_start(args, p_res);
vprint_args(p_tag_map, calling, p_entry, p_res, args);
va_end(args);
return;
}

#define METAC_WRAP_FN_NORES(_fn_, _args_...) { \
print_args(NULL, 1, METAC_GSYM_LINK_ENTRY(_fn_), NULL, _args_); \
_fn_(_args_); \
print_args(NULL, 0, METAC_GSYM_LINK_ENTRY(_fn_), NULL, _args_); \
}
#define METAC_WRAP_FN_RES(_type_, _fn_, _args_...) ({ \
print_args(NULL, 1, METAC_GSYM_LINK_ENTRY(_fn_), NULL, _args_); \
WITH_METAC_DECLLOC(loc, _type_ res = _fn_(_args_)); \
print_args(NULL, 0, METAC_GSYM_LINK_ENTRY(_fn_), METAC_VALUE_FROM_DECLLOC(loc, res), _args_); \
res; \
})
#include "print_args.h"

#define DEBUG

Expand Down
132 changes: 132 additions & 0 deletions examples/c_print_args/print_args.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

#include "print_args.h"

void vprint_args(metac_tag_map_t * p_tag_map, metac_flag_t calling, metac_entry_t *p_entry, metac_value_t * p_res, va_list args) {
if (p_entry == NULL || metac_entry_has_paremeters(p_entry) == 0) {
return;
}

if (calling == 1) {
printf("calling ");
}

printf("%s(", metac_entry_name(p_entry));

char buf[16];

for (int i = 0; i < metac_entry_paremeters_count(p_entry); ++i) {
if (i > 0) {
printf(", ");
}

metac_entry_t * p_param_entry = metac_entry_by_paremeter_id(p_entry, i);
if (metac_entry_is_parameter(p_param_entry) == 0) {
// something is wrong
break;
}
if (metac_entry_is_unspecified_parameter(p_param_entry) != 0) {
// we don't support printing va_args... there is no generic way
printf("...");
break;
}

metac_name_t param_name = metac_entry_name(p_param_entry);
metac_entry_t * p_param_type_entry = metac_entry_parameter_entry(p_param_entry);
if (param_name == NULL || p_param_type_entry == NULL) {
// something is wrong
break;
}

metac_size_t param_byte_sz = 0;
if (metac_entry_byte_size(p_param_type_entry, &param_byte_sz) != 0) {
// something is wrong
break;
}

int handled = 0;
#define _handle_sz_(_sz_) \
do { \
if (param_byte_sz == _sz_) { \
char *x = va_arg(args, char[_sz_]); \
if (x == NULL) { break; } \
memcpy(buf, x, param_byte_sz); \
handled = 1; \
} \
} while(0)
_handle_sz_(1);
_handle_sz_(2);
_handle_sz_(3);
_handle_sz_(4);
_handle_sz_(5);
_handle_sz_(6);
_handle_sz_(7);
_handle_sz_(8);
_handle_sz_(9);
_handle_sz_(10);
_handle_sz_(11);
_handle_sz_(12);
_handle_sz_(13);
_handle_sz_(14);
_handle_sz_(15);
_handle_sz_(16);
#undef _handle_sz_
if (handled == 0) {
break;
}

metac_value_t * p_val = metac_new_value(p_param_type_entry, &buf[0]);
if (p_val == NULL) {
break;
}
char * v = metac_value_string_ex(p_val, METAC_WMODE_deep, p_tag_map);
if (v == NULL) {
metac_value_delete(p_val);
break;
}
char * arg_decl = metac_entry_cdecl(p_param_type_entry);
if (arg_decl == NULL) {
free(v);
metac_value_delete(p_val);
break;
}

printf(arg_decl, param_name);
printf(" = %s", v);

free(arg_decl);
free(v);

metac_value_delete(p_val);

}
printf(")");

if (calling == 0) {
printf(" returned");
if (p_res != NULL) {
char * v = metac_value_string_ex(p_res, METAC_WMODE_deep, p_tag_map);
if (v == NULL) {
return;
}
printf(" %s", v);

free(v);

metac_value_delete(p_res);
}
}

printf("\n");
}

void print_args(metac_tag_map_t * p_tag_map, metac_flag_t calling, metac_entry_t *p_entry, metac_value_t * p_res, ...) {
va_list args;
va_start(args, p_res);
vprint_args(p_tag_map, calling, p_entry, p_res, args);
va_end(args);
return;
}
22 changes: 22 additions & 0 deletions examples/c_print_args/print_args.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#ifndef PRINT_ARGS_H_
#define PRINT_ARGS_H_

#include "metac/reflect.h"

void vprint_args(metac_tag_map_t * p_tag_map, metac_flag_t calling, metac_entry_t *p_entry, metac_value_t * p_res, va_list args);
void print_args(metac_tag_map_t * p_tag_map, metac_flag_t calling, metac_entry_t *p_entry, metac_value_t * p_res, ...);

#define METAC_WRAP_FN_NORES(_fn_, _args_...) { \
print_args(NULL, 1, METAC_GSYM_LINK_ENTRY(_fn_), NULL, _args_); \
_fn_(_args_); \
print_args(NULL, 0, METAC_GSYM_LINK_ENTRY(_fn_), NULL, _args_); \
}
#define METAC_WRAP_FN_RES(_type_, _fn_, _args_...) ({ \
print_args(NULL, 1, METAC_GSYM_LINK_ENTRY(_fn_), NULL, _args_); \
WITH_METAC_DECLLOC(loc, _type_ res = _fn_(_args_)); \
print_args(NULL, 0, METAC_GSYM_LINK_ENTRY(_fn_), METAC_VALUE_FROM_DECLLOC(loc, res), _args_); \
res; \
})


#endif
14 changes: 14 additions & 0 deletions examples/c_print_args/print_args_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include "metac/test.h"

#include "print_args.c"

int test_function2_with_args(int *a, short b){
return *a + b + 999;
}
METAC_GSYM_LINK(test_function2_with_args);

METAC_START_TEST(sanity){
// this doesn't pass on Windows yet
// int x = 689;
// METAC_WRAP_FN_RES(int, test_function2_with_args, &x, 2);
}END_TEST

0 comments on commit 81bdf27

Please sign in to comment.