void IRGraphVisitor::visit(const Evaluate *op) { include(op->value); }
int main(int argc, char **argv) { struct bsdtar *bsdtar, bsdtar_storage; const struct option *option; int opt, t; char option_o; char possible_help_request; char buff[16]; /* * Use a pointer for consistency, but stack-allocated storage * for ease of cleanup. */ bsdtar = &bsdtar_storage; memset(bsdtar, 0, sizeof(*bsdtar)); bsdtar->fd = -1; /* Mark as "unused" */ option_o = 0; /* Need bsdtar->progname before calling bsdtar_warnc. */ if (*argv == NULL) bsdtar->progname = "bsdtar"; else { bsdtar->progname = strrchr(*argv, '/'); if (bsdtar->progname != NULL) bsdtar->progname++; else bsdtar->progname = *argv; } if (setlocale(LC_ALL, "") == NULL) bsdtar_warnc(bsdtar, 0, "Failed to set default locale"); #if defined(HAVE_NL_LANGINFO) && defined(HAVE_D_MD_ORDER) bsdtar->day_first = (*nl_langinfo(D_MD_ORDER) == 'd'); #endif possible_help_request = 0; /* Look up uid of current user for future reference */ bsdtar->user_uid = geteuid(); /* Default: open tape drive. */ bsdtar->filename = getenv("TAPE"); if (bsdtar->filename == NULL) bsdtar->filename = _PATH_DEFTAPE; /* Default: preserve mod time on extract */ bsdtar->extract_flags = ARCHIVE_EXTRACT_TIME; /* Default: Perform basic security checks. */ bsdtar->extract_flags |= SECURITY; /* Defaults for root user: */ if (bsdtar->user_uid == 0) { /* --same-owner */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER; /* -p */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM; bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL; bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR; bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; } /* Rewrite traditional-style tar arguments, if used. */ argv = rewrite_argv(bsdtar, &argc, argv, tar_opts); bsdtar->argv = argv; bsdtar->argc = argc; /* Process all remaining arguments now. */ /* * Comments following each option indicate where that option * originated: SUSv2, POSIX, GNU tar, star, etc. If there's * no such comment, then I don't know of anyone else who * implements that option. */ while ((opt = bsdtar_getopt(bsdtar, tar_opts, &option)) != -1) { switch (opt) { case 'B': /* GNU tar */ /* libarchive doesn't need this; just ignore it. */ break; case 'b': /* SUSv2 */ t = atoi(optarg); if (t <= 0 || t > 1024) bsdtar_errc(bsdtar, 1, 0, "Argument to -b is out of range (1..1024)"); bsdtar->bytes_per_block = 512 * t; break; case 'C': /* GNU tar */ set_chdir(bsdtar, optarg); break; case 'c': /* SUSv2 */ set_mode(bsdtar, opt); break; case OPTION_CHECK_LINKS: /* GNU tar */ bsdtar->option_warn_links = 1; break; case OPTION_CHROOT: /* NetBSD */ bsdtar->option_chroot = 1; break; case OPTION_EXCLUDE: /* GNU tar */ if (exclude(bsdtar, optarg)) bsdtar_errc(bsdtar, 1, 0, "Couldn't exclude %s\n", optarg); break; case OPTION_FORMAT: /* GNU tar, others */ bsdtar->create_format = optarg; break; case 'f': /* SUSv2 */ bsdtar->filename = optarg; if (strcmp(bsdtar->filename, "-") == 0) bsdtar->filename = NULL; break; case 'H': /* BSD convention */ bsdtar->symlink_mode = 'H'; break; case 'h': /* Linux Standards Base, gtar; synonym for -L */ bsdtar->symlink_mode = 'L'; /* Hack: -h by itself is the "help" command. */ possible_help_request = 1; break; case OPTION_HELP: /* GNU tar, others */ long_help(bsdtar); exit(0); break; case 'I': /* GNU tar */ /* * TODO: Allow 'names' to come from an archive, * not just a text file. Design a good UI for * allowing names and mode/owner to be read * from an archive, with contents coming from * disk. This can be used to "refresh" an * archive or to design archives with special * permissions without having to create those * permissions on disk. */ bsdtar->names_from_file = optarg; break; case OPTION_INCLUDE: /* * Noone else has the @archive extension, so * noone else needs this to filter entries * when transforming archives. */ if (include(bsdtar, optarg)) bsdtar_errc(bsdtar, 1, 0, "Failed to add %s to inclusion list", optarg); break; case 'j': /* GNU tar */ #if HAVE_LIBBZ2 if (bsdtar->create_compression != '\0') bsdtar_errc(bsdtar, 1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; #else bsdtar_warnc(bsdtar, 0, "-j compression not supported by this version of bsdtar"); usage(bsdtar); #endif break; case 'k': /* GNU tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE; break; case OPTION_KEEP_NEWER_FILES: /* GNU tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER; break; case 'L': /* BSD convention */ bsdtar->symlink_mode = 'L'; break; case 'l': /* SUSv2 and GNU tar beginning with 1.16 */ /* GNU tar 1.13 used -l for --one-file-system */ bsdtar->option_warn_links = 1; break; case 'm': /* SUSv2 */ bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME; break; case 'n': /* GNU tar */ bsdtar->option_no_subdirs = 1; break; /* * Selecting files by time: * --newer-?time='date' Only files newer than 'date' * --newer-?time-than='file' Only files newer than time * on specified file (useful for incremental backups) * TODO: Add corresponding "older" options to reverse these. */ case OPTION_NEWER_CTIME: /* GNU tar */ bsdtar->newer_ctime_sec = get_date(optarg); break; case OPTION_NEWER_CTIME_THAN: { struct stat st; if (stat(optarg, &st) != 0) bsdtar_errc(bsdtar, 1, 0, "Can't open file %s", optarg); bsdtar->newer_ctime_sec = st.st_ctime; bsdtar->newer_ctime_nsec = ARCHIVE_STAT_CTIME_NANOS(&st); } break; case OPTION_NEWER_MTIME: /* GNU tar */ bsdtar->newer_mtime_sec = get_date(optarg); break; case OPTION_NEWER_MTIME_THAN: { struct stat st; if (stat(optarg, &st) != 0) bsdtar_errc(bsdtar, 1, 0, "Can't open file %s", optarg); bsdtar->newer_mtime_sec = st.st_mtime; bsdtar->newer_mtime_nsec = ARCHIVE_STAT_MTIME_NANOS(&st); } break; case OPTION_NODUMP: /* star */ bsdtar->option_honor_nodump = 1; break; case OPTION_NO_SAME_OWNER: /* GNU tar */ bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER; break; case OPTION_NO_SAME_PERMISSIONS: /* GNU tar */ bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_PERM; bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL; bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR; bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS; break; case OPTION_NULL: /* GNU tar */ bsdtar->option_null++; break; case OPTION_NUMERIC_OWNER: /* GNU tar */ bsdtar->option_numeric_owner++; break; case 'O': /* GNU tar */ bsdtar->option_stdout = 1; break; case 'o': /* SUSv2 and GNU conflict here, but not fatally */ option_o = 1; /* Record it and resolve it later. */ break; case OPTION_ONE_FILE_SYSTEM: /* GNU tar */ bsdtar->option_dont_traverse_mounts = 1; break; #if 0 /* * The common BSD -P option is not necessary, since * our default is to archive symlinks, not follow * them. This is convenient, as -P conflicts with GNU * tar anyway. */ case 'P': /* BSD convention */ /* Default behavior, no option necessary. */ break; #endif case 'P': /* GNU tar */ bsdtar->extract_flags &= ~SECURITY; bsdtar->option_absolute_paths = 1; break; case 'p': /* GNU tar, star */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM; bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL; bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR; bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; break; case OPTION_POSIX: /* GNU tar */ bsdtar->create_format = "pax"; break; case 'q': /* FreeBSD GNU tar --fast-read, NetBSD -q */ bsdtar->option_fast_read = 1; break; case 'r': /* SUSv2 */ set_mode(bsdtar, opt); break; case 'S': /* NetBSD pax-as-tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE; break; case 's': /* NetBSD pax-as-tar */ #if HAVE_REGEX_H add_substitution(bsdtar, optarg); #else bsdtar_warnc(bsdtar, 0, "-s is not supported by this version of bsdtar"); usage(bsdtar); #endif break; case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */ bsdtar->strip_components = atoi(optarg); break; case 'T': /* GNU tar */ bsdtar->names_from_file = optarg; break; case 't': /* SUSv2 */ set_mode(bsdtar, opt); bsdtar->verbose++; break; case OPTION_TOTALS: /* GNU tar */ bsdtar->option_totals++; break; case 'U': /* GNU tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_UNLINK; bsdtar->option_unlink_first = 1; break; case 'u': /* SUSv2 */ set_mode(bsdtar, opt); break; case 'v': /* SUSv2 */ bsdtar->verbose++; break; case OPTION_VERSION: /* GNU convention */ version(); break; #if 0 /* * The -W longopt feature is handled inside of * bsdtar_getop(), so -W is not available here. */ case 'W': /* Obscure, but useful GNU convention. */ break; #endif case 'w': /* SUSv2 */ bsdtar->option_interactive = 1; break; case 'X': /* GNU tar */ if (exclude_from_file(bsdtar, optarg)) bsdtar_errc(bsdtar, 1, 0, "failed to process exclusions from file %s", optarg); break; case 'x': /* SUSv2 */ set_mode(bsdtar, opt); break; case 'y': /* FreeBSD version of GNU tar */ #if HAVE_LIBBZ2 if (bsdtar->create_compression != '\0') bsdtar_errc(bsdtar, 1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; #else bsdtar_warnc(bsdtar, 0, "-y compression not supported by this version of bsdtar"); usage(bsdtar); #endif break; case 'Z': /* GNU tar */ if (bsdtar->create_compression != '\0') bsdtar_errc(bsdtar, 1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; break; case 'z': /* GNU tar, star, many others */ #if HAVE_LIBZ if (bsdtar->create_compression != '\0') bsdtar_errc(bsdtar, 1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; #else bsdtar_warnc(bsdtar, 0, "-z compression not supported by this version of bsdtar"); usage(bsdtar); #endif break; case OPTION_USE_COMPRESS_PROGRAM: bsdtar->compress_program = optarg; break; default: usage(bsdtar); } } /* * Sanity-check options. */ /* If no "real" mode was specified, treat -h as --help. */ if ((bsdtar->mode == '\0') && possible_help_request) { long_help(bsdtar); exit(0); } /* Otherwise, a mode is required. */ if (bsdtar->mode == '\0') bsdtar_errc(bsdtar, 1, 0, "Must specify one of -c, -r, -t, -u, -x"); /* Check boolean options only permitted in certain modes. */ if (bsdtar->option_dont_traverse_mounts) only_mode(bsdtar, "--one-file-system", "cru"); if (bsdtar->option_fast_read) only_mode(bsdtar, "--fast-read", "xt"); if (bsdtar->option_honor_nodump) only_mode(bsdtar, "--nodump", "cru"); if (option_o > 0) { switch (bsdtar->mode) { case 'c': /* * In GNU tar, -o means "old format." The * "ustar" format is the closest thing * supported by libarchive. */ bsdtar->create_format = "ustar"; /* TODO: bsdtar->create_format = "v7"; */ break; case 'x': /* POSIX-compatible behavior. */ bsdtar->option_no_owner = 1; bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER; break; default: only_mode(bsdtar, "-o", "xc"); break; } } if (bsdtar->option_no_subdirs) only_mode(bsdtar, "-n", "cru"); if (bsdtar->option_stdout) only_mode(bsdtar, "-O", "xt"); if (bsdtar->option_unlink_first) only_mode(bsdtar, "-U", "x"); if (bsdtar->option_warn_links) only_mode(bsdtar, "--check-links", "cr"); /* Check other parameters only permitted in certain modes. */ if (bsdtar->create_compression != '\0') { strcpy(buff, "-?"); buff[1] = bsdtar->create_compression; only_mode(bsdtar, buff, "cxt"); } if (bsdtar->create_format != NULL) only_mode(bsdtar, "--format", "cru"); if (bsdtar->symlink_mode != '\0') { strcpy(buff, "-?"); buff[1] = bsdtar->symlink_mode; only_mode(bsdtar, buff, "cru"); } if (bsdtar->strip_components != 0) only_mode(bsdtar, "--strip-components", "xt"); bsdtar->argc -= optind; bsdtar->argv += optind; switch(bsdtar->mode) { case 'c': tar_mode_c(bsdtar); break; case 'r': tar_mode_r(bsdtar); break; case 't': tar_mode_t(bsdtar); break; case 'u': tar_mode_u(bsdtar); break; case 'x': tar_mode_x(bsdtar); break; } cleanup_exclusions(bsdtar); #if HAVE_REGEX_H cleanup_substitution(bsdtar); #endif if (bsdtar->return_value != 0) bsdtar_warnc(bsdtar, 0, "Error exit delayed from previous errors."); return (bsdtar->return_value); }
void IRGraphVisitor::visit(const Block *op) { include(op->first); if (op->rest.defined()) include(op->rest); }
int V3PreProcImp::getStateToken() { // Return the next state-determined token while (1) { next_tok: if (isEof()) return VP_EOF; int tok = getRawToken(); ProcState state = m_states.top(); // Most states emit white space and comments between tokens. (Unless collecting a string) if (tok==VP_WHITE && state !=ps_STRIFY) return (tok); if (tok==VP_BACKQUOTE && state !=ps_STRIFY) { tok = VP_TEXT; } if (tok==VP_COMMENT) { if (!m_off) { if (m_lexp->m_keepComments == KEEPCMT_SUB) { string rtn; rtn.assign(yyourtext(),yyourleng()); comment(rtn); // Need to insure "foo/**/bar" becomes two tokens insertUnreadback (" "); } else if (m_lexp->m_keepComments) { return (tok); } else { // Need to insure "foo/**/bar" becomes two tokens insertUnreadback (" "); } } // We're off or processed the comment specially. If there are newlines // in it, we also return the newlines as TEXT so that the linenumber // count is maintained for downstream tools for (size_t len=0; len<(size_t)yyourleng(); len++) { if (yyourtext()[len]=='\n') m_lineAdd++; } goto next_tok; } if (tok==VP_LINE) { addLineComment(m_lexp->m_enterExit); goto next_tok; } if (tok==VP_DEFREF_JOIN) { // Here's something fun and unspecified as yet: // The existance of non-existance of a base define changes `` expansion // `define QA_b zzz // `define Q1 `QA``_b // 1Q1 -> zzz // `define QA a // `Q1 -> a_b // Note parenthesis make this unambiguous // `define Q1 `QA()``_b // -> a_b // This may be a side effect of how `UNDEFINED remains as `UNDEFINED, // but it screws up our method here. So hardcode it. string name (yyourtext()+1,yyourleng()-1); if (defExists(name)) { // JOIN(DEFREF) // Put back the `` and process the defref UINFO(5,"```: define "<<name<<" exists, expand first\n"); m_defPutJoin = true; // After define, unputString("``"). Not now as would lose yyourtext() UINFO(5,"TOKEN now DEFREF\n"); tok = VP_DEFREF; } else { // DEFREF(JOIN) UINFO(5,"```: define "<<name<<" doesn't exist, join first\n"); // FALLTHRU, handle as with VP_SYMBOL_JOIN } } if (tok==VP_SYMBOL_JOIN || tok==VP_DEFREF_JOIN) { // not else if, can fallthru from above if() // a`` -> string doesn't include the ``, so can just grab next and continue string out (yyourtext(),yyourleng()); UINFO(5,"`` LHS:"<<out<<endl); // a``b``c can have multiple joins, so we need a stack m_joinStack.push(out); statePush(ps_JOIN); goto next_tok; } // Deal with some special parser states switch (state) { case ps_TOP: { break; } case ps_DEFNAME_UNDEF: // FALLTHRU case ps_DEFNAME_DEFINE: // FALLTHRU case ps_DEFNAME_IFDEF: // FALLTHRU case ps_DEFNAME_IFNDEF: // FALLTHRU case ps_DEFNAME_ELSIF: { if (tok==VP_SYMBOL) { m_lastSym.assign(yyourtext(),yyourleng()); if (state==ps_DEFNAME_IFDEF || state==ps_DEFNAME_IFNDEF) { bool enable = defExists(m_lastSym); UINFO(4,"Ifdef "<<m_lastSym<<(enable?" ON":" OFF")<<endl); if (state==ps_DEFNAME_IFNDEF) enable = !enable; m_ifdefStack.push(VPreIfEntry(enable,false)); if (!enable) parsingOff(); statePop(); goto next_tok; } else if (state==ps_DEFNAME_ELSIF) { if (m_ifdefStack.empty()) { error("`elsif with no matching `if\n"); } else { // Handle `else portion VPreIfEntry lastIf = m_ifdefStack.top(); m_ifdefStack.pop(); if (!lastIf.on()) parsingOn(); // Handle `if portion bool enable = !lastIf.everOn() && defExists(m_lastSym); UINFO(4,"Elsif "<<m_lastSym<<(enable?" ON":" OFF")<<endl); m_ifdefStack.push(VPreIfEntry(enable, lastIf.everOn())); if (!enable) parsingOff(); } statePop(); goto next_tok; } else if (state==ps_DEFNAME_UNDEF) { if (!m_off) { UINFO(4,"Undef "<<m_lastSym<<endl); undef(m_lastSym); } statePop(); goto next_tok; } else if (state==ps_DEFNAME_DEFINE) { // m_lastSym already set. stateChange(ps_DEFFORM); m_lexp->pushStateDefForm(); goto next_tok; } else fatalSrc("Bad case\n"); goto next_tok; } else if (tok==VP_TEXT) { // IE, something like comment between define and symbol if (!m_off) return tok; else goto next_tok; } else if (tok==VP_DEFREF) { // IE, `ifdef `MACRO(x): Substitue and come back here when state pops. break; } else { error((string)"Expecting define name. Found: "+tokenName(tok)+"\n"); goto next_tok; } } case ps_DEFFORM: { if (tok==VP_DEFFORM) { m_formals = m_lexp->m_defValue; if (debug()>=5) cout<<"DefFormals='"<<V3PreLex::cleanDbgStrg(m_formals)<<"'\n"; stateChange(ps_DEFVALUE); m_lexp->pushStateDefValue(); goto next_tok; } else if (tok==VP_TEXT) { // IE, something like comment in formals if (!m_off) return tok; else goto next_tok; } else { error((string)"Expecting define formal arguments. Found: "+tokenName(tok)+"\n"); goto next_tok; } } case ps_DEFVALUE: { static string newlines; newlines = "\n"; // Always start with trailing return if (tok == VP_DEFVALUE) { if (debug()>=5) cout<<"DefValue='"<<V3PreLex::cleanDbgStrg(m_lexp->m_defValue) <<"' formals='"<<V3PreLex::cleanDbgStrg(m_formals)<<"'\n"; // Add any formals string formals = m_formals; string value = m_lexp->m_defValue; // Remove returns // Not removing returns in values has two problems, // 1. we need to correct line numbers with `line after each substitution // 2. Substituting in " .... " with embedded returns requires \ escape. // This is very difficult in the presence of `", so we keep the \ before the newline. for (size_t i=0; i<formals.length(); i++) { if (formals[i] == '\n') { newlines += "\n"; } } for (size_t i=0; i<value.length(); i++) { if (value[i] == '\n') { newlines += "\n"; } } if (!m_off) { // Remove leading and trailing whitespace value = trimWhitespace(value, true); // Define it UINFO(4,"Define "<<m_lastSym<<" "<<formals <<" = '"<<V3PreLex::cleanDbgStrg(value)<<"'"<<endl); define(fileline(), m_lastSym, value, formals, false); } } else { string msg = string("Bad define text, unexpected ")+tokenName(tok)+"\n"; fatalSrc(msg); } statePop(); // DEFVALUE is terminated by a return, but lex can't return both tokens. // Thus, we emit a return here. yyourtext(newlines.c_str(), newlines.length()); return(VP_WHITE); } case ps_DEFPAREN: { if (tok==VP_TEXT && yyourleng()==1 && yyourtext()[0]=='(') { stateChange(ps_DEFARG); goto next_tok; } else { if (m_defRefs.empty()) fatalSrc("Shouldn't be in DEFPAREN w/o active defref"); V3DefineRef* refp = &(m_defRefs.top()); error((string)"Expecting ( to begin argument list for define reference `"+refp->name()+"\n"); statePop(); goto next_tok; } } case ps_DEFARG: { if (m_defRefs.empty()) fatalSrc("Shouldn't be in DEFARG w/o active defref"); V3DefineRef* refp = &(m_defRefs.top()); refp->nextarg(refp->nextarg()+m_lexp->m_defValue); m_lexp->m_defValue=""; UINFO(4,"defarg++ "<<refp->nextarg()<<endl); if (tok==VP_DEFARG && yyourleng()==1 && yyourtext()[0]==',') { refp->args().push_back(refp->nextarg()); stateChange(ps_DEFARG); m_lexp->pushStateDefArg(1); refp->nextarg(""); goto next_tok; } else if (tok==VP_DEFARG && yyourleng()==1 && yyourtext()[0]==')') { // Substitute in and prepare for next action // Similar code in non-parenthesized define (Search for END_OF_DEFARG) refp->args().push_back(refp->nextarg()); string out; if (!m_off) { out = defineSubst(refp); //NOP: out = m_preprocp->defSubstitute(out); } m_defRefs.pop(); refp=NULL; if (m_defRefs.empty()) { statePop(); if (!m_off) unputDefrefString(out); m_lexp->m_parenLevel = 0; } else { // Finished a defref inside a upper defref // Can't subst now, or // `define a(ign) x,y // foo(`a(ign),`b) would break because a contains comma refp = &(m_defRefs.top()); // We popped, so new top refp->nextarg(refp->nextarg()+m_lexp->m_defValue+out); m_lexp->m_defValue=""; m_lexp->m_parenLevel = refp->parenLevel(); statePop(); // Will go to ps_DEFARG, as we're under another define } goto next_tok; } else if (tok==VP_DEFREF) { // Expand it, then state will come back here // Value of building argument is data before the lower defref // we'll append it when we push the argument. break; } else if (tok==VP_SYMBOL || tok==VP_STRING || VP_TEXT || VP_WHITE) { string rtn; rtn.assign(yyourtext(),yyourleng()); refp->nextarg(refp->nextarg()+rtn); goto next_tok; } else { error((string)"Expecting ) or , to end argument list for define reference. Found: "+tokenName(tok)); statePop(); goto next_tok; } } case ps_INCNAME: { if (tok==VP_STRING) { statePop(); m_lastSym.assign(yyourtext(),yyourleng()); UINFO(4,"Include "<<m_lastSym<<endl); // Drop leading and trailing quotes. m_lastSym.erase(0,1); m_lastSym.erase(m_lastSym.length()-1,1); include(m_lastSym); goto next_tok; } else if (tok==VP_TEXT && yyourleng()==1 && yyourtext()[0]=='<') { // include <filename> stateChange(ps_INCNAME); // Still m_lexp->pushStateIncFilename(); goto next_tok; } else if (tok==VP_DEFREF || tok==VP_STRIFY) { // Expand it, then state will come back here break; } else { statePop(); error((string)"Expecting include filename. Found: "+tokenName(tok)+"\n"); goto next_tok; } } case ps_ERRORNAME: { if (tok==VP_STRING) { if (!m_off) { m_lastSym.assign(yyourtext(),yyourleng()); error(m_lastSym); } statePop(); goto next_tok; } else { error((string)"Expecting `error string. Found: "+tokenName(tok)+"\n"); statePop(); goto next_tok; } } case ps_JOIN: { if (tok==VP_SYMBOL || tok==VP_TEXT) { if (m_joinStack.empty()) fatalSrc("`` join stack empty, but in a ``"); string lhs = m_joinStack.top(); m_joinStack.pop(); UINFO(5,"`` LHS:"<<lhs<<endl); string rhs (yyourtext(),yyourleng()); UINFO(5,"`` RHS:"<<rhs<<endl); string out = lhs+rhs; UINFO(5,"`` Out:"<<out<<endl); unputString(out); statePop(); goto next_tok; } else if (tok==VP_EOF || tok==VP_WHITE || tok == VP_COMMENT || tok==VP_STRING) { error((string)"Expecting symbol to terminate ``; whitespace etc cannot follow ``. Found: "+tokenName(tok)+"\n"); statePop(); goto next_tok; } else { // `define, etc, fall through and expand. Pop back here. break; } } case ps_STRIFY: { if (tok==VP_STRIFY) { // Quote what's in the middle of the stringification // Note a `" MACRO_WITH(`") `" doesn't need to be handled (we don't need a stack) // That behavior isn't specified, and other simulators vary widely string out = m_strify; m_strify = ""; // Convert any newlines to spaces, so we don't get a multiline "..." without \ escapes // The spec is silent about this either way; simulators vary string::size_type pos; while ((pos=out.find("\n")) != string::npos) { out.replace(pos, 1, " "); } unputString((string)"\""+out+"\""); statePop(); goto next_tok; } else if (tok==VP_EOF) { error("`\" not terminated at EOF\n"); } else if (tok==VP_BACKQUOTE) { m_strify += "\\\""; goto next_tok; } else if (tok==VP_DEFREF) { // Spec says to expand macros inside `" // Substitue it into the stream, then return here break; } else { // Append token to eventual string m_strify.append(yyourtext(),yyourleng()); goto next_tok; } } default: fatalSrc("Bad case\n"); } // Default is to do top level expansion of some tokens switch (tok) { case VP_INCLUDE: if (!m_off) { statePush(ps_INCNAME); } goto next_tok; case VP_UNDEF: statePush(ps_DEFNAME_UNDEF); goto next_tok; case VP_DEFINE: // No m_off check here, as a `ifdef NEVER `define FOO(`endif) should work statePush(ps_DEFNAME_DEFINE); goto next_tok; case VP_IFDEF: statePush(ps_DEFNAME_IFDEF); goto next_tok; case VP_IFNDEF: statePush(ps_DEFNAME_IFNDEF); goto next_tok; case VP_ELSIF: statePush(ps_DEFNAME_ELSIF); goto next_tok; case VP_ELSE: if (m_ifdefStack.empty()) { error("`else with no matching `if\n"); } else { VPreIfEntry lastIf = m_ifdefStack.top(); m_ifdefStack.pop(); bool enable = !lastIf.everOn(); UINFO(4,"Else "<<(enable?" ON":" OFF")<<endl); m_ifdefStack.push(VPreIfEntry(enable, lastIf.everOn())); if (!lastIf.on()) parsingOn(); if (!enable) parsingOff(); } goto next_tok; case VP_ENDIF: UINFO(4,"Endif "<<endl); if (m_ifdefStack.empty()) { error("`endif with no matching `if\n"); } else { VPreIfEntry lastIf = m_ifdefStack.top(); m_ifdefStack.pop(); if (!lastIf.on()) parsingOn(); // parsingOn() really only enables parsing if // all ifdef's above this want it on } goto next_tok; case VP_DEFREF: { // m_off not right here, but inside substitution, to make this work: `ifdef NEVER `DEFUN(`endif) string name (yyourtext()+1,yyourleng()-1); UINFO(4,"DefRef "<<name<<endl); if (m_defPutJoin) { m_defPutJoin = false; unputString("``"); } if (m_defDepth++ > V3PreProc::DEFINE_RECURSION_LEVEL_MAX) { error("Recursive `define substitution: `"+name); goto next_tok; } // substitute if (!defExists(name)) { // Not found, return original string as-is m_defDepth = 0; UINFO(4,"Defref `"<<name<<" => not_defined"<<endl); if (m_off) { goto next_tok; } else { return (VP_TEXT); } } else { string params = defParams(name); if (params=="0" || params=="") { // Found, as simple substitution if (m_off) { goto next_tok; } else { V3DefineRef tempref(name, ""); string out = defineSubst(&tempref); // Similar code in parenthesized define (Search for END_OF_DEFARG) //NOP: out = m_preprocp->defSubstitute(out); if (m_defRefs.empty()) { // Just output the substitution unputDefrefString(out); } else { // Inside another define. // Can't subst now, or // `define a x,y // foo(`a,`b) would break because a contains comma V3DefineRef* refp = &(m_defRefs.top()); refp->nextarg(refp->nextarg()+m_lexp->m_defValue+out); m_lexp->m_defValue=""; } goto next_tok; } } else { // Found, with parameters UINFO(4,"Defref `"<<name<<" => parameterized"<<endl); // The CURRENT macro needs the paren saved, it's not a property of the child macro if (!m_defRefs.empty()) m_defRefs.top().parenLevel(m_lexp->m_parenLevel); m_defRefs.push(V3DefineRef(name, params)); statePush(ps_DEFPAREN); m_lexp->pushStateDefArg(0); goto next_tok; } } fatalSrc("Bad case\n"); } case VP_ERROR: { statePush(ps_ERRORNAME); goto next_tok; } case VP_EOF: if (!m_ifdefStack.empty()) { error("`ifdef not terminated at EOF\n"); } return tok; case VP_UNDEFINEALL: if (!m_off) { UINFO(4,"Undefineall "<<endl); undefineall(); } goto next_tok; case VP_STRIFY: // We must expand macros in the body of the stringification // Then, when done, form a final string to return // (it could be used as a include filename, for example, so need the string token) statePush(ps_STRIFY); goto next_tok; case VP_SYMBOL: case VP_STRING: case VP_TEXT: { m_defDepth = 0; if (!m_off) return tok; else goto next_tok; } case VP_WHITE: // Handled at top of loop case VP_COMMENT: // Handled at top of loop case VP_DEFFORM: // Handled by state=ps_DEFFORM; case VP_DEFVALUE: // Handled by state=ps_DEFVALUE; default: fatalSrc((string)"Internal error: Unexpected token "+tokenName(tok)+"\n"); break; } return tok; } }
int yylex(void) { register int c; tbl *tp; extern tbl *keytbl, *deftbl; beg: while ((c=gtc())==' ' || c=='\n') ; yylval.token=c; switch(c) { case EOF: return(EOF); case '~': return(SPACE); case '^': return(THIN); case '\t': return(TAB); case '{': return('{'); case '}': return('}'); case '"': for (sp=0; (c=gtc())!='"' && c != '\n'; ) { if (c == '\\') if ((c = gtc()) != '"') token[sp++] = '\\'; token[sp++] = c; if (sp>=SSIZE) error(FATAL, "quoted string %.20s... too long", token); } token[sp]='\0'; yylval.str = &token[0]; if (c == '\n') error(!FATAL, "missing \" in %.20s", token); return(QTEXT); } if (c==righteq) return(EOF); putbak(c); getstr(token, SSIZE); if (dbg)printf(".\tlex token = |%s|\n", token); if ((tp = lookup(&deftbl, token, NULL)) != NULL) { putbak(' '); pbstr(tp->defn); putbak(' '); if (dbg) printf(".\tfound %s|=%s|\n", token, tp->defn); } else if ((tp = lookup(&keytbl, token, NULL)) == NULL) { if(dbg)printf(".\t%s is not a keyword\n", token); return(CONTIG); } else if (tp->defn == (char *) DEFINE || tp->defn == (char *) NDEFINE || tp->defn == (char *) TDEFINE) define((int)(intptr_t) tp->defn); else if (tp->defn == (char *) DELIM) yylval.token = delim(); else if (tp->defn == (char *) GSIZE) yylval.token = globsize(); else if (tp->defn == (char *) GFONT) yylval.token = globfont(); else if (tp->defn == (char *) INCLUDE) include(); else { return (intptr_t)tp->defn; } goto beg; }
/* * Parse (define-library ...) form into given environment, with the * following format: * * (define-library <library name> * <library declaration> ...) * * where <library declaration> is any of: * * - (export <export spec> ...) * - (import <import set> ...) * - (begin <command or definition> ...) * - (include <filename1> <filename2> ...) * - (include-ci <filename1> <filename2> ...) * - (cond-expand <cond-expand clause> ...) */ static library_t* define_library(cons_t* p, const char* file) { library_t *r = new library_t(); cons_t *exports = nil(); // find current dir for resolving include and include-ci std::string curdir = sdirname(file); // define-library if ( symbol_name(caar(p)) != "define-library" ) raise(syntax_error(format( "Imported file does not begin with define-library: %s", file))); // <library name> r->name = verify_library_name(cadar(p)); // A <library declaration> can be either ... for ( p = cdr(cdar(p)); !nullp(p); p = cdr(p) ) { cons_t *id = caar(p); cons_t *body = cdar(p); std::string s = symbol_name(id); if ( s == "export" ) { exports = body; continue; } if ( s == "import" ) { // TODO: Make sure that proc_import does not override // r->internals->outer proc_import(body, r->internals); continue; } if ( s == "begin" ) { eval(car(p), r->internals); continue; } if ( s == "include" ) { eval(splice(list(symbol("begin")), include(body, r->internals, curdir.c_str())), r->internals); continue; } if ( s == "include-ci" ) { eval(splice(list(symbol("begin")), include_ci(body, r->internals, curdir.c_str())), r->internals); continue; } if ( s == "cond-expand" ) { eval(cond_expand(body, r->internals), r->internals); continue; } } // copy exports into exports-environemnt for ( p = exports; !nullp(p); p = cdr(p) ) { // handle renaming if ( listp(car(p)) && length(car(p))==3 && symbol_name(caar(p))=="rename" ) { assert_type(SYMBOL, cadar(p)); assert_type(SYMBOL, caddar(p)); std::string internal_name = symbol_name(cadar(p)); std::string external_name = symbol_name(caddar(p)); r->exports->define(external_name, r->internals->lookup(internal_name)); } else if ( listp(car(p)) ) raise(syntax_error("(export <spec> ...) only allows (rename x y)")); else if ( type_of(car(p)) == SYMBOL ) { r->exports->define(symbol_name(car(p)), r->internals->lookup(symbol_name(car(p)))); } else raise(syntax_error( "(export <spec> ...) requires <spec> to be " "either an identifier or a pair of them.")); } return r; }
int main(int argc, char *argv[]) { static char buff[16384]; struct cpio _cpio; /* Allocated on stack. */ struct cpio *cpio; int uid, gid; int opt; cpio = &_cpio; memset(cpio, 0, sizeof(*cpio)); cpio->buff = buff; cpio->buff_size = sizeof(buff); #if defined(_WIN32) && !defined(__CYGWIN__) /* Make sure open() function will be used with a binary mode. */ /* on cygwin, we need something similar, but instead link against */ /* a special startup object, binmode.o */ _set_fmode(_O_BINARY); #endif /* Need cpio_progname before calling cpio_warnc. */ if (*argv == NULL) cpio_progname = "bsdcpio"; else { #if defined(_WIN32) && !defined(__CYGWIN__) cpio_progname = strrchr(*argv, '\\'); #else cpio_progname = strrchr(*argv, '/'); #endif if (cpio_progname != NULL) cpio_progname++; else cpio_progname = *argv; } cpio->uid_override = -1; cpio->gid_override = -1; cpio->argv = argv; cpio->argc = argc; cpio->line_separator = '\n'; cpio->mode = '\0'; cpio->verbose = 0; cpio->compress = '\0'; cpio->extract_flags = ARCHIVE_EXTRACT_NO_AUTODIR; cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER; cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS; cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT; cpio->extract_flags |= ARCHIVE_EXTRACT_PERM; cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; cpio->extract_flags |= ARCHIVE_EXTRACT_ACL; #if defined(_WIN32) || defined(__CYGWIN__) if (bsdcpio_is_privileged()) #else if (geteuid() == 0) #endif cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER; cpio->bytes_per_block = 512; cpio->filename = NULL; while ((opt = cpio_getopt(cpio)) != -1) { switch (opt) { case '0': /* GNU convention: --null, -0 */ cpio->line_separator = '\0'; break; case 'A': /* NetBSD/OpenBSD */ cpio->option_append = 1; break; case 'a': /* POSIX 1997 */ cpio->option_atime_restore = 1; break; case 'B': /* POSIX 1997 */ cpio->bytes_per_block = 5120; break; case 'C': /* NetBSD/OpenBSD */ cpio->bytes_per_block = atoi(cpio->optarg); if (cpio->bytes_per_block <= 0) cpio_errc(1, 0, "Invalid blocksize %s", cpio->optarg); break; case 'c': /* POSIX 1997 */ cpio->format = "odc"; break; case 'd': /* POSIX 1997 */ cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_AUTODIR; break; case 'E': /* NetBSD/OpenBSD */ include_from_file(cpio, cpio->optarg); break; case 'F': /* NetBSD/OpenBSD/GNU cpio */ cpio->filename = cpio->optarg; break; case 'f': /* POSIX 1997 */ exclude(cpio, cpio->optarg); break; case 'H': /* GNU cpio (also --format) */ cpio->format = cpio->optarg; break; case 'h': long_help(); break; case 'I': /* NetBSD/OpenBSD */ cpio->filename = cpio->optarg; break; case 'i': /* POSIX 1997 */ if (cpio->mode != '\0') cpio_errc(1, 0, "Cannot use both -i and -%c", cpio->mode); cpio->mode = opt; break; case OPTION_INSECURE: cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS; cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT; break; case 'L': /* GNU cpio */ cpio->option_follow_links = 1; break; case 'l': /* POSIX 1997 */ cpio->option_link = 1; break; case 'm': /* POSIX 1997 */ cpio->extract_flags |= ARCHIVE_EXTRACT_TIME; break; case 'n': /* GNU cpio */ cpio->option_numeric_uid_gid = 1; break; case OPTION_NO_PRESERVE_OWNER: /* GNU cpio */ cpio->extract_flags &= ~ARCHIVE_EXTRACT_OWNER; break; case 'O': /* GNU cpio */ cpio->filename = cpio->optarg; break; case 'o': /* POSIX 1997 */ if (cpio->mode != '\0') cpio_errc(1, 0, "Cannot use both -o and -%c", cpio->mode); cpio->mode = opt; break; case 'p': /* POSIX 1997 */ if (cpio->mode != '\0') cpio_errc(1, 0, "Cannot use both -p and -%c", cpio->mode); cpio->mode = opt; cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT; break; case OPTION_QUIET: /* GNU cpio */ cpio->quiet = 1; break; case 'R': /* GNU cpio, also --owner */ if (owner_parse(cpio->optarg, &uid, &gid)) usage(); if (uid != -1) cpio->uid_override = uid; if (gid != -1) cpio->gid_override = gid; break; case 'r': /* POSIX 1997 */ cpio->option_rename = 1; break; case 't': /* POSIX 1997 */ cpio->option_list = 1; break; case 'u': /* POSIX 1997 */ cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER; break; case 'v': /* POSIX 1997 */ cpio->verbose++; break; case OPTION_VERSION: /* GNU convention */ version(); break; #if 0 /* * cpio_getopt() handles -W specially, so it's not * available here. */ case 'W': /* Obscure, but useful GNU convention. */ break; #endif case 'y': /* tar convention */ #if HAVE_LIBBZ2 cpio->compress = opt; #else cpio_warnc(0, "bzip2 compression not supported by " "this version of bsdcpio"); #endif break; case 'Z': /* tar convention */ cpio->compress = opt; break; case 'z': /* tar convention */ #if HAVE_LIBZ cpio->compress = opt; #else cpio_warnc(0, "gzip compression not supported by " "this version of bsdcpio"); #endif break; default: usage(); } } /* * Sanity-check args, error out on nonsensical combinations. */ /* -t implies -i if no mode was specified. */ if (cpio->option_list && cpio->mode == '\0') cpio->mode = 'i'; /* -t requires -i */ if (cpio->option_list && cpio->mode != 'i') cpio_errc(1, 0, "Option -t requires -i", cpio->mode); /* -n requires -it */ if (cpio->option_numeric_uid_gid && !cpio->option_list) cpio_errc(1, 0, "Option -n requires -it"); /* Can only specify format when writing */ if (cpio->format != NULL && cpio->mode != 'o') cpio_errc(1, 0, "Option --format requires -o"); /* -l requires -p */ if (cpio->option_link && cpio->mode != 'p') cpio_errc(1, 0, "Option -l requires -p"); /* TODO: Flag other nonsensical combinations. */ switch (cpio->mode) { case 'o': /* TODO: Implement old binary format in libarchive, use that here. */ if (cpio->format == NULL) cpio->format = "odc"; /* Default format */ mode_out(cpio); break; case 'i': while (*cpio->argv != NULL) { include(cpio, *cpio->argv); --cpio->argc; ++cpio->argv; } if (cpio->option_list) mode_list(cpio); else mode_in(cpio); break; case 'p': if (*cpio->argv == NULL || **cpio->argv == '\0') cpio_errc(1, 0, "-p mode requires a target directory"); mode_pass(cpio, *cpio->argv); break; default: cpio_errc(1, 0, "Must specify at least one of -i, -o, or -p"); } free_cache(cpio->gname_cache); free_cache(cpio->uname_cache); return (0); }
void IRGraphVisitor::visit(const Broadcast *op) { include(op->value); }
void IRGraphVisitor::visit(const Call *op) { for (size_t i = 0; i < op->args.size(); i++) { include(op->args[i]); } }
void IRGraphVisitor::visit(const Load *op) { include(op->index); }
void IRGraphVisitor::visit(const Ramp *op) { include(op->base); include(op->stride); }
void IRGraphVisitor::visit(const Select *op) { include(op->condition); include(op->true_value); include(op->false_value); }
void IRGraphVisitor::visit(const Not *op) { include(op->a); }
void IRGraphVisitor::visit(const Or *op) { include(op->a); include(op->b); }
/** * Add the given tile to the animated tile table (if it does not exist * on that table yet). Also increases the size of the table if necessary. * @param tile the tile to make animated */ void AddAnimatedTile(TileIndex tile) { MarkTileDirtyByTile(tile); include(_animated_tiles, tile); }
void IRGraphVisitor::visit(const LetStmt *op) { include(op->value); include(op->body); }
void recipe_subset::include( const recipe_subset &subset ) { for( const auto &elem : subset ) { include( elem, subset.get_custom_difficulty( elem ) ); } }
void IRGraphVisitor::visit(const AssertStmt *op) { include(op->condition); include(op->message); }
int AttribDeclaration::oneMember(Dsymbol **ps, Identifier *ident) { Dsymbols *d = include(NULL, NULL); return Dsymbol::oneMembers(d, ps, ident); }
void IRGraphVisitor::visit(const ProducerConsumer *op) { include(op->produce); if (op->update.defined()) include(op->update); include(op->consume); }
void Clusterizer::add(const QRect& rect) { QRect biggerrect(rect.x()-1,rect.y()-1,rect.width()+2,rect.height()+2); //assert(rect.width()>0 && rect.height()>0); int cursor; for (cursor=0; cursor<count; cursor++) { if (cluster[cursor].contains(rect)) { // Wholly contained already. return; } } int lowestcost=9999999; int cheapest=-1; for (cursor=0; cursor<count; cursor++) { if (cluster[cursor].intersects(biggerrect)) { QRect larger=cluster[cursor]; include(larger,rect); int cost=larger.width()*larger.height() - cluster[cursor].width()*cluster[cursor].height(); if (cost < lowestcost) { bool bad=FALSE; for (int c=0; c<count && !bad; c++) { bad=cluster[c].intersects(larger) && c!=cursor; } if (!bad) { cheapest=cursor; lowestcost=cost; } } } } if (cheapest>=0) { include(cluster[cheapest],rect); return; } if (count < max) { cluster[count++]=rect; return; } // Do cheapest of: // add to closest cluster // do cheapest cluster merge, add to new cluster lowestcost=9999999; cheapest=-1; for (cursor=0; cursor<count; cursor++) { QRect larger=cluster[cursor]; include(larger,rect); int cost=larger.width()*larger.height() - cluster[cursor].width()*cluster[cursor].height(); if (cost < lowestcost) { bool bad=FALSE; for (int c=0; c<count && !bad; c++) { bad=cluster[c].intersects(larger) && c!=cursor; } if (!bad) { cheapest=cursor; lowestcost=cost; } } } // XXX could make an heuristic guess as to whether we // XXX need to bother looking for a cheap merge. int cheapestmerge1=-1; int cheapestmerge2=-1; for (int merge1=0; merge1<count; merge1++) { for (int merge2=0; merge2<count; merge2++) { if (merge1!=merge2) { QRect larger=cluster[merge1]; include(larger,cluster[merge2]); int cost=larger.width()*larger.height() - cluster[merge1].width()*cluster[merge1].height() - cluster[merge2].width()*cluster[merge2].height(); if (cost < lowestcost) { bool bad=FALSE; for (int c=0; c<count && !bad; c++) { bad=cluster[c].intersects(larger) && c!=cursor; } if (!bad) { cheapestmerge1=merge1; cheapestmerge2=merge2; lowestcost=cost; } } } } } if (cheapestmerge1>=0) { include(cluster[cheapestmerge1],cluster[cheapestmerge2]); cluster[cheapestmerge2]=cluster[count--]; } else { // if (!cheapest) debugRectangles(rect); include(cluster[cheapest],rect); } // NB: clusters do not intersect (or intersection will // overwrite). This is a result of the above algorithm, // given the assumption that (x,y) are ordered topleft // to bottomright. }
void IRGraphVisitor::visit(const For *op) { include(op->min); include(op->extent); include(op->body); }
//////////////////////////////////////////////////////////////////////// // main // int main(int argc, char* argv[]) { std::ios::sync_with_stdio(false); try { cxxtools::Arg<const char*> ofile(argc, argv, 'o'); cxxtools::Arg<bool> fail_on_warn(argc, argv, 'F'); typedef std::list<std::string> includes_type; includes_type includes; while (true) { cxxtools::Arg<const char*> include(argc, argv, 'I', 0); if (!include.isSet()) break; includes.push_back(include.getValue()); } if (argc != 3) { std::cerr << PACKAGE_STRING "\n\n" "usage: " << argv[0] << " [options] ecpp-source translated-data\n\n" " -o filename outputfile\n" " -F fail on warning\n" " -I dir include-directory\n" << std::endl; return 1; } // open source std::ifstream ecpp(argv[1]); if (!ecpp) { std::cerr << "cannot open source-file \"" << argv[1] << '"' << std::endl; return 2; } // open translationfile std::ifstream txt(argv[2]); if (!ecpp) { std::cerr << "cannot open translation-file \"" << argv[2] << '"' << std::endl; return 3; } // create and initialize applicationobject Ecppll app(argv[1]); app.setFailOnWarn(fail_on_warn); app.readReplaceTokens(txt); for (includes_type::const_iterator it = includes.begin(); it != includes.end(); ++it) app.addInclude(*it); // parse app.parse(ecpp); // process if (app.getRet() == 0) { if (ofile.isSet()) { if (strcmp(ofile.getValue(), "-") == 0) app.print(std::cout); else { std::ofstream out(ofile); app.print(out); } } else { tnt::Filename f(argv[1]); f.setExt("tntdata"); std::ofstream out(f.getFullPath().c_str()); app.print(out); } } return app.getRet(); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return -1; } }
void IRGraphVisitor::visit(const Store *op) { include(op->value); include(op->index); }
int AttribDeclaration::oneMember(Dsymbol **ps) { Dsymbols *d = include(NULL, NULL); return Dsymbol::oneMembers(d, ps); }
std::string SourceMap::render_srcmap(Context &ctx) { const bool include_sources = ctx.c_options.source_map_contents; const std::vector<std::string> links = ctx.srcmap_links; const std::vector<Resource>& sources(ctx.resources); JsonNode* json_srcmap = json_mkobject(); json_append_member(json_srcmap, "version", json_mknumber(3)); const char *include = file.c_str(); JsonNode *json_include = json_mkstring(include); json_append_member(json_srcmap, "file", json_include); // pass-through sourceRoot option if (!ctx.source_map_root.empty()) { JsonNode* root = json_mkstring(ctx.source_map_root.c_str()); json_append_member(json_srcmap, "sourceRoot", root); } JsonNode *json_includes = json_mkarray(); for (size_t i = 0; i < source_index.size(); ++i) { std::string include(links[source_index[i]]); if (ctx.c_options.source_map_file_urls) { include = File::rel2abs(include); // check for windows abs path if (include[0] == '/') { // ends up with three slashes include = "file://" + include; } else { // needs an additional slash include = "file:///" + include; } } const char* inc = include.c_str(); JsonNode *json_include = json_mkstring(inc); json_append_element(json_includes, json_include); } json_append_member(json_srcmap, "sources", json_includes); if (include_sources) { JsonNode *json_contents = json_mkarray(); for (size_t i = 0; i < source_index.size(); ++i) { const Resource& resource(sources[source_index[i]]); JsonNode *json_content = json_mkstring(resource.contents); json_append_element(json_contents, json_content); } if (json_contents->children.head) json_append_member(json_srcmap, "sourcesContent", json_contents); } JsonNode *json_names = json_mkarray(); // so far we have no implementation for names // no problem as we do not alter any identifiers json_append_member(json_srcmap, "names", json_names); std::string mappings = serialize_mappings(); JsonNode *json_mappings = json_mkstring(mappings.c_str()); json_append_member(json_srcmap, "mappings", json_mappings); char *str = json_stringify(json_srcmap, "\t"); std::string result = std::string(str); free(str); json_delete(json_srcmap); return result; }