void construct_from_serial(char *data,int length,hash *array){
  char *start_of_split=data;
  char *end_of_split=NULL;
  while(length>(start_of_split-data)){
    end_of_split=strchr(start_of_split,'\0')+1; //The +1 is to jump over the control char
    assign_element(array,start_of_split,end_of_split, sizeof(int16_t));
    start_of_split=end_of_split+sizeof(int16_t);
  }
}
Ejemplo n.º 2
0
int i_execute_line (SOURCE_FILE * sf,const int todo)
{
	l_get_line(sf);pline = line;
	l_get_token();
	if (token_type==TT_LINE_END)
	{
		return EXE_DO;// skip empty line
	}
	else if (IS_KEYWORD(token_type))
	{
		if (token_type==KEY_END)
		{
			return EXE_END;
		}
		else if (token_type==KEY_IF)
		{
			return i_execute_if (sf,todo);
		}
		else if (token_type==KEY_WHILE)
		{
			return i_execute_while(sf,todo);
		}
		else if (token_type==KEY_REPEAT)
		{
			return i_execute_repeat(sf,todo);
		}
		if (token_type==KEY_UNTIL)
		{
			return EXE_UNTIL;
		}
		else if (token_type==KEY_FOR)
		{
			return i_execute_for(sf,todo);
		}
		else if (token_type==KEY_CASE)
		{
			return i_execute_case(sf,todo);
		}
		else if (token_type==KEY_ELSEIF)
		{
			return EXE_ELSEIF;
		}
		else if (token_type==KEY_WHEN)
		{
			return EXE_WHEN;
		}
		else if (token_type==KEY_ELSE)
		{
			return EXE_ELSE;
		}
		if (!todo) return EXE_DO;
		if (token_type==KEY_BREAK)
		{
			return EXE_BREAK;
		}
		else if (token_type==KEY_RETURN)
		{
			return EXE_RETURN;
		}
		else if (token_type==KEY_GOSUB)
		{
			extern int i_call_sub (SOURCE_FILE *,const char *);
			l_get_token();
			return i_call_sub(sf,token);
		}
		else if (token_type==KEY_DIM)
		{
			ARRAY *	array;
			long	size;
			
			while(1)
			{
				l_get_token();
				// new array
				array = (ARRAY*)calloc(sizeof(ARRAY),1);
				array->name  = s_strdup(token);
				list_push(&list_array,array);
				//
				l_get_token();// skip '('
				size = (long)calc_check(FALSE,pline);
				if (size<=0)
				{
					merror_msg("illegal array size %d!",size);
				}
				array->size  = size;
				array->array = calloc(sizeof(real),size);
				{
					int i;
					for (i=0;i<size;++i) array->array[i] = 0.0;
				}
				l_get_token();// skip ')'
				l_get_token();
				if		(token_type==TT_COM)		continue;
				else if	(token_type==TT_LINE_END)	break;
			}
		}
		else if (token_type==KEY_EXIT)
		{
			d_exit();
		}
	}
	else if(token_type==TT_ID)
	{
		if (str_eq(token,"print"))
		{
			while(1)
			{
				l_get_token();
				if (token_type==TT_STRING)
				{
					printf("%s",token);
				}
				else
				{
					real result;
					char buf[128];
				
					l_put_back();
					result = calc_check(FALSE,pline);
					d_ftoa(result,buf);
					printf(buf);
				}
				l_get_token();
				if (token_type==TT_LINE_END)break;
			}//while
		}//print
		else if (str_eq(token,"input"))
		{
			VAR * v;char buf[64];
			while(1)
			{
				l_get_token();
				v = get_var(token);
				gets(64,buf);puts(buf);
				v->value = atof(buf);
				l_get_token();
				if (token_type==TT_LINE_END)break;
			}//while
		}//input
		else
		{
			ARRAY * a;
			VAR * var;
			var = find_var(token);
			if (var!=NULL)
			{
				l_get_token(); //skip '='
				var->value = calc_check(FALSE,pline);
				return EXE_DO;
			}
			a = find_array(token);
			if(a!=NULL)
			{
				int index;
				l_get_token();//skip (
				index = (int)calc_check(FALSE,pline);
				// delete this line,calc_check call skip ( automatically
				//l_get_token();//skip )
				l_get_token();// skip =
				assign_element(a,index,calc_check(FALSE,pline));
				return EXE_DO;
			}
			var = create_var(token);
			l_get_token(); //skip '='
			var->value = calc_check(FALSE,pline);
			return EXE_DO;
		}//assign
	}// TT_ID
	else
	{
		merror_illegal_token();
	}
	return EXE_DO;
}