Пример #1
0
/* compose -- evaluate a sequential composition or piping */
PRIVATE env compose(tree t, env e, tok ldec, tok rdec, char *kind)
{
     env e1 = tc_sexp(t->x_arg1, e);
     env e2 = tc_sexp(t->x_arg2, e);
     env ee = new_env(e);
     def q;

     /* Get vars from left arg that don't match */
     for (;;) {
	  def d = pop_def(e1);
	  if (d == NULL) 
	       break;
	  else if (d->d_name->s_decor != ldec)
	       push_def(d, ee);
	  else {
	       sym rname = mk_symbol(d->d_name->s_basename, rdec);
	       type rtype = del_var(rname, e2);
	       if (rtype == NULL)
		    push_def(d, ee);
	       else if (! unify(d->d_type, rtype)) {
		    tc_error(t->x_loc, "Type mismatch in %s", kind);
		    tc_e_etc("Expression: %z", t);
		    tc_e_etc("Type of %n in LHS: %t", d->d_name, d->d_type);
		    tc_e_etc("Type of %n in RHS: %t", rname, rtype);
		    tc_e_end();
	       }
	  }
     }

     /* Now merge the unmatched vars from the right */
     for (q = e2->e_defs; q != NULL; q = q->d_next)
	  merge_def(VAR, q->d_name, q->d_type, ee, t, t->x_loc);

     return ee;
}
Пример #2
0
pointer seld_notes() {
  amc_found=tst_alive_amc();
  if (!amc_found && !find_amc()) 
    return Error_0("STOP! amc not running");
  BMessage mes(STORE_SEL),
           reply;
  StoredNote *notes;
  Settings *settings;
  ssize_t bytes=0;
  int n,
      items=0;
  amc_application.SendMessage(&mes,&reply);
  puts("amc did reply");
  switch (reply.what) {
    case CONTENTS_SEL:
      reply.FindData(SELD_NOTES,B_OBJECT_TYPE,(const void**)(&notes),&bytes);
      items=bytes/sizeof(StoredNote);
      reply.FindData(SETTINGS,B_OBJECT_TYPE,(const void**)(&settings),&bytes);
      break;
    default: return Error_0("seld notes: unknown reply");
  } 
  pointer ptr,
          out=nil_pointer();
  for (n=0;n<items;++n) {
    ptr=cons(mk_integer(notes[n].lnr),
         cons(mk_integer(notes[n].snr),
          cons(mk_integer(notes[n].sign),
           cons(mk_integer(notes[n].dur),nil_pointer()))));
    out=cons(ptr,out);
  }
  ptr=cons(mk_integer(settings->meter),nil_pointer());
  ptr=cons(mk_symbol("meter"),ptr);
  ptr=cons(ptr,nil_pointer());
  return cons(ptr,out);
}
Пример #3
0
void Theme::init_interpreter(void) {
	if(priv->sc) return;

	scheme *ss = edelib_scheme_init_raw();
	if(!ss) {
		E_WARNING(E_STRLOC ": Unable to init interpreter\n");
		return;
	}

	priv->sc = ss;

	/* must be called */
	scheme_set_input_port_file(ss, stdin);
	scheme_set_output_port_file(ss, stdout);

	/* install user supplied error handler first, if given */
	if(priv->err_func) {
		ss->vptr->scheme_define(ss,
								ss->global_env,
								ss->vptr->mk_symbol(ss, "private:theme.error_hook"),
								ss->vptr->mk_foreign_func(ss, theme_error_hook));

		/* make sure interpreter does not use this function at all */
		scheme_set_external_data(ss, (void*)priv);
	}

	/* load init stuff */
	scheme_load_string(ss, init_ss_content);

	/* load theme stuff */
	scheme_load_string(ss, theme_ss_content);

	/* 
	 * Set (or override) common variables before actual script was loaded. 
	 * Variables are static and can't be changed.
	 */
	pointer sym;

	sym = mk_symbol(ss, "*edelib-dir-separator*");
	scheme_define(ss, ss->global_env, sym, mk_string(ss, E_DIR_SEPARATOR_STR));
	ss->vptr->setimmutable(sym);

	sym = mk_symbol(ss, "*edelib-version*");
	scheme_define(ss, ss->global_env, sym, mk_string(ss, EDELIB_VERSION));
	ss->vptr->setimmutable(sym);
}
Пример #4
0
static char *get_string_var(scheme *sc, const char *symbol) {
	pointer x = edelib_scheme_eval(sc, mk_symbol(sc, symbol));

	if(x != sc->NIL && sc->vptr->is_string(x))
		return sc->vptr->string_value(x);

	return NULL;
}
Пример #5
0
static void dopending(Symbol p) {
	if (pending != NULL) {
		int uid = symboluid(pending);
		rcc_symbol_ty symbol = mk_symbol(pending);
		Seq_addhi(pickle->items, rcc_Symbol(uid, symbol));
	}
	pending = p;
}
Пример #6
0
static void asdl_local(Symbol p) {
	assert(p->x.offset == 0);
	put(rcc_Local(symboluid(p), mk_symbol(p)));
	if (p->temporary && p->u.t.cse) {
		p->u.t.next = temps;
		temps = p;
	}
}
Пример #7
0
jl_sym_t *jl_symbol(const char *str)
{
    jl_sym_t **pnode;

    pnode = symtab_lookup(&symtab, str);
    if (*pnode == NULL)
        *pnode = mk_symbol(str);
    return *pnode;
}
Пример #8
0
/* open_sref -- find a schema and process its parameters */
PUBLIC bool open_sref(tree t, env e, def *d, frame *f)
{
     if ((*d = get_schema((tok) t->x_sref_tag, t->x_loc)) == NULL)
	  return FALSE;
     *f = mk_frame((*d)->d_nparams);
     get_params("Schema", mk_symbol((tok) t->x_sref_tag, empty),
		t->x_sref_params, e, *f, t->x_loc);
     return TRUE;
}
Пример #9
0
value_t symbol(char *str)
{
    symbol_t **pnode;

    pnode = symtab_lookup(&symtab, str);
    if (*pnode == NULL)
        *pnode = mk_symbol(str);
    return tagptr(*pnode, TAG_SYM);
}
Пример #10
0
bool Theme::load(const char *f) {
	E_RETURN_VAL_IF_FAIL(f != NULL, false);
	/* do not allow loading if clear() wasn't called before */
	E_RETURN_VAL_IF_FAIL(priv->sc == NULL, false);
	priv->is_loaded = false;

	init_interpreter();
	scheme *ss = priv->sc;

	/* 
	 * Determine from which directory we loads file, and set that file as base directory
	 * where '(include)' statement can search additional files. Include uses 'private::theme.search-path'.
	 */
	char *path = edelib_strndup(f, PATH_MAX);
	if(!path)
		E_FATAL(E_STRLOC ": No memory\n");

	char *dir = local_dirname(path);

	/* If returned name is the same as file, dirname wasn't found directory name in given path. */
	if(strcmp(dir, f) != 0) {
		pointer sym = mk_symbol(ss, "private:theme.search-path");
		edelib_scheme_define(ss, ss->global_env, sym, mk_string(ss, dir));
		ss->vptr->setimmutable(sym);
	}

	/* scheme copies path, so we do not need it any more */
	free(path);

	FILE *fd = fopen(f, "r");
	if(!fd) {
		edelib_scheme_deinit(ss);
		free(ss);
		priv->sc = 0;
		return false;
	}

	edelib_scheme_load_named_file(ss, fd, f);
	fclose(fd);

	if(ss->no_memory) {
		E_WARNING(E_STRLOC ": No memory to load theme source in interpreter\n");
		return false;
	}
		
	if(ss->retcode != 0)
		return false;

	/* fetch common variables */
	priv->name   = get_string_var(ss, "private:theme.name");
	priv->author = get_string_var(ss, "private:theme.author");
	priv->sample = get_string_var(ss, "private:theme.sample");

	priv->is_loaded = true;
	return true;
}
Пример #11
0
static jl_sym_t *_jl_symbol(const char *str, size_t len)
{
    jl_sym_t **pnode;
    jl_sym_t *parent;
    pnode = symtab_lookup(&symtab, str, len, &parent);
    if (*pnode == NULL) {
        *pnode = mk_symbol(str, len);
        if (parent != NULL)
            jl_gc_wb(parent, *pnode);
    }
    return *pnode;
}
Пример #12
0
jl_sym_t *jl_symbol(const char *str)
{
    jl_sym_t **pnode;
    jl_sym_t *parent;
    pnode = symtab_lookup(&symtab, str, &parent);
    if (*pnode == NULL) {
        *pnode = mk_symbol(str);
        if (parent != NULL)
            gc_wb(parent, *pnode);
    }
    return *pnode;
}
Пример #13
0
static jl_sym_t *_jl_symbol(const char *str, size_t len)
{
    jl_sym_t *volatile *slot;
    jl_sym_t *node = symtab_lookup(&symtab, str, len, &slot);
    if (node == NULL) {
        JL_LOCK(&symbol_table_lock); // Might GC
        // Someone might have updated it, check and look up again
        if (*slot != NULL && (node = symtab_lookup(slot, str, len, &slot))) {
            JL_UNLOCK(&symbol_table_lock); // Might GC
            return node;
        }
        node = mk_symbol(str, len);
        jl_atomic_store_release(slot, node);
        JL_UNLOCK(&symbol_table_lock); // Might GC
    }
    return node;
}
Пример #14
0
static enum TOK_T get_next_token(port *in, pointer *token)
{
        char ch, *t;

        skip_white_spc(in);
        switch (ch = get_next_char(in)) {
        case EOF:
                return FILE_END;
        case '(':
                return LIST_START;
        case ')':
                return LIST_END;
        case '"':
                *token = mk_string(read_string(in));
                return STRING;
        case '\'':
                return QUOTE;
        case '`':
                return BACKQUOTE;
        case ',':
                if ((ch = get_next_char(in)) == '@')
                        return SPLICE;
                else {
                        push_back_char(in, ch);
                        return UNQUOTE;
                }
        case '.':
                return DOT;
        default:
                push_back_char(in, ch);
                t = get_char_until_delim(in);
                if (test_number(t)) {
                        *token = mk_number(atoi(t));
                        return NUMBER;
                } else {
                        *token = mk_symbol(t);
                        return SYMBOL;
                }
        }
}
ShellService::ShellService()
  : d(new Impl)
{
  if (d->m_Scheme == nullptr)
  {
    throw std::runtime_error("Could not initialize Scheme interpreter");
  }
  scheme_set_output_port_file(d->m_Scheme, stdout);

  BundleResource schemeInitRes = GetBundleContext().GetBundle().GetResource("tinyscheme/init.scm");
  if (schemeInitRes)
  {
    this->LoadSchemeResource(schemeInitRes);
  }
  else
  {
    std::cerr << "Scheme file init.scm not found";
  }

  std::vector<BundleResource> schemeResources = GetBundleContext().GetBundle().FindResources("/", "*.scm", false);
  for (std::vector<BundleResource>::iterator iter = schemeResources.begin(),
       iterEnd = schemeResources.end(); iter != iterEnd; ++iter)
  {
    if (*iter)
    {
      this->LoadSchemeResource(*iter);
    }
  }

  scheme_define(d->m_Scheme, d->m_Scheme->global_env, mk_symbol(d->m_Scheme, "us-bundle-ids"), mk_foreign_func(d->m_Scheme, us_bundle_ids));
  scheme_define(d->m_Scheme, d->m_Scheme->global_env, mk_symbol(d->m_Scheme, "us-bundle-info"), mk_foreign_func(d->m_Scheme, us_bundle_info));
  scheme_define(d->m_Scheme, d->m_Scheme->global_env, mk_symbol(d->m_Scheme, "us-display-bundle-info"), mk_foreign_func(d->m_Scheme, us_display_bundle_info));
  scheme_define(d->m_Scheme, d->m_Scheme->global_env, mk_symbol(d->m_Scheme, "us-bundle-start"), mk_foreign_func(d->m_Scheme, us_bundle_start));
  scheme_define(d->m_Scheme, d->m_Scheme->global_env, mk_symbol(d->m_Scheme, "us-bundle-stop"), mk_foreign_func(d->m_Scheme, us_bundle_stop));
  scheme_define(d->m_Scheme, d->m_Scheme->global_env, mk_symbol(d->m_Scheme, "us-install"), mk_foreign_func(d->m_Scheme, us_install));
}
Пример #16
0
void init_plugin(scheme *sc) 
{
    scheme_define(sc, sc->global_env, 
        mk_symbol(sc, "plugin"), 
        mk_foreign_func(sc, plugin_function));
}
Пример #17
0
int main(int argc, char **argv) {
	FILE       *fin  = NULL;
	const char *expr = NULL;
	scheme      sc;

	if(argc > 1) { 
		if(argv[1][0] == '-') {
			if((strcmp(argv[1], "--help") == 0) || (strcmp(argv[1], "-h") == 0)) {
				help();
				return 0;
			} else if((strcmp(argv[1], "--expression") == 0) || (strcmp(argv[1], "-e") == 0)) {
				if(!argv[2]) {
					printf("This option requires a parameter\n");
					return 1;
				}
				expr = argv[2];
			} else {
				printf("Unrecognized option. Use 'ede-scriptbus --help' for options\n");
				return 1;
			}
		}

		if(!expr) {
			fin = fopen(argv[1], "r");
			if(!fin) {
				fprintf(stderr, "Unable to load '%s' file!\n", argv[1]);
				return 1;
			}
		}
	}

	if(!scheme_init(&sc)) {
		fprintf(stderr, "Fatal: Unable to initialize interpreter!\n");
		return 1;
	}

	scheme_set_input_port_file(&sc, stdin);
	scheme_set_output_port_file(&sc, stdout);

	/* load basic stuff */
	scheme_load_string(&sc, init_scm_content);

	/* register additional functions */
	register_sys_functions(&sc);
	register_communication_functions(&sc);
	register_string_functions(&sc);
	register_wm_functions(&sc);

	/* construct *args* */
	pointer args = sc.NIL;
	for(int i = 0; i < argc; i++) {
		pointer value = mk_string(&sc, argv[i]);
		args = cons(&sc, value, args);
	}

	args = scheme_reverse(&sc, args);
	scheme_define(&sc, sc.global_env, mk_symbol(&sc, "*args*"), args);

	if(!expr) {
		/* load file or go into console */
		if(!fin) {
			fin = stdin;
			printf("Type '(quit)' or press Ctrl-D to quit");
		}

		scheme_load_file(&sc, fin);
	} else {
		/* or execute expression */
		scheme_load_string(&sc, expr);
		if(sc.retcode != 0)
			printf("Bad expression: '%s'\n", expr);
	}

	scheme_deinit(&sc);
	return 0;
}
Пример #18
0
int main(int argc, char **argv) 
{
     scheme sc;
     FILE *fin;
     char *file_name = INITFILE;
     int isfile = 1;
     
     if (argc == 1) {
          printf(BANNER);
     }

     if (argc == 2 && strcmp(argv[1], "-?") == 0) {
          usage();

          return 1;
     }

     if (!scheme_init(&sc)) {
          fprintf(stderr, "Could not initialize!\n");

          return 2;
     }

     scheme_set_input_port_file(&sc, stdin);
     scheme_set_output_port_file(&sc, stdout);

#if USE_DL
     scheme_define(&sc, sc.global_env, 
                   mk_symbol(&sc, "load-extension"), 
                   mk_foreign_func(&sc, scm_load_ext));
#endif

     argv++;

     if (access(file_name, 0) != 0) {
          char *p = getenv("TINYSCHEMEINIT");

          if (p != 0) {
               file_name = p;
          }
     }

     do {
          if (strcmp(file_name, "-") == 0) {
               fin = stdin;
          } else if (strcmp(file_name, "-1") == 0 || 
                     strcmp(file_name, "-c") == 0) {
               pointer args = sc.NIL;

               isfile = file_name[1] == '1';
               file_name = *argv++;

               if (strcmp(file_name, "-") == 0) {
                    fin = stdin;
               } else if (isfile) {
                    fin = fopen(file_name, "r");
               }

               for (; *argv; argv++) {
                    pointer value = mk_string(&sc, *argv);

                    args = cons(&sc, value, args);
               }

               args = reverse_in_place(&sc, sc.NIL, args);
               scheme_define(&sc, sc.global_env, 
                             mk_symbol(&sc, "*args*"), args);
               
          } else {
               fin = fopen(file_name, "r");
          }

          if (isfile && fin == 0) {
               fprintf(stderr, "Could not open file %s\n", file_name);
          } else {
               if (isfile) {
                    scheme_load_named_file(&sc, fin, file_name);
               } else {
                    scheme_load_string(&sc, file_name);
               }

               if (!isfile || fin != stdin) {
                    if (sc.retcode != 0) {
                         fprintf(stderr, "Errors encountered reading %s\n", file_name);
                    }

                    if (isfile) {
                         fclose(fin);
                    }
               }
          }

          file_name = *argv++;

     } while (file_name != 0);

     if (argc == 1) {
          scheme_load_named_file(&sc, stdin, 0);
     }

     scheme_deinit(&sc);
     
     return sc.retcode;
}
Пример #19
0
static void asdl_address(Symbol q, Symbol p, long n) {
	assert(q->x.offset == 0);
	put(rcc_Address(symboluid(q), mk_symbol(q), symboluid(p), n));
}
Пример #20
0
static pointer cons_with_symbol(char *string, pointer object)
{
        return cons(mk_symbol(string), object);
}