diff --git a/covpreproc.c b/covpreproc.c index af9c637..c8d570e 100644 --- a/covpreproc.c +++ b/covpreproc.c @@ -60,38 +60,38 @@ size_t count_block_bytes(FILE *f) { int is_cond_jump(const char *s) { s += strspn(s, " \t"); - int found = !strncasecmp(s, "jo", 2) - || !strncasecmp(s, "jno", 3) - || !strncasecmp(s, "js", 2) - || !strncasecmp(s, "jns", 3) - || !strncasecmp(s, "je", 2) - || !strncasecmp(s, "jne", 3) - || !strncasecmp(s, "jz", 2) - || !strncasecmp(s, "jnz", 3) - || !strncasecmp(s, "jb", 2) - || !strncasecmp(s, "jnb", 3) - || !strncasecmp(s, "jc", 2) - || !strncasecmp(s, "jnc", 3) - || !strncasecmp(s, "jae", 3) - || !strncasecmp(s, "jnae", 4) - || !strncasecmp(s, "jbe", 3) - || !strncasecmp(s, "jna", 3) - || !strncasecmp(s, "ja", 2) - || !strncasecmp(s, "jnbe", 4) - || !strncasecmp(s, "jl", 2) - || !strncasecmp(s, "jnge", 4) - || !strncasecmp(s, "jge", 3) - || !strncasecmp(s, "jnl", 3) - || !strncasecmp(s, "jle", 3) - || !strncasecmp(s, "jng", 3) - || !strncasecmp(s, "jg",2) - || !strncasecmp(s, "jnle", 4) - || !strncasecmp(s, "jp", 2) - || !strncasecmp(s, "jpe", 3) - || !strncasecmp(s, "jnp", 3) - || !strncasecmp(s, "jpo", 3) - || !strncasecmp(s, "jcxz", 4) - || !strncasecmp(s, "jecxz", 5); + int found = !strncmp(s, "jo", 2) + || !strncmp(s, "jno", 3) + || !strncmp(s, "js", 2) + || !strncmp(s, "jns", 3) + || !strncmp(s, "je", 2) + || !strncmp(s, "jne", 3) + || !strncmp(s, "jz", 2) + || !strncmp(s, "jnz", 3) + || !strncmp(s, "jb", 2) + || !strncmp(s, "jnb", 3) + || !strncmp(s, "jc", 2) + || !strncmp(s, "jnc", 3) + || !strncmp(s, "jae", 3) + || !strncmp(s, "jnae", 4) + || !strncmp(s, "jbe", 3) + || !strncmp(s, "jna", 3) + || !strncmp(s, "ja", 2) + || !strncmp(s, "jnbe", 4) + || !strncmp(s, "jl", 2) + || !strncmp(s, "jnge", 4) + || !strncmp(s, "jge", 3) + || !strncmp(s, "jnl", 3) + || !strncmp(s, "jle", 3) + || !strncmp(s, "jng", 3) + || !strncmp(s, "jg",2) + || !strncmp(s, "jnle", 4) + || !strncmp(s, "jp", 2) + || !strncmp(s, "jpe", 3) + || !strncmp(s, "jnp", 3) + || !strncmp(s, "jpo", 3) + || !strncmp(s, "jcxz", 4) + || !strncmp(s, "jecxz", 5); return found; } diff --git a/makefile b/makefile index 29ec28c..c92c369 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ FASM=fasm CC=gcc WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 -Wswitch -Wswitch-enum #-Wconversion -Wsign-conversion -CFLAGS=$(WARNINGS) -g -O0 -D_FILE_OFFSET_BITS=64 -Wno-address-of-packed-member -DNDEBUG -masm=intel +CFLAGS=$(WARNINGS) -std=c99 -g -O0 -D_FILE_OFFSET_BITS=64 -Wno-address-of-packed-member -DNDEBUG -masm=intel -D_POSIX_C_SOURCE=200809L CFLAGS_32=$(CFLAGS) -m32 LDFLAGS= LDFLAGS_32=$(LDFLAGS) -m32 @@ -51,10 +51,10 @@ vdisk.o: vdisk.c $(CC) $(CFLAGS_32) -c $< umka_shell.o: umka_shell.c kolibri.h trace.h syscalls.h - $(CC) $(CFLAGS_32) -c $< -std=c99 -D_POSIX_C_SOURCE=2 + $(CC) $(CFLAGS_32) -c $< umka_fuse.o: umka_fuse.c kolibri.h - $(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $< -std=gnu99 + $(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $< tools/mkdirrange: tools/mkdirrange.c $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ diff --git a/trace.c b/trace.c index 05e0e52..5891ed1 100644 --- a/trace.c +++ b/trace.c @@ -8,3 +8,11 @@ void trace_begin() { void trace_end() { trace_lbr_end(); } + +uint32_t trace_pause(void) { + return trace_lbr_pause(); +} + +void trace_resume(uint32_t value) { + trace_lbr_resume(value); +} diff --git a/trace.h b/trace.h index 4456509..84a526e 100644 --- a/trace.h +++ b/trace.h @@ -1,7 +1,13 @@ #ifndef TRACE_H_INCLUDED #define TRACE_H_INCLUDED +#define COVERAGE_ON() do { trace_resume(coverage); } while (0) + +#define COVERAGE_OFF() do { coverage = trace_pause(); } while (0) + void trace_begin(void); void trace_end(void); +uint32_t trace_pause(void); +void trace_resume(uint32_t value); #endif diff --git a/trace_lbr.c b/trace_lbr.c index 931331d..664015b 100644 --- a/trace_lbr.c +++ b/trace_lbr.c @@ -59,18 +59,23 @@ void handle_sigtrap() { wrmsr(MSR_IA32_DEBUGCTLMSR, 3); } -void set_eflags_tf(uint32_t tf) { +uint32_t set_eflags_tf(uint32_t tf) { + uint32_t prev; __asm__ __inline__ __volatile__ ( "pushfd;" "pop eax;" - "shl ecx, 8;" // TF - "and eax, ~(1 << 8);" + "ror eax, 8;" + "mov edx, eax;" + "and edx, 1;" + "and eax, ~1;" "or eax, ecx;" + "rol eax, 8;" "push eax;" "popfd" - : + : "=d"(prev) : "c"(tf) : "eax", "memory"); + return prev; } void trace_lbr_begin() { @@ -92,12 +97,18 @@ void trace_lbr_begin() { void *coverage_end_addr = &coverage_end; write(covfd, &coverage_begin_addr, 4); write(covfd, &coverage_end_addr, 4); - set_eflags_tf(1); } void trace_lbr_end() { - set_eflags_tf(0); wrmsr(MSR_IA32_DEBUGCTLMSR, 0); close(msrfd); close(covfd); } + +uint32_t trace_lbr_pause(void) { + return set_eflags_tf(0u); +} + +void trace_lbr_resume(uint32_t value) { + set_eflags_tf(value); +} diff --git a/trace_lbr.h b/trace_lbr.h index a29a1e0..6064b85 100644 --- a/trace_lbr.h +++ b/trace_lbr.h @@ -1,7 +1,11 @@ #ifndef TRACE_LBR_H_INCLUDED #define TRACE_LBR_H_INCLUDED +#include + void trace_lbr_begin(void); void trace_lbr_end(void); +uint32_t trace_lbr_pause(void); +void trace_lbr_resume(uint32_t value); #endif diff --git a/umka_shell.c b/umka_shell.c index 2aa31e7..fc3dc37 100644 --- a/umka_shell.c +++ b/umka_shell.c @@ -61,7 +61,7 @@ const char *last_dir = cur_dir; bool cur_dir_changed = true; char cmd_buf[FGETS_BUF_LEN]; -int trace = 0; +uint32_t coverage = 0; const char *f70_status_name[] = { "success", @@ -177,7 +177,9 @@ const char *get_last_dir(const char *path) { void prompt() { if (cur_dir_changed) { + COVERAGE_ON(); umka_sys_get_cwd(cur_dir, PATH_MAX); + COVERAGE_OFF(); last_dir = get_last_dir(cur_dir); cur_dir_changed = false; } @@ -198,7 +200,7 @@ int split_args(char *s, char **argv) { return argc; } -void umka_disk_list_partitions(disk_t *d) { +void shell_disk_list_partitions(disk_t *d) { for (size_t i = 0; i < d->num_partitions; i++) { printf("/%s/%d: ", d->name, i+1); if (d->partitions[i]->fs_user_functions == xfs_user_functions) { @@ -215,7 +217,7 @@ void umka_disk_list_partitions(disk_t *d) { } } -void umka_disk_add(int argc, char **argv) { +void shell_disk_add(int argc, char **argv) { const char *usage = \ "usage: disk_add [option]...\n" " absolute or relative path\n" @@ -244,10 +246,14 @@ void umka_disk_add(int argc, char **argv) { void *userdata = vdisk_init(file_name, cache_size); if (userdata) { + COVERAGE_ON(); void *vdisk = disk_add(&vdisk_functions, disk_name, userdata, 0); + COVERAGE_OFF(); if (vdisk) { + COVERAGE_ON(); disk_media_changed(vdisk, 1); - umka_disk_list_partitions(vdisk); + COVERAGE_OFF(); + shell_disk_list_partitions(vdisk); return; } } @@ -255,20 +261,22 @@ void umka_disk_add(int argc, char **argv) { return; } -void umka_disk_del_by_name(const char *name) { +void shell_disk_del_by_name(const char *name) { for(disk_t *d = disk_list.next; d != &disk_list; d = d->next) { if (!strcmp(d->name, name)) { + COVERAGE_ON(); disk_del(d); + COVERAGE_OFF(); return; } } printf("umka: can't find disk '%s'\n", name); } -void umka_disk_del(int argc, char **argv) { +void shell_disk_del(int argc, char **argv) { (void)argc; const char *name = argv[1]; - umka_disk_del_by_name(name); + shell_disk_del_by_name(name); return; } @@ -277,19 +285,23 @@ void shell_pwd(int argc, char **argv) { (void)argv; bool quoted = false; const char *quote = quoted ? "'" : ""; + COVERAGE_ON(); umka_sys_get_cwd(cur_dir, PATH_MAX); + COVERAGE_OFF(); printf("%s%s%s\n", quote, cur_dir, quote); } -void umka_set_pixel(int argc, char **argv) { +void shell_set_pixel(int argc, char **argv) { size_t x = strtoul(argv[1], NULL, 0); size_t y = strtoul(argv[2], NULL, 0); uint32_t color = strtoul(argv[3], NULL, 16); int invert = (argc == 5) && !strcmp(argv[4], "-i"); + COVERAGE_ON(); umka_sys_set_pixel(x, y, color, invert); + COVERAGE_OFF(); } -void umka_write_text(int argc, char **argv) { +void shell_write_text(int argc, char **argv) { (void)argc; size_t x = strtoul(argv[1], NULL, 0); size_t y = strtoul(argv[2], NULL, 0); @@ -302,10 +314,12 @@ void umka_write_text(int argc, char **argv) { int scale_factor = strtoul(argv[9], NULL, 0); int length = strtoul(argv[10], NULL, 0); int background_color_or_buffer = strtoul(argv[11], NULL, 0); + COVERAGE_ON(); umka_sys_write_text(x, y, color, asciiz, fill_background, font_and_encoding, draw_to_buffer, scale_factor, string, length, background_color_or_buffer); + COVERAGE_OFF(); } -void umka_dump_win_stack(int argc, char **argv) { +void shell_dump_win_stack(int argc, char **argv) { int depth = 5; if (argc > 1) { depth = strtol(argv[1], NULL, 0); @@ -315,7 +329,7 @@ void umka_dump_win_stack(int argc, char **argv) { } } -void umka_dump_win_pos(int argc, char **argv) { +void shell_dump_win_pos(int argc, char **argv) { int depth = 5; if (argc > 1) { depth = strtol(argv[1], NULL, 0); @@ -325,11 +339,13 @@ void umka_dump_win_pos(int argc, char **argv) { } } -void umka_process_info(int argc, char **argv) { +void shell_process_info(int argc, char **argv) { (void)argc; process_information_t info; int32_t pid = strtol(argv[1], NULL, 0); + COVERAGE_ON(); umka_sys_process_info(pid, &info); + COVERAGE_OFF(); printf("cpu_usage: %u\n", info.cpu_usage); printf("window_stack_position: %u\n", info.window_stack_position); printf("window_stack_value: %u\n", info.window_stack_value); @@ -343,7 +359,7 @@ void umka_process_info(int argc, char **argv) { printf("wnd_state: 0x%.2" PRIx8 "\n", info.wnd_state); } -void umka_display_number(int argc, char **argv) { +void shell_display_number(int argc, char **argv) { (void)argc; int is_pointer = strtoul(argv[1], NULL, 0); int base = strtoul(argv[2], NULL, 0); @@ -363,10 +379,12 @@ void umka_display_number(int argc, char **argv) { int draw_to_buffer = strtoul(argv[12], NULL, 0); int scale_factor = strtoul(argv[13], NULL, 0); uintptr_t background_color_or_buffer = strtoul(argv[14], NULL, 16); + COVERAGE_ON(); umka_sys_display_number(is_pointer, base, digits_to_display, is_qword, show_leading_zeros, number_or_pointer, x, y, color, fill_background, font, draw_to_buffer, scale_factor, background_color_or_buffer); + COVERAGE_OFF(); } -void umka_set_window_colors(int argc, char **argv) { +void shell_set_window_colors(int argc, char **argv) { if (argc != (1 + sizeof(system_colors_t)/4)) { printf("10 colors required\n"); return; @@ -382,14 +400,18 @@ void umka_set_window_colors(int argc, char **argv) { colors.work_button_text = strtoul(argv[8], NULL, 16); colors.work_text = strtoul(argv[9], NULL, 16); colors.work_graph = strtoul(argv[10], NULL, 16); + COVERAGE_ON(); umka_sys_set_window_colors(&colors); + COVERAGE_OFF(); } -void umka_get_window_colors(int argc, char **argv) { +void shell_get_window_colors(int argc, char **argv) { (void)argc; (void)argv; system_colors_t colors; + COVERAGE_ON(); umka_sys_get_window_colors(&colors); + COVERAGE_OFF(); printf("0x%.8" PRIx32 " frame\n", colors.frame); printf("0x%.8" PRIx32 " grab\n", colors.grab); printf("0x%.8" PRIx32 " work_3d_dark\n", colors.work_3d_dark); @@ -402,25 +424,29 @@ void umka_get_window_colors(int argc, char **argv) { printf("0x%.8" PRIx32 " work_graph\n", colors.work_graph); } -void umka_get_skin_height(int argc, char **argv) { +void shell_get_skin_height(int argc, char **argv) { (void)argc; (void)argv; + COVERAGE_ON(); uint32_t skin_height = umka_sys_get_skin_height(); + COVERAGE_OFF(); printf("%" PRIu32 "\n", skin_height); } -void umka_get_screen_area(int argc, char **argv) { +void shell_get_screen_area(int argc, char **argv) { (void)argc; (void)argv; rect_t wa; + COVERAGE_ON(); umka_sys_get_screen_area(&wa); + COVERAGE_OFF(); printf("%" PRIu32 " left\n", wa.left); printf("%" PRIu32 " top\n", wa.top); printf("%" PRIu32 " right\n", wa.right); printf("%" PRIu32 " bottom\n", wa.bottom); } -void umka_set_screen_area(int argc, char **argv) { +void shell_set_screen_area(int argc, char **argv) { if (argc != 5) { printf("left top right bottom\n"); return; @@ -430,61 +456,77 @@ void umka_set_screen_area(int argc, char **argv) { wa.top = strtoul(argv[2], NULL, 0); wa.right = strtoul(argv[3], NULL, 0); wa.bottom = strtoul(argv[4], NULL, 0); + COVERAGE_ON(); umka_sys_set_screen_area(&wa); + COVERAGE_OFF(); } -void umka_get_skin_margins(int argc, char **argv) { +void shell_get_skin_margins(int argc, char **argv) { (void)argc; (void)argv; rect_t wa; + COVERAGE_ON(); umka_sys_get_skin_margins(&wa); + COVERAGE_OFF(); printf("%" PRIu32 " left\n", wa.left); printf("%" PRIu32 " top\n", wa.top); printf("%" PRIu32 " right\n", wa.right); printf("%" PRIu32 " bottom\n", wa.bottom); } -void umka_set_button_style(int argc, char **argv) { +void shell_set_button_style(int argc, char **argv) { (void)argc; uint32_t style = strtoul(argv[1], NULL, 0); + COVERAGE_ON(); umka_sys_set_button_style(style); + COVERAGE_OFF(); } -void umka_set_skin(int argc, char **argv) { +void shell_set_skin(int argc, char **argv) { (void)argc; const char *path = argv[1]; + COVERAGE_ON(); int32_t status = umka_sys_set_skin(path); + COVERAGE_OFF(); printf("status: %" PRIi32 "\n", status); } -void umka_get_font_smoothing(int argc, char **argv) { +void shell_get_font_smoothing(int argc, char **argv) { (void)argc; (void)argv; const char *names[] = {"off", "anti-aliasing", "subpixel"}; + COVERAGE_ON(); int type = umka_sys_get_font_smoothing(); + COVERAGE_OFF(); printf("font smoothing: %i - %s\n", type, names[type]); } -void umka_set_font_smoothing(int argc, char **argv) { +void shell_set_font_smoothing(int argc, char **argv) { (void)argc; int type = strtol(argv[1], NULL, 0); + COVERAGE_ON(); umka_sys_set_font_smoothing(type); + COVERAGE_OFF(); } -void umka_get_font_size(int argc, char **argv) { +void shell_get_font_size(int argc, char **argv) { (void)argc; (void)argv; + COVERAGE_ON(); size_t size = umka_sys_get_font_size(); + COVERAGE_OFF(); printf("%upx\n", size); } -void umka_set_font_size(int argc, char **argv) { +void shell_set_font_size(int argc, char **argv) { (void)argc; uint32_t size = strtoul(argv[1], NULL, 0); + COVERAGE_ON(); umka_sys_set_font_size(size); + COVERAGE_OFF(); } -void umka_button(int argc, char **argv) { +void shell_button(int argc, char **argv) { (void)argc; size_t x = strtoul(argv[1], NULL, 0); size_t xsize = strtoul(argv[2], NULL, 0); @@ -494,10 +536,12 @@ void umka_button(int argc, char **argv) { uint32_t color = strtoul(argv[6], NULL, 16); int draw_button = strtoul(argv[7], NULL, 0); int draw_frame = strtoul(argv[8], NULL, 0); + COVERAGE_ON(); umka_sys_button(x, xsize, y, ysize, button_id, draw_button, draw_frame, color); + COVERAGE_OFF(); } -void umka_put_image(int argc, char **argv) { +void shell_put_image(int argc, char **argv) { (void)argc; FILE *f = fopen(argv[1], "r"); fseek(f, 0, SEEK_END); @@ -510,11 +554,13 @@ void umka_put_image(int argc, char **argv) { size_t ysize = strtoul(argv[3], NULL, 0); size_t x = strtoul(argv[4], NULL, 0); size_t y = strtoul(argv[5], NULL, 0); + COVERAGE_ON(); umka_sys_put_image(image, xsize, ysize, x, y); + COVERAGE_OFF(); free(image); } -void umka_put_image_palette(int argc, char **argv) { +void shell_put_image_palette(int argc, char **argv) { (void)argc; FILE *f = fopen(argv[1], "r"); fseek(f, 0, SEEK_END); @@ -530,47 +576,57 @@ void umka_put_image_palette(int argc, char **argv) { size_t bpp = strtoul(argv[6], NULL, 0); void *palette = NULL; size_t row_offset = strtoul(argv[7], NULL, 0); + COVERAGE_ON(); umka_sys_put_image_palette(image, xsize, ysize, x, y, bpp, palette, row_offset); + COVERAGE_OFF(); free(image); } -void umka_draw_rect(int argc, char **argv) { +void shell_draw_rect(int argc, char **argv) { size_t x = strtoul(argv[1], NULL, 0); size_t xsize = strtoul(argv[2], NULL, 0); size_t y = strtoul(argv[3], NULL, 0); size_t ysize = strtoul(argv[4], NULL, 0); uint32_t color = strtoul(argv[5], NULL, 16); int gradient = (argc == 7) && !strcmp(argv[6], "-g"); + COVERAGE_ON(); umka_sys_draw_rect(x, xsize, y, ysize, color, gradient); + COVERAGE_OFF(); } -void umka_get_screen_size(int argc, char **argv) { +void shell_get_screen_size(int argc, char **argv) { (void)argc; (void)argv; uint32_t xsize, ysize; + COVERAGE_ON(); umka_sys_get_screen_size(&xsize, &ysize); + COVERAGE_OFF(); printf("%" PRIu32 "x%" PRIu32 "\n", xsize, ysize); } -void umka_draw_line(int argc, char **argv) { +void shell_draw_line(int argc, char **argv) { size_t x = strtoul(argv[1], NULL, 0); size_t xend = strtoul(argv[2], NULL, 0); size_t y = strtoul(argv[3], NULL, 0); size_t yend = strtoul(argv[4], NULL, 0); uint32_t color = strtoul(argv[5], NULL, 16); int invert = (argc == 7) && !strcmp(argv[6], "-i"); + COVERAGE_ON(); umka_sys_draw_line(x, xend, y, yend, color, invert); + COVERAGE_OFF(); } -void umka_set_window_caption(int argc, char **argv) { +void shell_set_window_caption(int argc, char **argv) { (void)argc; const char *caption = argv[1]; int encoding = strtoul(argv[2], NULL, 0); + COVERAGE_ON(); umka_sys_set_window_caption(caption, encoding); + COVERAGE_OFF(); } -void umka_draw_window(int argc, char **argv) { +void shell_draw_window(int argc, char **argv) { (void)argc; size_t x = strtoul(argv[1], NULL, 0); size_t xsize = strtoul(argv[2], NULL, 0); @@ -584,25 +640,31 @@ void umka_draw_window(int argc, char **argv) { int movable = strtoul(argv[10], NULL, 0); int style = strtoul(argv[11], NULL, 0); const char *caption = argv[12]; + COVERAGE_ON(); umka_sys_draw_window(x, xsize, y, ysize, color, has_caption, client_relative, fill_workarea, gradient_fill, movable, style, caption); + COVERAGE_OFF(); } -void umka_window_redraw(int argc, char **argv) { +void shell_window_redraw(int argc, char **argv) { (void)argc; int begin_end = strtoul(argv[1], NULL, 0); + COVERAGE_ON(); umka_sys_window_redraw(begin_end); + COVERAGE_OFF(); } -void umka_move_window(int argc, char **argv) { +void shell_move_window(int argc, char **argv) { (void)argc; size_t x = strtoul(argv[1], NULL, 0); size_t y = strtoul(argv[2], NULL, 0); ssize_t xsize = strtol(argv[3], NULL, 0); ssize_t ysize = strtol(argv[4], NULL, 0); + COVERAGE_ON(); umka_sys_move_window(x, y, xsize, ysize); + COVERAGE_OFF(); } -void umka_blit_bitmap(int argc, char **argv) { +void shell_blit_bitmap(int argc, char **argv) { (void)argc; FILE *f = fopen(argv[1], "r"); fseek(f, 0, SEEK_END); @@ -625,14 +687,18 @@ void umka_blit_bitmap(int argc, char **argv) { int client_relative = strtoul(argv[13], NULL, 0); int row_length = strtoul(argv[14], NULL, 0); uint32_t params[] = {dstx, dsty, dstxsize, dstysize, srcx, srcy, srcxsize, srcysize, (uintptr_t)image, row_length}; + COVERAGE_ON(); umka_sys_blit_bitmap(operation, background, transparent, client_relative, params); + COVERAGE_OFF(); free(image); } -void umka_scrot(int argc, char **argv) { +void shell_scrot(int argc, char **argv) { (void)argc; uint32_t xsize, ysize; + COVERAGE_ON(); umka_sys_get_screen_size(&xsize, &ysize); + COVERAGE_OFF(); uint32_t *lfb = kos_lfb_base; for (size_t y = 0; y < ysize; y++) { @@ -647,7 +713,9 @@ void umka_scrot(int argc, char **argv) { void shell_cd(int argc, char **argv) { (void)argc; + COVERAGE_ON(); umka_sys_set_cwd(argv[1]); + COVERAGE_OFF(); cur_dir_changed = true; } @@ -662,7 +730,9 @@ void ls_range(f7080s1arg_t *fX0, f70or80_t f70or80) { if (fX0->size > requested) { fX0->size = requested; } + COVERAGE_ON(); umka_sys_lfn(fX0, &r, f70or80); + COVERAGE_OFF(); fX0->offset += fX0->size; print_f70_status(&r, 1); f7080s1info_t *dir = fX0->buf; @@ -690,7 +760,9 @@ void ls_all(f7080s1arg_t *fX0, f70or80_t f70or80) { f7080ret_t r; size_t bdfe_len = (fX0->encoding == CP866) ? BDFE_LEN_CP866 : BDFE_LEN_UNICODE; while (true) { + COVERAGE_ON(); umka_sys_lfn(fX0, &r, f70or80); + COVERAGE_OFF(); print_f70_status(&r, 1); assert((r.status == ERROR_SUCCESS && r.count == fX0->size) || (r.status == ERROR_END_OF_FILE && r.count < fX0->size)); @@ -733,7 +805,7 @@ fs_enc_t parse_encoding(const char *str) { return enc; } -void umka_ls(int argc, char **argv, const char *usage, f70or80_t f70or80) { +void shell_ls(int argc, char **argv, const char *usage, f70or80_t f70or80) { int opt; optind = 1; const char *optstring = (f70or80 == F70) ? "f:c:e:" : "f:c:e:p:"; @@ -783,17 +855,17 @@ void umka_ls(int argc, char **argv, const char *usage, f70or80_t f70or80) { return; } -void umka_ls70(int argc, char **argv) { +void shell_ls70(int argc, char **argv) { const char *usage = \ "usage: ls70 [dir] [option]...\n" " -f number index of the first dir entry to read\n" " -c number number of dir entries to read\n" " -e encoding cp866|utf16|utf8\n" " return directory listing in this encoding"; - umka_ls(argc, argv, usage, F70); + shell_ls(argc, argv, usage, F70); } -void umka_ls80(int argc, char **argv) { +void shell_ls80(int argc, char **argv) { const char *usage = \ "usage: ls80 [dir] [option]...\n" " -f number index of the first dir entry to read\n" @@ -802,10 +874,10 @@ void umka_ls80(int argc, char **argv) { " return directory listing in this encoding\n" " -p encoding cp866|utf16|utf8\n" " path to dir is specified in this encoding"; - umka_ls(argc, argv, usage, F80); + shell_ls(argc, argv, usage, F80); } -void umka_stat(int argc, char **argv, f70or80_t f70or80) { +void shell_stat(int argc, char **argv, f70or80_t f70or80) { (void)argc; f7080s5arg_t fX0 = {.sf = 5, .flags = 0}; f7080ret_t r; @@ -818,7 +890,9 @@ void umka_stat(int argc, char **argv, f70or80_t f70or80) { fX0.u.f80.path_encoding = DEFAULT_PATH_ENCODING; fX0.u.f80.path = argv[1]; } + COVERAGE_ON(); umka_sys_lfn(&fX0, &r, f70or80); + COVERAGE_OFF(); print_f70_status(&r, 0); if (r.status != ERROR_SUCCESS) return; @@ -851,15 +925,15 @@ void umka_stat(int argc, char **argv, f70or80_t f70or80) { return; } -void umka_stat70(int argc, char **argv) { - umka_stat(argc, argv, F70); +void shell_stat70(int argc, char **argv) { + shell_stat(argc, argv, F70); } -void umka_stat80(int argc, char **argv) { - umka_stat(argc, argv, F80); +void shell_stat80(int argc, char **argv) { + shell_stat(argc, argv, F80); } -void umka_read(int argc, char **argv, f70or80_t f70or80) { +void shell_read(int argc, char **argv, f70or80_t f70or80) { (void)argc; f7080s0arg_t fX0 = {.sf = 0}; f7080ret_t r; @@ -897,7 +971,9 @@ void umka_read(int argc, char **argv, f70or80_t f70or80) { } fX0.buf = (uint8_t*)malloc(fX0.count); + COVERAGE_ON(); umka_sys_lfn(&fX0, &r, f70or80); + COVERAGE_OFF(); print_f70_status(&r, 1); if (r.status == ERROR_SUCCESS || r.status == ERROR_END_OF_FILE) { @@ -911,12 +987,12 @@ void umka_read(int argc, char **argv, f70or80_t f70or80) { return; } -void umka_read70(int argc, char **argv) { - umka_read(argc, argv, F70); +void shell_read70(int argc, char **argv) { + shell_read(argc, argv, F70); } -void umka_read80(int argc, char **argv) { - umka_read(argc, argv, F80); +void shell_read80(int argc, char **argv) { + shell_read(argc, argv, F80); } typedef struct { @@ -925,47 +1001,47 @@ typedef struct { } func_table_t; func_table_t funcs[] = { - { "disk_add", umka_disk_add }, - { "disk_del", umka_disk_del }, - { "ls70", umka_ls70 }, - { "ls80", umka_ls80 }, - { "stat70", umka_stat70 }, - { "stat80", umka_stat80 }, - { "read70", umka_read70 }, - { "read80", umka_read80 }, + { "disk_add", shell_disk_add }, + { "disk_del", shell_disk_del }, + { "ls70", shell_ls70 }, + { "ls80", shell_ls80 }, + { "stat70", shell_stat70 }, + { "stat80", shell_stat80 }, + { "read70", shell_read70 }, + { "read80", shell_read80 }, { "pwd", shell_pwd }, { "cd", shell_cd }, { "set_cwd", shell_cd }, - { "draw_window", umka_draw_window }, - { "set_pixel", umka_set_pixel }, - { "write_text", umka_write_text }, - { "put_image", umka_put_image }, - { "button", umka_button }, - { "process_info", umka_process_info }, - { "window_redraw", umka_window_redraw }, - { "draw_rect", umka_draw_rect }, - { "get_screen_size", umka_get_screen_size }, - { "draw_line", umka_draw_line }, - { "display_number", umka_display_number }, - { "set_button_style", umka_set_button_style }, - { "set_window_colors", umka_set_window_colors }, - { "get_window_colors", umka_get_window_colors }, - { "get_skin_height", umka_get_skin_height }, - { "get_screen_area", umka_get_screen_area }, - { "set_screen_area", umka_set_screen_area }, - { "get_skin_margins", umka_get_skin_margins }, - { "set_skin", umka_set_skin }, - { "get_font_smoothing", umka_get_font_smoothing }, - { "set_font_smoothing", umka_set_font_smoothing }, - { "get_font_size", umka_get_font_size }, - { "set_font_size", umka_set_font_size }, - { "put_image_palette", umka_put_image_palette }, - { "move_window", umka_move_window }, - { "set_window_caption", umka_set_window_caption }, - { "blit_bitmap", umka_blit_bitmap }, - { "scrot", umka_scrot }, - { "dump_win_stack", umka_dump_win_stack }, - { "dump_win_pos", umka_dump_win_pos }, + { "draw_window", shell_draw_window }, + { "set_pixel", shell_set_pixel }, + { "write_text", shell_write_text }, + { "put_image", shell_put_image }, + { "button", shell_button }, + { "process_info", shell_process_info }, + { "window_redraw", shell_window_redraw }, + { "draw_rect", shell_draw_rect }, + { "get_screen_size", shell_get_screen_size }, + { "draw_line", shell_draw_line }, + { "display_number", shell_display_number }, + { "set_button_style", shell_set_button_style }, + { "set_window_colors", shell_set_window_colors }, + { "get_window_colors", shell_get_window_colors }, + { "get_skin_height", shell_get_skin_height }, + { "get_screen_area", shell_get_screen_area }, + { "set_screen_area", shell_set_screen_area }, + { "get_skin_margins", shell_get_skin_margins }, + { "set_skin", shell_set_skin }, + { "get_font_smoothing", shell_get_font_smoothing }, + { "set_font_smoothing", shell_set_font_smoothing }, + { "get_font_size", shell_get_font_size }, + { "set_font_size", shell_set_font_size }, + { "put_image_palette", shell_put_image_palette }, + { "move_window", shell_move_window }, + { "set_window_caption", shell_set_window_caption }, + { "blit_bitmap", shell_blit_bitmap }, + { "scrot", shell_scrot }, + { "dump_win_stack", shell_dump_win_stack }, + { "dump_win_pos", shell_dump_win_pos }, { NULL, NULL }, }; @@ -977,7 +1053,7 @@ void *run_test(const char *infile_name) { outfile = stdout; } else { char outfile_name[PATH_MAX]; - strncpy(outfile_name, infile_name, PATH_MAX-2); // ".t" is shorter that ".out" + strncpy(outfile_name, infile_name, PATH_MAX-2); // ".t" is shorter than ".out" char *last_dot = strrchr(outfile_name, '.'); if (!last_dot) { printf("test file must have '.t' suffix\n"); @@ -993,7 +1069,7 @@ void *run_test(const char *infile_name) { } int is_tty = isatty(fileno(infile)); - char **cargv = (char**)malloc(sizeof(char*) * (MAX_COMMAND_ARGS + 1)); + char **argv = (char**)malloc(sizeof(char*) * (MAX_COMMAND_ARGS + 1)); while(next_line(infile, is_tty)) { if (cmd_buf[0] == '#' || cmd_buf[0] == '\n') { printf("%s", cmd_buf); @@ -1005,20 +1081,20 @@ void *run_test(const char *infile_name) { printf("%s", cmd_buf); fflush(outfile); } - int cargc = split_args(cmd_buf, cargv); + int argc = split_args(cmd_buf, argv); func_table_t *ft; for (ft = funcs; ft->name != NULL; ft++) { - if (!strcmp(cargv[0], ft->name)) { + if (!strcmp(argv[0], ft->name)) { break; } } if (ft->name) { - ft->func(cargc, cargv); + ft->func(argc, argv); } else { - printf("unknown command: %s\n", cargv[0]); + printf("unknown command: %s\n", argv[0]); } } - free(cargv); + free(argv); return NULL; } @@ -1026,7 +1102,7 @@ void *run_test(const char *infile_name) { int main(int argc, char **argv) { const char *usage = \ "usage: umka_shell [test_file.t] [-c]\n" - " -c trace branches to collect coverage"; + " -c collect coverage"; const char *test_file = NULL; int opt; @@ -1037,7 +1113,7 @@ int main(int argc, char **argv) { while ((opt = getopt(argc, argv, "c")) != -1) { switch (opt) { case 'c': - trace = 1; + coverage = 1; break; default: puts(usage); @@ -1045,13 +1121,16 @@ int main(int argc, char **argv) { } } - if (trace) + if (coverage) trace_begin(); + + COVERAGE_ON(); kos_init(); + COVERAGE_OFF(); run_test(test_file); - if (trace) + if (coverage) trace_end(); return 0;