int parse_options(int argc, char *argv[]) { int c; while ((c = getopt(argc, argv, "+be:E:ip:ql:L:m:u:Vr:F:f:I:A:-")) >= 0) { switch (c) { case 'b': batch_mode = TRUE; break; case 'i': interactive_mode = TRUE; break; case 'q': load_initfile = FALSE; break; case 'V': version(); break; case 'f': further_options(optarg); break; case 'p': profiler_options(optarg); break; case 'F': feature_options(optarg); break; case 'm': main_module = Scm_Intern(SCM_STRING(SCM_MAKE_STR_COPYING(optarg))); break; case 'r': /*FALLTHROUGH*/; case 'u': /*FALLTHROUGH*/; case 'l': /*FALLTHROUGH*/; case 'L': /*FALLTHROUGH*/; case 'I': /*FALLTHROUGH*/; case 'A': /*FALLTHROUGH*/; case 'e': /*FALLTHROUGH*/; case 'E': /*FALLTHROUGH*/; pre_cmds = Scm_Acons(SCM_MAKE_CHAR(c), SCM_MAKE_STR_COPYING(optarg), pre_cmds); break; case '-': break; case '?': usage(); break; } } return optind; }
/* If symbol S has a prefix P, returns a symbol without the prefix. Otherwise, returns #f. */ ScmObj Scm_SymbolSansPrefix(ScmSymbol *s, ScmSymbol *p) { const ScmStringBody *bp = SCM_STRING_BODY(SCM_SYMBOL_NAME(p)); const ScmStringBody *bs = SCM_STRING_BODY(SCM_SYMBOL_NAME(s)); int zp = SCM_STRING_BODY_SIZE(bp); int zs = SCM_STRING_BODY_SIZE(bs); const char *cp = SCM_STRING_BODY_START(bp); const char *cs = SCM_STRING_BODY_START(bs); if (zp > zs || memcmp(cp, cs, zp) != 0) return SCM_FALSE; return Scm_Intern(SCM_STRING(Scm_MakeString(cs + zp, zs - zp, -1, SCM_STRING_IMMUTABLE))); }
/* Process command-line options that needs to run after Scheme runtime is initialized. CMD_ARGS is an list of (OPTION-CHAR . OPTION-ARG) */ static void process_command_args(ScmObj cmd_args) { ScmEvalPacket epak; ScmLoadPacket lpak; int standard_given = FALSE; ScmObj cp; SCM_FOR_EACH(cp, cmd_args) { ScmObj p = SCM_CAR(cp); ScmObj v = SCM_CDR(p); switch (SCM_CHAR_VALUE(SCM_CAR(p))) { case 'I': Scm_AddLoadPath(Scm_GetStringConst(SCM_STRING(v)), FALSE); break; case 'A': Scm_AddLoadPath(Scm_GetStringConst(SCM_STRING(v)), TRUE); break; case 'l': if (Scm_Load(Scm_GetStringConst(SCM_STRING(v)), 0, &lpak) < 0) error_exit(lpak.exception); break; case 'L': if (Scm_Load(Scm_GetStringConst(SCM_STRING(v)), SCM_LOAD_QUIET_NOFILE, &lpak) < 0) error_exit(lpak.exception); break; case 'u': if (Scm_Require(Scm_StringJoin(Scm_StringSplitByChar(SCM_STRING(v), '.'), SCM_STRING(SCM_MAKE_STR("/")), SCM_STRING_JOIN_INFIX), 0, &lpak) < 0) { error_exit(lpak.exception); } Scm_ImportModule(SCM_CURRENT_MODULE(), Scm_Intern(SCM_STRING(v)), SCM_FALSE, 0); break; case 'e': if (Scm_EvalCString(Scm_GetStringConst(SCM_STRING(v)), SCM_OBJ(Scm_UserModule()), &epak) < 0) { error_exit(epak.exception); } break; case 'E': v = Scm_StringAppend(SCM_LIST3(SCM_MAKE_STR("("), v, SCM_MAKE_STR(")"))); if (Scm_EvalCString(Scm_GetStringConst(SCM_STRING(v)), SCM_OBJ(Scm_UserModule()), &epak) < 0) { error_exit(epak.exception); } break; case 'r': if (standard_given) { Scm_Error("Multiple -r option is specified."); } else { /* R7RS mode. Preload r7rs module, set the default toplevel to r7rs.user, and define *r7rs-mode* in user module so that gauche.interactive can do proper setup. */ const char *std = Scm_GetStringConst(SCM_STRING(v)); if (strcmp(std, "7") == 0) { if (Scm_Require(SCM_MAKE_STR("r7rs"), 0, &lpak) < 0) { error_exit(lpak.exception); } SCM_DEFINE(Scm_UserModule(), "*r7rs-mode*", SCM_TRUE); default_toplevel_module = SCM_FIND_MODULE("r7rs.user", 0); standard_given = TRUE; } else { Scm_Error("Unsupported standard for -r option: %s", std); } } } }