Ejemplo n.º 1
0
int check_alloc(int num)
{
    int to_alloc;

    if (num < coors_allocated)
	return 0;

    to_alloc = coors_allocated;
    while (num >= to_alloc)
	to_alloc += CHUNK;

    if (coors_allocated == 0) {
	xarray = (int *)falloc(to_alloc, sizeof(int));
	yarray = (int *)falloc(to_alloc, sizeof(int));
    }
    else {
	xarray = (int *)frealloc((char *)xarray,
				 to_alloc, sizeof(int), coors_allocated);
	yarray = (int *)frealloc((char *)yarray,
				 to_alloc, sizeof(int), coors_allocated);
    }

    coors_allocated = to_alloc;

    return 0;
}
Ejemplo n.º 2
0
void abitwriter::write( unsigned int val, int nbits )
{
	// safety check for error
	if ( error ) return;
	
	// test if pointer beyond flush treshold
	if ( cbyte > ( dsize - 5 ) ) {
		dsize += adds;
		data = (unsigned char*) frealloc( data, dsize );
		if ( data == NULL ) {
			error = true;
			return;
		}
		memset( ( data + cbyte + 1 ), 0, ( dsize - ( cbyte + 1 ) ) * sizeof( char ) );
	}
	
	// write data
	while ( nbits >= cbit ) {
		data[cbyte] |= ( MBITS32(val, nbits, (nbits-cbit)) );		
		nbits -= cbit;		
		cbyte++;
		cbit = 8;
	}
	
	if ( nbits > 0 ) {		
		data[cbyte] |= ( (RBITS32(val, nbits)) << (cbit - nbits) );
		cbit -= nbits;		
	}	
}
Ejemplo n.º 3
0
unsigned char* abytewriter::getptr( void )
{
	// safety check for error
	if ( error ) return NULL;
	// forbid freeing memory
	fmem = false;
	// realloc data
	data = (unsigned char*) frealloc( data, cbyte );
	
	return data;
}
Ejemplo n.º 4
0
unsigned char* abitwriter::getptr( void )
{
	// data is padded here
	pad( fillbit );
	// forbid freeing memory
	fmem = false;
	// realloc data
	data = (unsigned char*) frealloc( data, cbyte );
	
	return data;
}
Ejemplo n.º 5
0
/**
 * @brief resizes the server list
 * @return 1 if resize failed, 0 otherwise
 **/
int string_list_resize(string_list** servers)
{
    int new_size = (*servers)->max_size + SERVER_LIST_DEFAULT_MAX_SIZE;
    char** new_array;
    if((new_array = (char**) frealloc((*servers)->array,
                    new_size * sizeof(char*))) == NULL)
        return 1;
    (*servers)->max_size = new_size;
    (*servers)->array = new_array;
    return 0;
}
Ejemplo n.º 6
0
void abytewriter::write( unsigned char byte )
{
	// safety check for error
	if ( error ) return;
	
	// test if pointer beyond flush threshold
	if ( cbyte >= ( dsize - 2 ) ) {
		dsize += adds;
		data = (unsigned char*) frealloc( data, dsize );
		if ( data == NULL ) {
			error = true;
			return;
		}
	}
	
	// write data
	data[ cbyte++ ] = byte;
}
Ejemplo n.º 7
0
void abytewriter::write_n( unsigned char* byte, int n )
{
	// safety check for error
	if ( error ) return;
	
	// make sure that pointer doesn't get beyond flush threshold
	while ( ( cbyte + n ) >= ( dsize - 2 ) ) {
		dsize += adds;
		data = (unsigned char*) frealloc( data, dsize );
		if ( data == NULL ) {
			error = true;
			return;
		}
	}
	
	// copy data from array
	while ( n-- > 0 )
		data[ cbyte++ ] = *(byte++);
}
Ejemplo n.º 8
0
/**
 * @function ferite_stack_push 
 * @declaration void ferite_stack_push( FeriteStack *stck, void *ptr )
 * @brief Push a value onto the stack
 * @param FeriteStack *stck The stack to push the value onto
 * @param void *ptr The pointer to push onto the stack
 */
void ferite_stack_push( FeriteScript *script, FeriteStack *stck, void *ptr )
{
    int i;

    FE_ENTER_FUNCTION;
    stck->stack_ptr++;
    if( stck->stack_ptr < stck->size )
        stck->stack[stck->stack_ptr] = ptr;
    else
    {
        FUD(("Resizing STACK\n"));
        /* stack aint big enough. make it bigger. */
        stck->size *= 2;
        stck->stack = frealloc( stck->stack, sizeof( void * ) * stck->size );
        for( i = stck->stack_ptr; i < stck->size; i++ )
          stck->stack[i] = NULL;
        stck->stack[stck->stack_ptr] = ptr;
    }
    FE_LEAVE_FUNCTION( NOWT );
}
Ejemplo n.º 9
0
const char* indentation(unsigned level) {
	/* Try just using a static array full of spaces */
	static char blanks[40 * IWIDTH + 1] = "";
	if(blanks[0] == '\0') {
		memset(blanks, ICHAR, ARRSIZE(blanks) - 1);
		blanks[ARRSIZE(blanks) - 1] = '\0';
	}
	
	if(level <= (ARRSIZE(blanks) - 1) / IWIDTH) {
		return &blanks[ARRSIZE(blanks) - 1 - level * IWIDTH];
	}
	
	/* Too much indentation for static array */
	
	/* Find target index of spaces array large enough */
	size_t index = 0;
	size_t count = (ARRSIZE(blanks) - 1) / IWIDTH;
	while(level > count) {
		++index;
		count *= 2;
	}
	
	/* Expand array if necessary */
	static size_t large_count = 0;
	static char** larger = NULL;
	if(index + 1 > large_count) {
		size_t new_count = index + 1;
		larger = frealloc(larger, new_count * sizeof(*larger));
		memset(larger + large_count, 0, (new_count - large_count) * sizeof(*larger));
		large_count = new_count;
	}
	
	/* Need to create array of spaces */
	if(larger[index] == NULL) {
		larger[index] = fmalloc(count * IWIDTH + 1);
		memset(larger[index], IWIDTH, count * IWIDTH);
		larger[index][count * IWIDTH] = '\0';
	}
	
	return &larger[index][(count - level) * IWIDTH];
}
Ejemplo n.º 10
0
void abitwriter::write_bit( unsigned char bit )
{
	// safety check for error
	if ( error ) return;
	
	// write data
	if ( bit ) data[cbyte] |= 0x1 << (--cbit);
	else --cbit;
	if ( cbit == 0 ) {
		// test if pointer beyond flush treshold
		if ( ++cbyte > ( dsize - 5 ) ) {
			dsize += adds;
			data = (unsigned char*) frealloc( data, dsize );
			if ( data == NULL ) {
				error = true;
				return;
			}
			memset( ( data + cbyte + 1 ), 0, ( dsize - ( cbyte + 1 ) ) * sizeof( char ) );
		}
		cbit = 8;
	} 
}
Ejemplo n.º 11
0
/**
 * fills the global searchresult structure with the results of the given search.
 * Returns the number of found titles.
 * pat - pattern to search for
 * global - include DNP
 * fill - fill artist and album results
 */
int search( const char *pat, const mpcmd range, const int global ) {
	mptitle *root=getConfig()->root;
	mptitle *runner=root;
	searchresults *res=getConfig()->found;
	unsigned int i=0;
	int found=0;
	unsigned int cnt=0;
	/* free buffer playlist, the arrays will not get lost due to the realloc later */
	res->titles=wipePlaylist(res->titles);
	res->tnum=0;
	res->anum=0;
	res->lnum=0;

	do {
		activity("searching");
		found=0;
		if( global || !(runner->flags & MP_DNP) ) {
			/* check for searchrange and pattern */
			if( MPC_ISTITLE(range) &&
					isMatch( runner->title, pat, MPC_ISFUZZY(range) ) ) {
				found=1;
			}
			if( MPC_ISDISPLAY( range ) &&
					isMatch( runner->display, pat, MPC_ISFUZZY(range) ) ) {
				found=1;
			}
			if( MPC_ISARTIST(range) &&
					isMatch( runner->artist, pat, MPC_ISFUZZY(range) ) ) {
				found=1;
			}
			if( MPC_ISALBUM( range ) &&
					isMatch( runner->album, pat, MPC_ISFUZZY(range) ) ) {
				found=1;
			}
			/* todo: genre and path are missing here */
			if( found ) {
				/* check for new artist */
				for( i=0; (i<res->anum) && strcmp( res->artists[i], runner->artist ); i++ );
				if( i == res->anum ) {
					res->anum++;
					res->artists=(char**)frealloc( res->artists, res->anum*sizeof(char*) );
					res->artists[i]=runner->artist;
				}

				for( i=0; (i<res->lnum) && strcmp( res->albums[i], runner->album ); i++ );
				if( i == res->lnum ) {
					res->lnum++;
					res->albums=(char**)frealloc( res->albums, res->lnum*sizeof(char*) );
					res->albums[i]=runner->album;
					res->albart=(char**)frealloc( res->albart, res->lnum*sizeof(char*) );
					res->albart[i]=runner->artist;
				}
				else if( !strcmp( res->albart[i], ARTIST_SAMPLER ) &&
						strcmp( res->albart[i], runner->artist ) ){
					addMessage(1, "%s is considered a sampler (%s <> %s).", runner->album, runner->artist, res->albart[i] );
					res->albart[i]=ARTIST_SAMPLER;
				}
			}

			/* add titles too */
			if( ( found != 0 ) && ( cnt++ < MAXSEARCH ) ) {
				res->titles=appendToPL( runner, res->titles, 0 );
				res->tnum++;
			}
		}
		runner=runner->next;
	} while( runner != root );

	res->send=-1;

	return (cnt>MAXSEARCH)?-1:cnt;
}
Ejemplo n.º 12
0
void returnGiant(giant g)
{

	#if	GIANTS_VIA_STACK

	unsigned 	stackNum;
	gstack 		*gs;
	unsigned 	cap = g->capacity;


	#if	FEE_DEBUG
	if(!gstackInitd) {
		CKRaise("returnGiant before stacks initialized!");
	}
	#endif	// FEE_DEBUG

	#if	GIANT_MAC_DEBUG
	if(g == NULL) {
		dblog0("returnGiant: null g!\n");
	}
	#endif

	/*
	 * Find appropriate stack. Note we expect exact match of
	 * capacity and stack's giant size.
	 */
	/*
	 * Optimized unrolled loop. Just make sure there are enough cases
	 * to handle all of the stacks. Errors in this case will be flagged
	 * via LOG_GIANT_STACK_OVERFLOW.
	 */
	switch(cap) {
	    case MIN_GIANT_SIZE:
	        stackNum = 0;
		break;
	    case MIN_GIANT_SIZE << GIANT_SIZE_INCR:
	        stackNum = 1;
		break;
	    case MIN_GIANT_SIZE << (2 * GIANT_SIZE_INCR):
	        stackNum = 2;
		break;
	    case MIN_GIANT_SIZE << (3 * GIANT_SIZE_INCR):
	        stackNum = 3;
		break;
	    case MIN_GIANT_SIZE << (4 * GIANT_SIZE_INCR):
	        stackNum = 4;
		break;
	    default:
	        stackNum = numGstacks;
		break;
	}

	if(stackNum >= numGstacks) {
		/*
		 * out of bounds; just free
		 */
		#if	LOG_GIANT_STACK_OVERFLOW
		gstackDbg(("giantToStack overflow; numDigits %d\n", cap));
		#endif	// LOG_GIANT_STACK_OVERFLOW
		freeGiant(g);
		return;
	}
	gs = &gstacks[stackNum];
    	if(gs->numFree == gs->totalGiants) {
	    	if(gs->totalGiants == 0) {
			gstackDbg(("Initial alloc of gstack(%d)\n",
				gs->numDigits));
	    		gs->totalGiants = INIT_NUM_GIANTS;
	    	}
	    	else {
			gs->totalGiants *= 2;
			gstackDbg(("Bumping gstack(%d) to %d\n",
				gs->numDigits, gs->totalGiants));
		}
	    	gs->stack = (giantstruct**) frealloc(gs->stack, gs->totalGiants*sizeof(giant));
    	}
   	g->sign = 0;		// not sure this is important...
    	gs->stack[gs->numFree++] = g;

	#if	GIANT_MAC_DEBUG
	if((gs->numFree != 0) && (gs->stack == NULL)) {
		dblog0("borrowGiant: null stack!\n");
	}
	#endif
	
	#else	/* GIANTS_VIA_STACK */

	freeGiant(g);

	#endif	/* GIANTS_VIA_STACK */
}
Ejemplo n.º 13
0
Expression* Expression_parse(const char** expr) {
	Expression* ret = NULL;
	Variable* var;
	Value* val;
	
	const char* equals = strchr(*expr, '=');
	
	if(equals == NULL) {
		/* No assignment, just a plain expression. */
		return parseExpr(expr);
	}
	
	/* There is an assignment */
	/* First, parse the right side of the assignment */
	equals++;
	val = Value_parse(&equals, 0, 0);
	
	if(val->type == VAL_ERR) {
		/* A parse error occurred */
		var = VarErr(Error_copy(val->err));
		Value_free(val);
		return Expression_new(var);
	}
	
	if(val->type == VAL_END) {
		/* Empty input */
		Value_free(val);
		var = VarErr(earlyEnd());
		return Expression_new(var);
	}
	
	/* Now parse the left side */
	char* name = nextToken(expr);
	if(name == NULL) {
		Value_free(val);
		var = VarErr(syntaxError("No variable to assign to."));
		return Expression_new(var);
	}
	
	trimSpaces(expr);
	
	if(**expr == '(') {
		/* Defining a function */
		(*expr)++;
		
		/* Array of argument names */
		unsigned size = 2;
		char** args = fmalloc(size * sizeof(*args));
		unsigned len = 0;
		
		/* Add each argument name to the array */
		char* arg = nextToken(expr);
		
		if(arg == NULL && **expr != ')') {
			/* Invalid character */
			Value_free(val);
			free(args);
			free(name);
			
			var = VarErr(badChar(**expr));
			return Expression_new(var);
		}
		
		trimSpaces(expr);
		
		if(arg == NULL) {
			/* Empty parameter list means function with no args */
			free(args);
			args = NULL;
			len = 0;
		}
		else {
			/* Loop through each argument in the list */
			while(**expr == ',' || **expr == ')') {
				args[len++] = arg;
				
				if(**expr == ')')
					break;
				
				(*expr)++;
				
				/* Expand argument array if it's too small */
				if(len >= size) {
					size *= 2;
					args = frealloc(args, size * sizeof(*args));
				}
				
				arg = nextToken(expr);
				if(arg == NULL) {
					/* Invalid character */
					Value_free(val);
					free(name);
					/* Free argument names and return */
					unsigned i;
					for(i = 0; i < len; i++) {
						free(args[i]);
					}
					free(args);
					
					var = VarErr(badChar(**expr));
					return Expression_new(var);
				}
				
				trimSpaces(expr);
			}
		}
		
		if(**expr != ')') {
			/* Invalid character inside argument name list */
			Value_free(val);
			free(name);
			
			/* Free argument names and return */
			unsigned i;
			for(i = 0; i < len; i++) {
				free(args[i]);
			}
			free(args);
			
			var = VarErr(badChar(**expr));
			return Expression_new(var);
		}
		
		/* Skip closing parenthesis */
		(*expr)++;
		trimSpaces(expr);
		
		if(**expr != '=') {
			Value_free(val);
			free(name);
			
			unsigned i;
			for(i = 0; i < len; i++) {
				free(args[i]);
			}
			free(args);
			
			var = VarErr(badChar(**expr));
			return Expression_new(var);
		}
		
		/* Construct function and return it */
		Function* func = Function_new(len, args, val);
		var = VarFunc(name, func);
		free(name);
		
		ret = Expression_new(var);
	}
	else {
		/* Defining a variable */
		if(**expr != '=') {
			/* In-place manipulation */
			BINTYPE bin = BinOp_nextType(expr, 0, 0);
			
			/* Still not an equals sign means invalid character */
			if(**expr != '=') {
				Value_free(val);
				free(name);
				
				var = VarErr(badChar(**expr));
				return Expression_new(var);
			}
			
			val = ValExpr(BinOp_new(bin, ValVar(name), val));
		}
		
		var = VarValue(name, val);
		free(name);
		
		ret = Expression_new(var);
	}
	
	return ret;
}