void jl_input_line_callback(char *input) { int end=0, doprint=1; if (!input || ios_eof(ios_stdin)) { end = 1; rl_ast = NULL; } else if (!rl_ast) { // In vi mode, it's possible for this function to be called w/o a // previous call to return_callback. rl_ast = jl_parse_input_line(rl_line_buffer); } if (rl_ast != NULL) { doprint = !ends_with_semicolon(input); add_history_permanent(input); jl_putc('\n', jl_uv_stdout); free(input); } callback_en = 0; rl_callback_handler_remove(); handle_input(rl_ast, end, doprint); rl_ast = NULL; }
static value_t read_vector(value_t label, u_int32_t closer) { value_t v=the_empty_vector, elt; u_int32_t i=0; PUSH(v); if (label != UNBOUND) ptrhash_put(&readstate->backrefs, (void*)label, (void*)v); while (peek() != closer) { if (ios_eof(F)) lerror(ParseError, "read: unexpected end of input"); if (i >= vector_size(v)) { v = Stack[SP-1] = vector_grow(v); if (label != UNBOUND) ptrhash_put(&readstate->backrefs, (void*)label, (void*)v); } elt = do_read_sexpr(UNBOUND); v = Stack[SP-1]; vector_elt(v,i) = elt; i++; } take(); if (i > 0) vector_setsize(v, i); return POP(); }
int true_main(int argc, char *argv[]) { if (lisp_prompt) { jl_lisp_prompt(); return 0; } jl_array_t *args = jl_alloc_cell_1d(argc); jl_set_global(jl_current_module, jl_symbol("ARGS"), (jl_value_t*)args); int i; for (i=0; i < argc; i++) { jl_arrayset(args, i, (jl_value_t*)jl_cstr_to_string(argv[i])); } jl_set_const(jl_current_module, jl_symbol("JULIA_HOME"), jl_cstr_to_string(julia_home)); // run program if specified, otherwise enter REPL if (program) { return exec_program(); } init_repl_environment(); jl_function_t *start_client = (jl_function_t*)jl_get_global(jl_base_module, jl_symbol("_start")); if (start_client) { jl_apply(start_client, NULL, 0); return 0; } // client event loop not available; use fallback blocking version int iserr = 0; again: ; JL_TRY { if (iserr) { jl_show(jl_exception_in_transit); ios_printf(ios_stdout, "\n\n"); iserr = 0; } while (1) { char *input = read_expr("julia> "); if (!input || ios_eof(ios_stdin)) { ios_printf(ios_stdout, "\n"); break; } jl_value_t *ast = jl_parse_input_line(input); jl_value_t *value = jl_toplevel_eval(ast); jl_show(value); ios_printf(ios_stdout, "\n\n"); } } JL_CATCH { iserr = 1; goto again; } return 0; }
DLLEXPORT int jl_ios_eof(ios_t *s) { if (ios_eof(s)) return 1; if (ios_readprep(s, 1) < 1) return 1; return 0; }
DLLEXPORT int jl_ios_eof(ios_t *s) { if (ios_eof(s)) return 1; if (s->state == bst_rd) { if (ios_readprep(s, 1) < 1) return 1; } return 0; }
// build a list of conses. this is complicated by the fact that all conses // can move whenever a new cons is allocated. we have to refer to every cons // through a handle to a relocatable pointer (i.e. a pointer on the stack). static void read_list(value_t *pval, value_t label) { value_t c, *pc; u_int32_t t; PUSH(NIL); pc = &Stack[SP-1]; // to keep track of current cons cell t = peek(); while (t != TOK_CLOSE) { if (ios_eof(F)) lerror(ParseError, "read: unexpected end of input"); c = mk_cons(); car_(c) = cdr_(c) = NIL; if (iscons(*pc)) { cdr_(*pc) = c; } else { *pval = c; if (label != UNBOUND) ptrhash_put(&readstate->backrefs, (void*)label, (void*)c); } *pc = c; c = do_read_sexpr(UNBOUND); // must be on separate lines due to car_(*pc) = c; // undefined evaluation order t = peek(); if (t == TOK_DOT) { take(); c = do_read_sexpr(UNBOUND); cdr_(*pc) = c; t = peek(); if (ios_eof(F)) lerror(ParseError, "read: unexpected end of input"); if (t != TOK_CLOSE) lerror(ParseError, "read: expected ')'"); } } take(); (void)POP(); }
value_t fl_skipws(fl_context_t *fl_ctx, value_t *args, uint32_t nargs) { argcount(fl_ctx, "skip-ws", nargs, 2); ios_t *s = fl_toiostream(fl_ctx, args[0], "skip-ws"); int newlines = (args[1]!=fl_ctx->F); uint32_t wc=0; value_t skipped = fl_ctx->F; while (1) { if (ios_peekutf8(s, &wc) == IOS_EOF) { ios_getutf8(s, &wc); // to set EOF flag if this is a true EOF if (!ios_eof(s)) lerror(fl_ctx, symbol(fl_ctx, "error"), "incomplete character"); return fl_ctx->FL_EOF; } if (!ios_eof(s) && (is_uws(wc) || is_bom(wc)) && (newlines || wc!=10)) { skipped = fl_ctx->T; ios_getutf8(s, &wc); } else { break; } } return skipped; }
value_t fl_skipws(value_t *args, u_int32_t nargs) { argcount("skip-ws", nargs, 2); ios_t *s = fl_toiostream(args[0], "skip-ws"); int newlines = (args[1]!=FL_F); uint32_t wc=0; if (ios_peekutf8(s, &wc) == IOS_EOF) return FL_EOF; value_t skipped = FL_F; while (!ios_eof(s) && (is_uws(wc) || is_bom(wc)) && (newlines || wc!=10)) { skipped = FL_T; ios_getutf8(s, &wc); ios_peekutf8(s, &wc); } return skipped; }
DLLEXPORT void jl_input_line_callback(char *input) { int end=0, doprint=1; if (!input || ios_eof(ios_stdin)) { end = 1; rl_ast = NULL; } if (rl_ast != NULL) { doprint = !ends_with_semicolon(input); add_history_permanent(input); ios_putc('\n', ios_stdout); free(input); } handle_input(rl_ast, end, doprint); }
static u_int32_t peek(void) { char c, *end; fixnum_t x; int ch, base; if (toktype != TOK_NONE) return toktype; c = nextchar(); if (ios_eof(F)) return TOK_NONE; if (c == '(') { toktype = TOK_OPEN; } else if (c == ')') { toktype = TOK_CLOSE; } else if (c == '[') { toktype = TOK_OPENB; } else if (c == ']') { toktype = TOK_CLOSEB; } else if (c == '\'') { toktype = TOK_QUOTE; } else if (c == '`') { toktype = TOK_BQ; } else if (c == '"') { toktype = TOK_DOUBLEQUOTE; } else if (c == '#') { ch = ios_getc(F); c = (char)ch; if (ch == IOS_EOF) lerror(ParseError, "read: invalid read macro"); if (c == '.') { toktype = TOK_SHARPDOT; } else if (c == '\'') { toktype = TOK_SHARPQUOTE; } else if (c == '\\') { uint32_t cval; if (ios_getutf8(F, &cval) == IOS_EOF) lerror(ParseError, "read: end of input in character constant"); if (cval == (uint32_t)'u' || cval == (uint32_t)'U' || cval == (uint32_t)'x') { read_token('u', 0); if (buf[1] != '\0') { // not a solitary 'u','U','x' if (!read_numtok(&buf[1], &tokval, 16)) lerror(ParseError, "read: invalid hex character constant"); cval = numval(tokval); } } else if (cval >= 'a' && cval <= 'z') { read_token((char)cval, 0); tokval = symbol(buf); if (buf[1] == '\0') /* one character */; else if (tokval == nulsym) cval = 0x00; else if (tokval == alarmsym) cval = 0x07; else if (tokval == backspacesym) cval = 0x08; else if (tokval == tabsym) cval = 0x09; else if (tokval == linefeedsym) cval = 0x0A; else if (tokval == newlinesym) cval = 0x0A; else if (tokval == vtabsym) cval = 0x0B; else if (tokval == pagesym) cval = 0x0C; else if (tokval == returnsym) cval = 0x0D; else if (tokval == escsym) cval = 0x1B; else if (tokval == spacesym) cval = 0x20; else if (tokval == deletesym) cval = 0x7F; else lerrorf(ParseError, "read: unknown character #\\%s", buf); } toktype = TOK_NUM; tokval = mk_wchar(cval); } else if (c == '(') { toktype = TOK_SHARPOPEN; } else if (c == '<') { lerror(ParseError, "read: unreadable object"); } else if (isdigit(c)) { read_token(c, 1); c = (char)ios_getc(F); if (c == '#') toktype = TOK_BACKREF; else if (c == '=') toktype = TOK_LABEL; else lerror(ParseError, "read: invalid label"); errno = 0; x = strtol(buf, &end, 10); if (*end != '\0' || errno) lerror(ParseError, "read: invalid label"); tokval = fixnum(x); } else if (c == '!') { // #! single line comment for shbang script support do { ch = ios_getc(F); } while (ch != IOS_EOF && (char)ch != '\n'); return peek(); } else if (c == '|') { // multiline comment int commentlevel=1; while (1) { ch = ios_getc(F); hashpipe_gotc: if (ch == IOS_EOF) lerror(ParseError, "read: eof within comment"); if ((char)ch == '|') { ch = ios_getc(F); if ((char)ch == '#') { commentlevel--; if (commentlevel == 0) break; else continue; } goto hashpipe_gotc; } else if ((char)ch == '#') { ch = ios_getc(F); if ((char)ch == '|') commentlevel++; else goto hashpipe_gotc; } } // this was whitespace, so keep peeking return peek(); } else if (c == ';') { // datum comment (void)do_read_sexpr(UNBOUND); // skip return peek(); } else if (c == ':') { // gensym ch = ios_getc(F); if ((char)ch == 'g') ch = ios_getc(F); read_token((char)ch, 0); errno = 0; x = strtol(buf, &end, 10); if (*end != '\0' || buf[0] == '\0' || errno) lerror(ParseError, "read: invalid gensym label"); toktype = TOK_GENSYM; tokval = fixnum(x); } else if (symchar(c)) { read_token(ch, 0); if (((c == 'b' && (base= 2)) || (c == 'o' && (base= 8)) || (c == 'd' && (base=10)) || (c == 'x' && (base=16))) && (isdigit_base(buf[1],base) || buf[1]=='-')) { if (!read_numtok(&buf[1], &tokval, base)) lerrorf(ParseError, "read: invalid base %d constant", base); return (toktype=TOK_NUM); } toktype = TOK_SHARPSYM; tokval = symbol(buf); } else { lerror(ParseError, "read: unknown read macro"); } } else if (c == ',') { toktype = TOK_COMMA; ch = ios_getc(F); if (ch == IOS_EOF) return toktype; if ((char)ch == '@') toktype = TOK_COMMAAT; else if ((char)ch == '.') toktype = TOK_COMMADOT; else ios_ungetc((char)ch, F); } else { if (!read_token(c, 0)) { if (buf[0]=='.' && buf[1]=='\0') { return (toktype=TOK_DOT); } else { if (read_numtok(buf, &tokval, 0)) return (toktype=TOK_NUM); } } toktype = TOK_SYM; tokval = symbol(buf); } return toktype; }
static NOINLINE int true_main(int argc, char *argv[]) { if (jl_core_module != NULL) { jl_array_t *args = (jl_array_t*)jl_get_global(jl_core_module, jl_symbol("ARGS")); if (args == NULL) { args = jl_alloc_cell_1d(0); JL_GC_PUSH1(&args); jl_set_const(jl_core_module, jl_symbol("ARGS"), (jl_value_t*)args); JL_GC_POP(); } assert(jl_array_len(args) == 0); jl_array_grow_end(args, argc); int i; for (i=0; i < argc; i++) { jl_value_t *s = (jl_value_t*)jl_cstr_to_string(argv[i]); jl_set_typeof(s,jl_utf8_string_type); jl_arrayset(args, s, i); } } jl_function_t *start_client = jl_base_module ? (jl_function_t*)jl_get_global(jl_base_module, jl_symbol("_start")) : NULL; if (start_client) { jl_apply(&start_client, 1); return 0; } // run program if specified, otherwise enter REPL if (argc > 0) { if (strcmp(argv[0], "-")) { return exec_program(argv[0]); } } ios_puts("WARNING: Base._start not defined, falling back to economy mode repl.\n", ios_stdout); if (!jl_errorexception_type) ios_puts("WARNING: jl_errorexception_type not defined; any errors will be fatal.\n", ios_stdout); while (!ios_eof(ios_stdin)) { char *volatile line = NULL; JL_TRY { ios_puts("\njulia> ", ios_stdout); ios_flush(ios_stdout); line = ios_readline(ios_stdin); jl_value_t *val = (jl_value_t*)jl_eval_string(line); if (jl_exception_occurred()) { jl_printf(JL_STDERR, "error during run:\n"); jl_static_show(JL_STDERR, jl_exception_in_transit); jl_exception_clear(); } else if (val) { jl_static_show(JL_STDOUT, val); } jl_printf(JL_STDOUT, "\n"); free(line); line = NULL; uv_run(jl_global_event_loop(),UV_RUN_NOWAIT); } JL_CATCH { if (line) { free(line); line = NULL; } jl_printf(JL_STDERR, "\nparser error:\n"); jl_static_show(JL_STDERR, jl_exception_in_transit); jl_printf(JL_STDERR, "\n"); jlbacktrace(); } } return 0; }