bool core_options::parse_ini_file(core_file &inifile, int priority, int ignore_priority, astring &error_string) { // loop over lines in the file char buffer[4096]; while (core_fgets(buffer, ARRAY_LENGTH(buffer), &inifile) != NULL) { // find the extent of the name char *optionname; for (optionname = buffer; *optionname != 0; optionname++) if (!isspace((UINT8)*optionname)) break; // skip comments if (*optionname == 0 || *optionname == '#') continue; // scan forward to find the first space char *temp; for (temp = optionname; *temp != 0; temp++) if (isspace((UINT8)*temp)) break; // if we hit the end early, print a warning and continue if (*temp == 0) { error_string.catprintf("Warning: invalid line in INI: %s", buffer); continue; } // NULL-terminate *temp++ = 0; char *optiondata = temp; // scan the data, stopping when we hit a comment bool inquotes = false; for (temp = optiondata; *temp != 0; temp++) { if (*temp == '"') inquotes = !inquotes; if (*temp == '#' && !inquotes) break; } *temp = 0; // find our entry entry *curentry = m_entrymap.find(optionname); if (curentry == NULL) { if (priority >= ignore_priority) error_string.catprintf("Warning: unknown option in INI: %s\n", optionname); continue; } // set the new data validate_and_set_data(*curentry, optiondata, priority, error_string); } return true; }
char *emu_file::gets(char *s, int n) { // load the ZIP file now if we haven't yet if (compressed_file_ready()) return NULL; // read the data if we can if (m_file != NULL) return core_fgets(s, n, m_file); return NULL; }
char *emu_file::gets(char *s, int n) { // load the ZIP file now if we haven't yet if (m_zipfile != NULL && load_zipped_file() != FILERR_NONE) return NULL; // read the data if we can if (m_file != NULL) return core_fgets(s, n, m_file); return NULL; }
static int output_file(file_type type, int srcrootlen, int dstrootlen, astring &srcfile, astring &dstfile, bool link_to_file, astring &tempheader, astring &tempfooter) { // extract a normalized subpath astring srcfile_subpath; normalized_subpath(srcfile_subpath, srcfile, srcrootlen + 1); fprintf(stderr, "Processing %s\n", srcfile_subpath.cstr()); // set some defaults bool color_quotes = false; const char *comment_start = ""; const char *comment_start_esc = ""; const char *comment_end = ""; const char *comment_end_esc = ""; const char *comment_inline = ""; const char *comment_inline_esc = ""; const char *token_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#"; const token_entry *token_table = dummy_token_table; // based on the file type, set the comment info switch (type) { case FILE_TYPE_C: color_quotes = true; comment_start = comment_start_esc = "/*"; comment_end = comment_end_esc = "*/"; comment_inline = comment_inline_esc = "//"; token_table = c_token_table; break; case FILE_TYPE_MAKE: color_quotes = true; comment_inline = comment_inline_esc = "#"; break; case FILE_TYPE_XML: color_quotes = true; comment_start = "<!--"; comment_start_esc = "<!--"; comment_end = "-->"; comment_end_esc = "-->"; break; default: case FILE_TYPE_TEXT: break; } // make the token lookup table bool is_token[256]; memset(is_token, 0, sizeof(is_token)); for (int toknum = 0; token_chars[toknum] != 0; toknum++) is_token[(UINT8)token_chars[toknum]] = true; // open the source file core_file *src; if (core_fopen(srcfile, OPEN_FLAG_READ, &src) != FILERR_NONE) { fprintf(stderr, "Unable to read file '%s'\n", srcfile.cstr()); return 1; } // open the output file core_file *dst = create_file_and_output_header(dstfile, tempheader, srcfile_subpath); if (dst == NULL) { fprintf(stderr, "Unable to write file '%s'\n", dstfile.cstr()); core_fclose(src); return 1; } // output the directory navigation core_fprintf(dst, "<h3>Viewing File: "); output_path_as_links(dst, srcfile_subpath, false, link_to_file); core_fprintf(dst, "</h3>"); // start with some tags core_fprintf(dst, "\t<pre class=\"source\">\n"); // iterate over lines in the source file int linenum = 1; bool in_comment = false; char srcline[4096]; while (core_fgets(srcline, ARRAY_LENGTH(srcline), src) != NULL) { // start with the line number astring dstline; dstline.catprintf("<span class=\"linenum\">%5d</span> ", linenum++); // iterate over characters in the source line bool escape = false; bool in_quotes = false; bool in_inline_comment = false; bool last_token_was_include = false; bool last_was_token = false; bool quotes_are_linked = false; UINT8 curquote = 0; int curcol = 0; for (char *srcptr = srcline; *srcptr != 0; ) { UINT8 ch = *srcptr++; // track whether or not we are within an extended (C-style) comment if (!in_quotes && !in_inline_comment) { if (!in_comment && ch == comment_start[0] && strncmp(srcptr - 1, comment_start, strlen(comment_start)) == 0) { dstline.catprintf("<span class=\"comment\">%s", comment_start_esc); curcol += strlen(comment_start); srcptr += strlen(comment_start) - 1; ch = 0; in_comment = true; } else if (in_comment && ch == comment_end[0] && strncmp(srcptr - 1, comment_end, strlen(comment_end)) == 0) { dstline.catprintf("%s</span>", comment_end_esc); curcol += strlen(comment_end); srcptr += strlen(comment_end) - 1; ch = 0; in_comment = false; } } // track whether or not we are within an inline (C++-style) comment if (!in_quotes && !in_comment && !in_inline_comment && ch == comment_inline[0] && strncmp(srcptr - 1, comment_inline, strlen(comment_inline)) == 0) { dstline.catprintf("<span class=\"comment\">%s", comment_inline_esc); curcol += strlen(comment_inline); srcptr += strlen(comment_inline) - 1; ch = 0; in_inline_comment = true; } // if this is the start of a new token, see if we want to color it if (!in_quotes && !in_comment && !in_inline_comment && !last_was_token && is_token[ch]) { const token_entry *curtoken; char *temp = srcptr; int toklength; // find the end of the token while (*temp != 0 && is_token[(UINT8)*temp]) temp++; toklength = temp - (srcptr - 1); // scan the token table last_token_was_include = false; for (curtoken = token_table; curtoken->token != NULL; curtoken++) if (strncmp(srcptr - 1, curtoken->token, toklength) == 0 && strlen(curtoken->token) == toklength) { dstline.catprintf("<span class=\"%s\">%s</span>", curtoken->color, curtoken->token); curcol += strlen(curtoken->token); srcptr += strlen(curtoken->token) - 1; ch = 0; // look for include tokens specially if (type == FILE_TYPE_C && strcmp(curtoken->token, "#include") == 0) last_token_was_include = true; break; } } last_was_token = is_token[ch]; // if we hit a tab, expand it if (ch == 0x09) { // compute how many spaces int spaces = 4 - curcol % 4; while (spaces--) { dstline.cat(' '); curcol++; } } // otherwise, copy the source character else if (ch != 0x0a && ch != 0x0d && ch != 0) { // track opening quotes if (!in_comment && !in_inline_comment && !in_quotes && (ch == '"' || ch == '\'')) { if (color_quotes) dstline.catprintf("<span class=\"string\">%c", ch); else dstline.cat(ch); in_quotes = true; curquote = ch; // handle includes if (last_token_was_include) { char *endquote = strchr(srcptr, ch); if (endquote != NULL) { astring filename(srcptr, endquote - srcptr); astring target; if (find_include_file(target, srcrootlen, dstrootlen, srcfile, dstfile, filename)) { dstline.catprintf("<a href=\"%s\">", target.cstr()); quotes_are_linked = true; } } } } // track closing quotes else if (!in_comment && !in_inline_comment && in_quotes && (ch == curquote) && !escape) { if (quotes_are_linked) dstline.catprintf("</a>"); if (color_quotes) dstline.catprintf("%c</span>", ch); else dstline.cat(ch); in_quotes = false; curquote = 0; quotes_are_linked = false; } // else just output the current character else if (ch == '&') dstline.catprintf("&"); else if (ch == '<') dstline.catprintf("<"); else if (ch == '>') dstline.catprintf(">"); else dstline.cat(ch); curcol++; } // Update escape state if (in_quotes) escape = (ch == '\\' && type == FILE_TYPE_C) ? !escape : false; } // finish inline comments if (in_inline_comment) { dstline.catprintf("</span>"); in_inline_comment = false; } // append a break and move on dstline.catprintf("\n"); core_fputs(dst, dstline); } // close tags core_fprintf(dst, "\t</pre>\n"); // close the file output_footer_and_close_file(dst, tempfooter, srcfile_subpath); core_fclose(src); return 0; }
static int output_file(file_type type, int srcrootlen, int dstrootlen, const astring *srcfile, const astring *dstfile, int link_to_file) { const char *comment_start, *comment_end, *comment_inline, *token_chars; const char *comment_start_esc, *comment_end_esc, *comment_inline_esc; const token_entry *token_table; const astring *srcfile_subpath; char srcline[4096], *srcptr; int in_comment = FALSE; UINT8 is_token[256]; int color_quotes; core_file *src; core_file *dst; int toknum; int linenum = 1; /* extract a normalized subpath */ srcfile_subpath = normalized_subpath(srcfile, srcrootlen + 1); if (srcfile_subpath == NULL) return 1; fprintf(stderr, "Processing %s\n", astring_c(srcfile_subpath)); /* set some defaults */ color_quotes = FALSE; comment_start = comment_start_esc = ""; comment_end = comment_end_esc = ""; comment_inline = comment_inline_esc = ""; token_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#"; token_table = dummy_token_table; /* based on the file type, set the comment info */ switch (type) { case FILE_TYPE_C: color_quotes = TRUE; comment_start = comment_start_esc = "/*"; comment_end = comment_end_esc = "*/"; comment_inline = comment_inline_esc = "//"; token_table = c_token_table; break; case FILE_TYPE_MAKE: color_quotes = TRUE; comment_inline = comment_inline_esc = "#"; break; case FILE_TYPE_XML: color_quotes = TRUE; comment_start = "<!--"; comment_start_esc = "<!--"; comment_end = "-->"; comment_end_esc = "-->"; break; default: case FILE_TYPE_TEXT: break; } /* make the token lookup table */ memset(is_token, 0, sizeof(is_token)); for (toknum = 0; token_chars[toknum] != 0; toknum++) is_token[(UINT8)token_chars[toknum]] = TRUE; /* open the source file */ if (core_fopen(astring_c(srcfile), OPEN_FLAG_READ, &src) != FILERR_NONE) { fprintf(stderr, "Unable to read file '%s'\n", astring_c(srcfile)); return 1; } /* open the output file */ dst = create_file_and_output_header(dstfile, "MAME Source Code", astring_c(srcfile_subpath)); if (dst == NULL) { fprintf(stderr, "Unable to write file '%s'\n", astring_c(dstfile)); core_fclose(src); return 1; } /* output the directory navigation */ core_fprintf(dst, "<h3>Viewing File: "); output_path_as_links(dst, srcfile_subpath, FALSE, link_to_file); core_fprintf(dst, "</h3>"); astring_free((astring *)srcfile_subpath); /* start with some tags */ core_fprintf(dst, "\t<pre style=\"font-family:'Courier New','Courier',monospace; font-size:12px;\">\n"); /* iterate over lines in the source file */ while (core_fgets(srcline, ARRAY_LENGTH(srcline), src) != NULL) { char dstline[4096], *dstptr = dstline; int in_inline_comment = FALSE; int last_token_was_include = FALSE; int last_was_token = FALSE; int quotes_are_linked = FALSE; char in_quotes = 0; int curcol = 0; /* start with the line number */ dstptr += sprintf(dstptr, "<span style=\"" LINENUM_STYLE "\">%5d</span> ", linenum++); /* iterate over characters in the source line */ for (srcptr = srcline; *srcptr != 0; ) { UINT8 ch = *srcptr++; /* track whether or not we are within an extended (C-style) comment */ if (!in_quotes && !in_inline_comment) { if (!in_comment && ch == comment_start[0] && strncmp(srcptr - 1, comment_start, strlen(comment_start)) == 0) { dstptr += sprintf(dstptr, "<span style=\"" COMMENT_STYLE "\">%s", comment_start_esc); curcol += strlen(comment_start); srcptr += strlen(comment_start) - 1; ch = 0; in_comment = TRUE; } else if (in_comment && ch == comment_end[0] && strncmp(srcptr - 1, comment_end, strlen(comment_end)) == 0) { dstptr += sprintf(dstptr, "%s</span>", comment_end_esc); curcol += strlen(comment_end); srcptr += strlen(comment_end) - 1; ch = 0; in_comment = FALSE; } } /* track whether or not we are within an inline (C++-style) comment */ if (!in_quotes && !in_comment && !in_inline_comment && ch == comment_inline[0] && strncmp(srcptr - 1, comment_inline, strlen(comment_inline)) == 0) { dstptr += sprintf(dstptr, "<span style=\"" COMMENT_STYLE "\">%s", comment_inline_esc); curcol += strlen(comment_inline); srcptr += strlen(comment_inline) - 1; ch = 0; in_inline_comment = TRUE; } /* if this is the start of a new token, see if we want to color it */ if (!in_quotes && !in_comment && !in_inline_comment && !last_was_token && is_token[ch]) { const token_entry *curtoken; char *temp = srcptr; int toklength; /* find the end of the token */ while (*temp != 0 && is_token[(UINT8)*temp]) temp++; toklength = temp - (srcptr - 1); /* scan the token table */ last_token_was_include = FALSE; for (curtoken = token_table; curtoken->token != NULL; curtoken++) if (strncmp(srcptr - 1, curtoken->token, toklength) == 0 && strlen(curtoken->token) == toklength) { dstptr += sprintf(dstptr, "<span style=\"%s\">%s</span>", curtoken->color, curtoken->token); curcol += strlen(curtoken->token); srcptr += strlen(curtoken->token) - 1; ch = 0; /* look for include tokens specially */ if (type == FILE_TYPE_C && strcmp(curtoken->token, "#include") == 0) last_token_was_include = TRUE; break; } } last_was_token = is_token[ch]; /* if we hit a tab, expand it */ if (ch == 0x09) { /* compute how many spaces */ int spaces = 4 - curcol % 4; while (spaces--) { *dstptr++ = ' '; curcol++; } } /* otherwise, copy the source character */ else if (ch != 0x0a && ch != 0x0d && ch != 0) { /* track opening quotes */ if (!in_comment && !in_inline_comment && !in_quotes && (ch == '"' || ch == '\'')) { if (color_quotes) dstptr += sprintf(dstptr, "<span style=\"" STRING_STYLE "\">%c", ch); else *dstptr++ = ch; in_quotes = ch; /* handle includes */ if (last_token_was_include) { char *endquote = strchr(srcptr, ch); if (endquote != NULL) { astring *filename = astring_dupch(srcptr, endquote - srcptr); astring *target = find_include_file(srcrootlen, dstrootlen, srcfile, dstfile, filename); if (target != NULL) { dstptr += sprintf(dstptr, "<a href=\"%s\">", astring_c(target)); quotes_are_linked = TRUE; astring_free(target); } astring_free(filename); } } } /* track closing quotes */ else if (!in_comment && !in_inline_comment && in_quotes && ch == in_quotes && (type != FILE_TYPE_C || srcptr[-2] != '\\' || srcptr[-3] == '\\')) { if (quotes_are_linked) dstptr += sprintf(dstptr, "</a>"); if (color_quotes) dstptr += sprintf(dstptr, "%c</span>", ch); else *dstptr++ = ch; in_quotes = 0; quotes_are_linked = FALSE; } /* else just output the current character */ else if (ch == '&') dstptr += sprintf(dstptr, "&"); else if (ch == '<') dstptr += sprintf(dstptr, "<"); else if (ch == '>') dstptr += sprintf(dstptr, ">"); else *dstptr++ = ch; curcol++; } } /* finish inline comments */ if (in_inline_comment) { dstptr += sprintf(dstptr, "</span>"); in_inline_comment = FALSE; } /* append a break and move on */ dstptr += sprintf(dstptr, "\n"); core_fputs(dst, dstline); } /* close tags */ core_fprintf(dst, "\t</pre>\n"); /* close the file */ output_footer_and_close_file(dst); core_fclose(src); return 0; }
int parse_for_drivers(const char *srcfile) { // read source file core_file *file = NULL; file_error filerr = core_fopen(srcfile, OPEN_FLAG_READ, &file); if (filerr != FILERR_NONE) { fprintf(stderr, "Unable to read source file '%s'\n", srcfile); return 1; } // loop over lines in the file char buffer[4096]; while (core_fgets(buffer, ARRAY_LENGTH(buffer), file) != NULL) { astring line; // rip through it to find all drivers char *srcptr = (char *)buffer; char *endptr = srcptr + strlen(buffer); bool in_comment = false; while (srcptr < endptr) { char c = *srcptr++; // skip any spaces if (isspace(c)) continue; // look for end of C comment if (in_comment && c == '*' && *srcptr == '/') { srcptr++; in_comment = false; continue; } // skip anything else inside a C comment if (in_comment) continue; // look for start of C comment if (c == '/' && *srcptr == '*') { srcptr++; in_comment = true; continue; } // if we hit a C++ comment, scan to the end of line if (c == '/' && *srcptr == '/') { while (srcptr < endptr && *srcptr != 13 && *srcptr != 10) srcptr++; continue; } srcptr--; for (int pos = 0; srcptr < endptr && !isspace(*srcptr); pos++) { line.cat(*srcptr++); } } if ((line.find(0,"GAME(")==0) || (line.find(0,"GAMEL(")==0) || (line.find(0,"COMP(")==0) || (line.find(0,"CONS(")==0) || (line.find(0,"SYST(")==0)) { int p1 = line.find(0,","); if (p1<0) continue; int p2 = line.find(p1+1,","); if (p2<0) continue; printf("%s\n",line.substr(p1+1,p2-p1-1).cstr()); } } core_fclose(file); return 0; }