static astring *find_include_file(int srcrootlen, const astring *srcfile, const astring *filename) { include_path *curpath; /* iterate over include paths and find the file */ for (curpath = incpaths; curpath != NULL; curpath = curpath->next) { astring *srcincpath = astring_dup(curpath->path); core_file *testfile; int lastsepindex = 0; int sepindex; /* a '.' include path is specially treated */ if (astring_cmpc(curpath->path, ".") == 0) astring_cpysubstr(srcincpath, srcfile, 0, astring_rchr(srcfile, 0, PATH_SEPARATOR[0])); /* append the filename piecemeal to account for directories */ while ((sepindex = astring_chr(filename, lastsepindex, '/')) != -1) { astring *pathpart = astring_dupsubstr(filename, lastsepindex, sepindex - lastsepindex); /* handle .. by removing a chunk from the incpath */ if (astring_cmpc(pathpart, "..") == 0) { int sepindex_part = astring_rchr(srcincpath, 0, PATH_SEPARATOR[0]); if (sepindex_part != -1) astring_substr(srcincpath, 0, sepindex_part); } /* otherwise, append a path separator and the pathpart */ else astring_cat(astring_catc(srcincpath, PATH_SEPARATOR), pathpart); /* advance past the previous index */ lastsepindex = sepindex + 1; /* free the path part we extracted */ astring_free(pathpart); } /* now append the filename */ astring_catsubstr(astring_catc(srcincpath, PATH_SEPARATOR), filename, lastsepindex, -1); /* see if we can open it */ if (core_fopen(astring_c(srcincpath), OPEN_FLAG_READ, &testfile) == FILERR_NONE) { /* close the file */ core_fclose(testfile); return srcincpath; } /* free our include path */ astring_free(srcincpath); } return NULL; }
int astring_catvprintf(astring *dst, const char *format, va_list args) { char tempbuf[4096]; int result; /* sprintf into the temporary buffer */ result = vsprintf(tempbuf, format, args); /* append the result */ astring_catc(dst, tempbuf); return result; }
int astring_catprintf(astring *dst, const char *format, ...) { char tempbuf[4096]; va_list args; int result; /* sprintf into the temporary buffer */ va_start(args, format); result = vsprintf(tempbuf, format, args); va_end(args); /* append the result */ astring_catc(dst, tempbuf); return result; }
astring *_profiler_get_text(running_machine *machine, astring *string) { static const profile_string names[] = { { PROFILER_MEMREAD, "Memory Read" }, { PROFILER_MEMWRITE, "Memory Write" }, { PROFILER_VIDEO, "Video Update" }, { PROFILER_DRAWGFX, "drawgfx" }, { PROFILER_COPYBITMAP, "copybitmap" }, { PROFILER_TILEMAP_DRAW, "Tilemap Draw" }, { PROFILER_TILEMAP_DRAW_ROZ, "Tilemap ROZ Draw" }, { PROFILER_TILEMAP_UPDATE, "Tilemap Update" }, { PROFILER_BLIT, "OSD Blitting" }, { PROFILER_SOUND, "Sound Generation" }, { PROFILER_TIMER_CALLBACK, "Timer Callbacks" }, { PROFILER_INPUT, "Input Processing" }, { PROFILER_MOVIE_REC, "Movie Recording" }, { PROFILER_LOGERROR, "Error Logging" }, { PROFILER_EXTRA, "Unaccounted/Overhead" }, { PROFILER_USER1, "User 1" }, { PROFILER_USER2, "User 2" }, { PROFILER_USER3, "User 3" }, { PROFILER_USER4, "User 4" }, { PROFILER_USER5, "User 5" }, { PROFILER_USER6, "User 6" }, { PROFILER_USER7, "User 7" }, { PROFILER_USER8, "User 8" }, { PROFILER_PROFILER, "Profiler" }, { PROFILER_IDLE, "Idle" } }; UINT64 computed, normalize, total; int curtype, curmem, switches; profiler_mark_start(PROFILER_PROFILER); /* compute the total time for all bits, not including profiler or idle */ computed = 0; for (curtype = 0; curtype < PROFILER_PROFILER; curtype++) for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) computed += global_profiler.data[curmem].duration[curtype]; /* save that result in normalize, and continue adding the rest */ normalize = computed; for ( ; curtype < PROFILER_TOTAL; curtype++) for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) computed += global_profiler.data[curmem].duration[curtype]; /* this becomes the total; if we end up with 0 for anything, we were just started, so return empty */ total = computed; astring_reset(string); if (total == 0 || normalize == 0) goto out; /* loop over all types and generate the string */ for (curtype = 0; curtype < PROFILER_TOTAL; curtype++) { /* determine the accumulated time for this type */ computed = 0; for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) computed += global_profiler.data[curmem].duration[curtype]; /* if we have non-zero data and we're ready to display, do it */ if (global_profiler.dataready && computed != 0) { int nameindex; /* start with the un-normalized percentage */ astring_catprintf(string, "%02d%% ", (int)((computed * 100 + total/2) / total)); /* followed by the normalized percentage for everything but profiler and idle */ if (curtype < PROFILER_PROFILER) astring_catprintf(string, "%02d%% ", (int)((computed * 100 + normalize/2) / normalize)); /* and then the text */ if (curtype >= PROFILER_CPU_FIRST && curtype <= PROFILER_CPU_MAX) astring_catprintf(string, "CPU '%s'", device_list_find_by_index(machine->config->devicelist, CPU, curtype - PROFILER_CPU_FIRST)->tag); else for (nameindex = 0; nameindex < ARRAY_LENGTH(names); nameindex++) if (names[nameindex].type == curtype) { astring_catc(string, names[nameindex].string); break; } /* followed by a carriage return */ astring_catc(string, "\n"); } } /* followed by context switches */ if (global_profiler.dataready) { switches = 0; for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) switches += global_profiler.data[curmem].context_switches; astring_catprintf(string, "%d CPU switches\n", switches / (int) ARRAY_LENGTH(global_profiler.data)); } /* advance to the next dataset and reset it to 0 */ global_profiler.dataindex = (global_profiler.dataindex + 1) % ARRAY_LENGTH(global_profiler.data); memset(&global_profiler.data[global_profiler.dataindex], 0, sizeof(global_profiler.data[global_profiler.dataindex])); /* we are ready once we have wrapped around */ if (global_profiler.dataindex == 0) global_profiler.dataready = TRUE; out: profiler_mark_end(); return string; }
static astring *find_include_file(int srcrootlen, int dstrootlen, const astring *srcfile, const astring *dstfile, const astring *filename) { include_path *curpath; /* iterate over include paths and find the file */ for (curpath = incpaths; curpath != NULL; curpath = curpath->next) { astring *srcincpath = astring_cat(astring_dupsubstr(srcfile, 0, srcrootlen + 1), curpath->path); core_file *testfile; int lastsepindex = 0; int sepindex; /* a '.' include path is specially treated */ if (astring_cmpc(curpath->path, ".") == 0) astring_cpysubstr(srcincpath, srcfile, 0, astring_rchr(srcfile, 0, PATH_SEPARATOR[0])); /* append the filename piecemeal to account for directories */ while ((sepindex = astring_chr(filename, lastsepindex, '/')) != -1) { astring *pathpart = astring_dupsubstr(filename, lastsepindex, sepindex - lastsepindex); /* handle .. by removing a chunk from the incpath */ if (astring_cmpc(pathpart, "..") == 0) { sepindex = astring_rchr(srcincpath, 0, PATH_SEPARATOR[0]); if (sepindex != -1) astring_substr(srcincpath, 0, sepindex); } /* otherwise, append a path separator and the pathpart */ else astring_cat(astring_catc(srcincpath, PATH_SEPARATOR), pathpart); /* advance past the previous index */ lastsepindex = sepindex + 1; /* free the path part we extracted */ astring_free(pathpart); } /* now append the filename */ astring_catsubstr(astring_catc(srcincpath, PATH_SEPARATOR), filename, lastsepindex, -1); /* see if we can open it */ if (core_fopen(astring_c(srcincpath), OPEN_FLAG_READ, &testfile) == FILERR_NONE) { astring *tempfile = astring_alloc(); astring *tempinc = astring_alloc(); /* close the file */ core_fclose(testfile); /* find the longest matching directory substring between the include and source file */ lastsepindex = 0; while ((sepindex = astring_chr(srcincpath, lastsepindex, PATH_SEPARATOR[0])) != -1) { /* get substrings up to the current directory */ astring_cpysubstr(tempfile, srcfile, 0, sepindex); astring_cpysubstr(tempinc, srcincpath, 0, sepindex); /* if we don't match, stop */ if (astring_cmp(tempfile, tempinc) != 0) break; lastsepindex = sepindex + 1; } /* chop off the common parts of the paths */ astring_cpysubstr(tempfile, srcfile, lastsepindex, -1); astring_replacechr(astring_substr(srcincpath, lastsepindex, -1), PATH_SEPARATOR[0], '/'); /* for each directory left in the filename, we need to prepend a "../" */ while ((sepindex = astring_chr(tempfile, 0, PATH_SEPARATOR[0])) != -1) { astring_substr(tempfile, sepindex + 1, -1); astring_insc(srcincpath, 0, "../"); } astring_catc(srcincpath, ".html"); /* free the strings and return the include path */ astring_free(tempfile); astring_free(tempinc); return srcincpath; } /* free our include path */ astring_free(srcincpath); } return NULL; }