Beispiel #1
0
void IoLexer_free(IoLexer *self)
{
	IoLexer_clear(self);
	io_free(self->s);
	Stack_free(self->posStack);
	Stack_free(self->tokenStack);
	List_free(self->tokenStream);
	List_free(self->charLineIndex);
	if(self->errorDescription) io_free(self->errorDescription);
	io_free(self);
}
Beispiel #2
0
int main(void)
{
   struct Stack *psStack1;
   struct Stack *psStack2;
   int iSuccessful;

   /* Use a Stack object referenced by psStack1. */
   
   psStack1 = Stack_new();
   if (psStack1 == NULL) handleMemoryError();
   
   iSuccessful = Stack_push(psStack1, 1.1);
   if (! iSuccessful) handleMemoryError();
   
   iSuccessful = Stack_push(psStack1, 2.2);
   if (! iSuccessful) handleMemoryError();

   iSuccessful = Stack_push(psStack1, 3.3);
   if (! iSuccessful) handleMemoryError();

   while (! Stack_isEmpty(psStack1))
      printf("%g\n", Stack_pop(psStack1));

   /***********************************************/
   /* Cannot access the fields of *psStack1 here. */
   /***********************************************/

   Stack_free(psStack1);

   /* Use a Stack object referenced by psStack2. */
      
   psStack2 = Stack_new();
   if (psStack2 == NULL) handleMemoryError();
   
   iSuccessful = Stack_push(psStack2, 4.4);
   if (! iSuccessful) handleMemoryError();
   
   iSuccessful = Stack_push(psStack2, 5.5);
   if (! iSuccessful) handleMemoryError();

   iSuccessful = Stack_push(psStack2, 6.6);
   if (! iSuccessful) handleMemoryError();
   
   while (! Stack_isEmpty(psStack2))
      printf("%g\n", Stack_pop(psStack2));

   /***********************************************/
   /* Cannot access the fields of *psStack2 here. */
   /***********************************************/

   Stack_free(psStack2);

   return 0;
}
Beispiel #3
0
void IoCoroutine_free(IoCoroutine *self)
{
	Coro *coro = DATA(self)->cid;
	if (coro) Coro_free(coro);
	Stack_free(DATA(self)->ioStack);
	io_free(DATA(self));
}
Beispiel #4
0
void IoCoroutine_free(IoCoroutine *self)
{
	//printf("IoCoroutine_free %p\n", (void *)self);
	Coro *coro = DATA(self)->cid;
	if (coro) Coro_free(coro);
	Stack_free(DATA(self)->ioStack);
	io_free(DATA(self));
}
Beispiel #5
0
void free_IDs(Stack_T unmapped_IDs)
{
	uint32_t *ID;
	while (!Stack_empty(unmapped_IDs)) {
		ID = Stack_pop(unmapped_IDs);
		FREE(ID);
	}

	Stack_free(&unmapped_IDs);
}
Beispiel #6
0
/* free the mem */
void free_mem(Mem* myMem)
{
	assert(myMem != NULL);
	for (int i = 0; i < Seq_length((*myMem)->segs); i++) {
		Seg_free(Seq_get((*myMem)->segs, i));
	}
	
	Seq_free(&((*myMem)->segs));
	Stack_free(&((*myMem)->unmapped));
	free(*myMem);
}
Beispiel #7
0
void Stack_do_on_(const Stack *self, StackDoOnCallback *callback, void *target)
{
	Stack *stack = Stack_newCopyWithNullMarks(self);
	int i;

	for(i = 0; i < Stack_count(stack) - 1; i ++)
	{
		void *v = Stack_at_(stack, i);
		if (v) (*callback)(target, v);
	}

	Stack_free(stack);
}
Beispiel #8
0
void IoState_new_atAddress(void *address)
{
	IoState *self = (IoState *)address;
	IoCFunction *cFunctionProto;
	IoSeq *seqProto;

	// collector

	self->collector = Collector_new();
	IoState_pushCollectorPause(self);

	Collector_setMarkFunc_(self->collector, (CollectorMarkFunc *)IoObject_mark);
	Collector_setWillFreeFunc_(self->collector, (CollectorWillFreeFunc *)IoObject_willFree);
	Collector_setFreeFunc_(self->collector, (CollectorFreeFunc *)IoObject_free);

	self->mainArgs   = MainArgs_new();
	self->primitives = PHash_new();

	self->recycledObjects = List_new();
	self->maxRecycledObjects = IOSTATE_DEFAULT_MAX_RECYCLED_OBJECTS;

	// Sandbox

	self->messageCount = 0;
	self->messageCountLimit = 0;
	self->endTime = 0;

	// symbol table

	self->symbols = SHash_new();

	SHash_setKeysEqualCallback(self->symbols, (SHashKeysEqualCallback *)UArray_equalsWithHashCheck_);
	SHash_setHashForKeyCallback(self->symbols, (SHashHashforKeyCallback *)UArray_hash);

	/*
	Problem:
	- there are some interdependencies here:
	- creating instances requires a retain stack
	- we need a Coroutine to use for our retainStack
	- defining any primitive methods requires Strings and CFunctions

	Solution:
	- create a temporary fake stack
	- create Object, CFunction and String protos sans methods.
	- then add methods to Object, CFunction and String
	*/

	self->currentIoStack = Stack_new(); // temp retain stack until coro is up

	self->objectProto = IoObject_proto(self); // need to do this first, so we have a retain stack
	//IoState_retain_(self, self->objectProto);

	self->mainCoroutine = IoCoroutine_proto(self);
	Stack_free(self->currentIoStack);
	self->currentIoStack = NULL;

	IoState_setCurrentCoroutine_(self, self->mainCoroutine);

	seqProto = IoSeq_proto(self);

	IoState_setupQuickAccessSymbols(self);

	IoObject_rawSetProto_(seqProto, self->objectProto);

	cFunctionProto = IoCFunction_proto(self);
	self->localsUpdateSlotCFunc = IoState_retain_(self,
												  IoCFunction_newWithFunctionPointer_tag_name_(self,
												  IoObject_localsUpdateSlot, NULL, "localsUpdate"));

	IoSeq_protoFinish(seqProto);
	IoObject_protoFinish(self);
	IoCFunction_protoFinish(self);
	IoCoroutine_protoFinish(self->mainCoroutine);

	self->setSlotBlock  = IoState_retain_(self, IoObject_getSlot_(self->objectProto, SIOSYMBOL("setSlot")));

	// setup lobby

	{
		IoObject *objectProto = self->objectProto;
		IoObject *protos = IOCLONE(objectProto);
		IoObject *core = IOCLONE(objectProto);

		self->core = core;
		self->lobby = IOCLONE(objectProto);
		IoState_retain_(self, self->lobby);
		IoState_retain_(self, self->core);

		// setup namespace

		IoObject_setSlot_to_(self->lobby, SIOSYMBOL("Lobby"), self->lobby);
		IoObject_setSlot_to_(self->lobby, SIOSYMBOL("Protos"), protos);
		IoObject_setSlot_to_(protos, SIOSYMBOL("Core"), core);
		IoObject_setSlot_to_(protos, SIOSYMBOL("Addons"), IOCLONE(objectProto));

		IoObject_setSlot_to_(core, SIOSYMBOL("Compiler"),  IoCompiler_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Collector"), IoCollector_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Exception"), IOCLONE(objectProto));

		// setup proto chain

		IoObject_rawSetProto_(objectProto, self->lobby);
		IoObject_rawSetProto_(self->lobby, protos);
		IoObject_rawSetProto_(protos, core);

		// add protos to namespace

		IoObject_setSlot_to_(core, SIOSYMBOL("Object"), objectProto);
		IoObject_setSlot_to_(core, SIOSYMBOL("Sequence"), seqProto);
		IoObject_setSlot_to_(core, SIOSYMBOL("Number"), IoNumber_proto(self));

		IoState_setupCachedNumbers(self);

		{
			IoObject *systemProto = IoSystem_proto(self);
			IoObject_setSlot_to_(core, SIOSYMBOL("System"), systemProto);
		}

		IoState_setupSingletons(self);
		IoState_setupCachedMessages(self);

		{
			self->debugger = IoState_retain_(self, IoDebugger_proto(self));
			IoObject_setSlot_to_(core, SIOSYMBOL("Debugger"), self->debugger);

			self->vmWillSendMessage  = IoMessage_newWithName_(self, SIOSYMBOL("vmWillSendMessage"));
			IoMessage_cachedResult_(self->nilMessage, self->ioNil);
			IoState_retain_(self, self->vmWillSendMessage);
		}

		IoObject_setSlot_to_(core, SIOSYMBOL("Block"),      IoBlock_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("List"),       IoList_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Map"),        IoMap_proto(self));
		//IoObject_setSlot_to_(core, SIOSYMBOL("Range"),      IoRange_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Coroutine"),  self->mainCoroutine);
		IoObject_setSlot_to_(core, SIOSYMBOL("Error"),      IoError_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("File"),       IoFile_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Directory"),  IoDirectory_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Date"),       IoDate_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Duration"),   IoDuration_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("WeakLink"),   IoWeakLink_proto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Sandbox"),    IoSandbox_proto(self));
		//IoObject_setSlot_to_(core, SIOSYMBOL("EditLine"),   IoEditLine_proto(self));

#if !defined(__SYMBIAN32__)
		IoObject_setSlot_to_(core, SIOSYMBOL("DynLib"),     IoDynLib_proto(self));
#endif

		//self->store =
		//IoObject_setSlot_to_(core, SIOSYMBOL("Store"),      self->store);
		IoObject_setSlot_to_(core, SIOSYMBOL("CFunction"),  cFunctionProto);

		self->localsProto = IoState_retain_(self, IoObject_localsProto(self));
		IoObject_setSlot_to_(core, SIOSYMBOL("Locals"),  self->localsProto);

		self->stopStatus = MESSAGE_STOP_STATUS_NORMAL;
		self->returnValue = self->ioNil;

		IoState_clearRetainStack(self);

		IoState_popCollectorPause(self);

		//Collector_collect(self->collector);

		//io_show_mem("before IoVMCodeInit");
		IoVMCodeInit(core);

		//io_show_mem("after IoVMCodeInit");
		//Collector_collect(self->collector);
		//io_show_mem("after Collector_collect");

//		IoState_popCollectorPause(self);
		IoState_clearRetainStack(self);

		Collector_collect(self->collector);
		//io_show_mem("after IoState_clearRetainStack and Collector_collect");
		IoState_setupUserInterruptHandler(self);
	}
}
Beispiel #9
0
int main(int argc, char *argv[]) {
	int c;
	sp = Stack_new();
	Fmt_register('D', AP_fmt);
	while ((c = getchar()) != EOF)
		switch (c) {
		case ' ': case '\t': case '\n': case '\f': case '\r':
			break;
		case '0': case '1': case '2': case '3': case '4':
		case '5': case '6': case '7': case '8': case '9': {
			char buf[512];
			{
				int i = 0;
				for ( ; c != EOF && isdigit(c); c = getchar(), i++)
					if (i < (int)sizeof (buf) - 1)
						buf[i] = c;
				if (i > (int)sizeof (buf) - 1) {
					i = (int)sizeof (buf) - 1;
					Fmt_fprint(stderr,
						"?integer constant exceeds %d digits\n", i);
				}
				buf[i] = 0;
				if (c != EOF)
					ungetc(c, stdin);
			}
			Stack_push(sp, AP_fromstr(buf, 10, NULL));
			break;
		}
		case '+': {
			AP_T y = pop(), x = pop();
			Stack_push(sp, AP_add(x, y));
			AP_free(&x);
			AP_free(&y);
			break;
		}
		case '-': {
			AP_T y = pop(), x = pop();
			Stack_push(sp, AP_sub(x, y));
			AP_free(&x);
			AP_free(&y);
			break;
		}
		case '*': {
			AP_T y = pop(), x = pop();
			Stack_push(sp, AP_mul(x, y));
			AP_free(&x);
			AP_free(&y);
			break;
		}
		case '/': {
			AP_T y = pop(), x = pop();
			if (AP_cmpi(y, 0) == 0) {
				Fmt_fprint(stderr, "?/ by 0\n");
				Stack_push(sp, AP_new(0));
			} else
				Stack_push(sp, AP_div(x, y));
			AP_free(&x);
			AP_free(&y);
			break;
		}
		case '%': {
			AP_T y = pop(), x = pop();
			if (AP_cmpi(y, 0) == 0) {
				Fmt_fprint(stderr, "?%% by 0\n");
				Stack_push(sp, AP_new(0));
			} else
				Stack_push(sp, AP_mod(x, y));
			AP_free(&x);
			AP_free(&y);
			break;
		}
		case '^': {
			AP_T y = pop(), x = pop();
			if (AP_cmpi(y, 0) <= 0) {
				Fmt_fprint(stderr, "?nonpositive power\n");
				Stack_push(sp, AP_new(0));
			} else
				Stack_push(sp, AP_pow(x, y, NULL));
			AP_free(&x);
			AP_free(&y);
			break;
		}
		case 'd': {
			AP_T x = pop();
			Stack_push(sp, x);
			Stack_push(sp, AP_addi(x, 0));
			break;
		}
		case 'p': {
			AP_T x = pop();
			Fmt_print("%D\n", x);
			Stack_push(sp, x);
			break;
		}
		case 'f':
			if (!Stack_empty(sp)) {
				Stack_T tmp = Stack_new();
				while (!Stack_empty(sp)) {
					AP_T x = pop();
					Fmt_print("%D\n", x);
					Stack_push(tmp, x);
				}
				while (!Stack_empty(tmp))
					Stack_push(sp, Stack_pop(tmp));
				Stack_free(&tmp);
			}
			break;
		case '~': {
			AP_T x = pop();
			Stack_push(sp, AP_neg(x));
			AP_free(&x);
			break;
		}
		case 'c': while (!Stack_empty(sp)) {
			  	AP_T x = Stack_pop(sp);
			  	AP_free(&x);
			  } break;
		case 'q': while (!Stack_empty(sp)) {
			  	AP_T x = Stack_pop(sp);
			  	AP_free(&x);
			  }
			  Stack_free(&sp);
			  return EXIT_SUCCESS;
		default:
			if (isprint(c))
				Fmt_fprint(stderr, "?'%c'", c);
			else
				Fmt_fprint(stderr, "?'\\%03o'", c);
			Fmt_fprint(stderr, " is unimplemented\n");
			break;
		}
	while (!Stack_empty(sp)) {
		AP_T x = Stack_pop(sp);
		AP_free(&x);
	}
	Stack_free(&sp);
	return EXIT_SUCCESS;
}
Beispiel #10
0
/**
 * @if conly
 * @memberof ASTNode_t
 * @endif
 */
LIBSBML_EXTERN
ASTNode_t *
SBML_parseFormula (const char *formula)
{
  long rule, state, action;

  ASTNode_t *node = NULL;

  FormulaTokenizer_t *tokenizer = NULL; 
  Stack_t            *stack     = NULL;
  Token_t            *token     = NULL;

  if (formula == NULL) return NULL;
  
  tokenizer = FormulaTokenizer_createFromFormula(formula);
  token     = FormulaTokenizer_nextToken(tokenizer);
  stack     = Stack_create(20);


  Stack_push(stack, (void *) START_STATE);

  while (1)
  {
    state  = (long) Stack_peek(stack);
    action = FormulaParser_getAction(state, token);

    if (action == ACCEPT_STATE)
    {
      node = Stack_peekAt(stack, 1);
      break;
    }

    else if (action == ERROR_STATE)
    {
      /**
       * Free ASTNodes on the Stack, skip the states.
       */
      while (Stack_size(stack) > 1)
      {
        Stack_pop(stack);
        ASTNode_free( Stack_pop(stack) );
      }

      node = NULL;
      break;
    }

    /**
     * Shift
     */
    else if (action > 0)
    {
      Stack_push( stack, ASTNode_createFromToken(token) );
      Stack_push( stack, (void *) action );

      Token_free(token);
      token = FormulaTokenizer_nextToken(tokenizer);
    }

    /**
     * Reduce
     */
    else if (action < 0)
    {
      rule  = -action;
      node  = FormulaParser_reduceStackByRule(stack, rule);
      state = (long) Stack_peek(stack);

      Stack_push( stack, node );
      Stack_push( stack, (void *) FormulaParser_getGoto(state, rule) );
    }
  }

  FormulaTokenizer_free(tokenizer);
  Stack_free(stack);
  Token_free(token);

  return node;
}
/*                  EVALUATE THE EXPRESSION:                         */
static void evaluate(Token_T* oTokens, int length) {
    Stack_T oStack1;
    Stack_T oStack2;
    int i;
    /* Create and use a Stack of tokens. */
    assert(oTokens != NULL);
    oStack1 = Stack_new();
    oStack2 = Stack_new();
    for (i = 0; i < length; i++) {
        if (Token_getType(oTokens[i]) == VALUE)
            Stack_push(oStack1, oTokens[i]);
        else if (Stack_isEmpty(oStack2))
            Stack_push(oStack2, oTokens[i]);
        else if (precedence(oTokens[i], Stack_top(oStack2)))
            Stack_push(oStack2, oTokens[i]);
        else { /*ERROR HANDLING?*/
            int result;
            Token_T value_1 = (Token_T)Stack_top(oStack1);
            Stack_pop(oStack1);
            Token_T operator = (Token_T)Stack_top(oStack2);
            Stack_pop(oStack2);
            Token_T value_2 = (Token_T)Stack_top(oStack1);
            Stack_pop(oStack1);
            switch (Token_getType(operator))
            {   /*LEFT TO RIGHT EVALUATION*/
            case MULT:
                result = Token_getValue(value_1) * Token_getValue(value_2);
                break;
            case DIV:
                result = Token_getValue(value_2) / Token_getValue(value_1);
                break;
            case PLUS:
                result = Token_getValue(value_1) + Token_getValue(value_2);
                break;
            case MINUS:
                result = Token_getValue(value_2) - Token_getValue(value_1);
                break;
            default:
                assert(0);
            }
            Stack_push(oStack1, Token_newToken(VALUE, result));
            Stack_push(oStack2, oTokens[i]);
        }
    }
    while (!Stack_isEmpty(oStack2)) { /*ERROR HANDLING? + MODULARITY MUCH????*/
        int result;
        Token_T value_1 = (Token_T)Stack_top(oStack1);
        Stack_pop(oStack1);
        Token_T operator = (Token_T)Stack_top(oStack2);
        Stack_pop(oStack2);
        Token_T value_2 = (Token_T)Stack_top(oStack1);
        Stack_pop(oStack1);
        switch (Token_getType(operator))
        {   /*LEFT TO RIGHT EVALUATION*/
        case MULT:
            result = Token_getValue(value_1) * Token_getValue(value_2);
            break;
        case DIV:
            result = Token_getValue(value_2) / Token_getValue(value_1);
            break;
        case PLUS:
            result = Token_getValue(value_1) + Token_getValue(value_2);
            break;
        case MINUS:
            result = Token_getValue(value_2) - Token_getValue(value_1);
            break;
        default:
            assert(1);
        }
        Stack_push(oStack1, Token_newToken(VALUE, result));
    }
    printf("%d\n", Token_getValue((Token_T)Stack_top(oStack1)));
    Stack_free(oStack1);
    Stack_free(oStack2);
}
Beispiel #12
0
/* 
 * Input: Mem_T structure
 * Output: void
 * Purpose: Frees all memory. Frees each segment, the sequence of segments,   
 *          the sequence of reusable indices and the pointer to the memory 
 *          structure
 */
void MemT_free(Mem_T memory){
        Mem_arr_free(memory->segment_seq);
        Stack_free(memory->reusable_indices);        
        free(memory);
}