Framework assistant problems ?

BlitzMax Forums/BlitzMax Programming/Framework assistant problems ?

skn3(Posted 2007) [#1]
Has anyone else had problems with framework assistant when importing from a direct location ?

Strict

Import BRL.Bank
Import brl.stream

'this file contains anything that is global to any file

'constants
Private
	Const _eol:String = "~r~n"
Public

'this type simply extends the built in bank class, agiving helper functions used by the tcp network layer
Type Tbuffer
	Field _buffer:Byte Ptr
	Field _size:Int
	Field _filled:Int = 0
	Field _blocksize:Int = 1024

	Function Create:tbuffer(nsize:Int)
		Assert nsize >= 0 Else "Illegal buffer size"
		
		Local temp_buffer:tbuffer = New tbuffer
		temp_buffer._buffer = MemAlloc(nsize)
		temp_buffer._size = nsize
		temp_buffer._filled = 0
		
		Return temp_buffer
	End Function
	
	Method Delete()
		If _size>=0 MemFree _buffer
	End Method
	
	Method Buffer:Byte Ptr()
		'this function returns the pointer to the buffer
		Return _buffer
	End Method
	
	Method SetBlockSize(nsize:Int)
		'sets a new blocksize for the buffer
		_blocksize = nsize
	End Method
	
	Method GetBlockSize:Int()
		'gets teh current block size fo teh buffer
		Return _blocksize
	End Method
	
	Method GetCapacity:Int()
		'gets the current max size of the buffer
		Return _size
	End Method
	
	Method TrimLeft:Int(ncount:Int)
		Assert ncount <= _filled Else "Buffer out of bounds"
		'trims X amount of data from left of the buffer
		Local temp_i:Int
		
		'shift the data left
		For temp_i = ncount Until _filled
			_buffer[temp_i - ncount] = _buffer[temp_i]
		Next
		
		'decreased filled count
		_filled :- ncount
	End Method
	
	Method TrimRight:Int(ncount:Int)
		Assert ncount <= _filled Else "Buffer out of bounds"
		'trims X amount of data from right of the buffer
		_filled :- ncount
	End Method
		
	Method Cut:tbuffer(nstart:Int=0,nend:Int=0)
		Assert nend >= 0 And nend <= _filled And nstart >= 0 And nstart <= _filled Else "Buffer out of bounds"
		'this function will cut a chunk of data and return it as a new buffer object
		
		Local temp_count:Int = 0
		Local temp_i:Int = 0
		
		'check for cut until end
		If nend = 0 nend = _filled
		
		'check for end before start
		If nend < nstart
			temp_i = nend
			nend = nstart
			nstart = temp_i
		End If
		
		'calculate section details
		temp_count = nend - nstart
	
		Local temp_buffer:tbuffer = CreateBuffer(temp_count)
		Local temp_shift:Int = _filled - nstart - temp_count
		
		'check for 0 sized cut
		If temp_count = 0 Return temp_buffer
		
		'check for cut until end
		If temp_count = -1 temp_count = _filled - nstart
		
		'read out data from buffer into new buffer
		For temp_i = 0 Until temp_count
			temp_buffer._buffer[temp_i] = _buffer[nstart + temp_i]
		Next
		temp_buffer._filled = temp_count
		
		'shift data right closing the gap in old buffer
		For temp_i = 0 Until temp_shift
			_buffer[nstart + temp_i] = _buffer[nstart + temp_count + temp_i]
		Next
		
		'shrink the filled size to reflect this
		_filled :- temp_count
		
		Return temp_buffer
	End Method
	
	Method CutAsString:String(nstart:Int=0,nend:Int=0)
		Assert nend >= 0 And nend <= _filled And nstart >= 0 And nstart <= _filled Else "Buffer out of bounds"
		'this function will cut a chunk of data and return it as a string
		
		Local temp_count:Int = 0
		Local temp_i:Int = 0
		
		'check for cut until end
		If nend = 0 nend = _filled
		
		'check for end before start
		If nend < nstart
			temp_i = nend
			nend = nstart
			nstart = temp_i
		End If
		
		'calculate section details
		temp_count = nend - nstart
	
		Local temp_buffer:String = ""
		Local temp_shift:Int = _filled - nstart - temp_count
		
		'check for 0 sized cut
		If temp_count = 0 Return temp_buffer
		
		'check for cut until end
		If temp_count = -1 temp_count = _filled - nstart
		
		'read out data from buffer into new buffer
		For temp_i = 0 Until temp_count
			temp_buffer:+ Chr(_buffer[nstart + temp_i])
		Next
		
		'shift data right closing the gap in old buffer
		For temp_i = 0 Until temp_shift
			_buffer[nstart + temp_i] = _buffer[nstart + temp_count + temp_i]
		Next
		
		'shrink the filled size to reflect this
		_filled :- temp_count
		
		Return temp_buffer
	End Method
	
	Method Copy:tbuffer(nstart:Int=0,ncount:Int=0)
		Assert nstart + ncount <= _filled Else "Buffer out of bounds"
		
		'this function will copy a chunk of data and return it as a new buffer object
		Local temp_buffer:tbuffer = CreateBuffer(ncount)
		Local temp_i:Int = 0
		
		'check for copy entire contents of buffer
		If nstart = 0 And ncount = 0
			nstart = 0
			ncount = _filled
		End If
		
		'check for 0 sized cut
		If ncount = 0 Return temp_buffer
		
		'check for copy until end
		If ncount = -1 ncount = _size - nstart
		
		'read out data from buffer into new buffer
		For temp_i = 0 Until ncount
			temp_buffer._buffer[temp_i] = _buffer[nstart + temp_i]
		Next
		temp_buffer._filled = ncount
		
		Return temp_buffer
	End Method
	
	Method CopyAsString:String(nstart:Int,ncount:Int)
		'this function will copy a chunk of data and return it as a new buffer object
		Local temp_buffer:String = ""
		Local temp_i:Int = 0
		
		'check for 0 sized cut
		If ncount = 0 Return temp_buffer
		
		'check for buffer too small
		If nstart + ncount > _filled ncount :- _filled - nstart
		
		'check for copy until end
		If ncount = -1 ncount = _size - nstart
		
		'read out data from buffer into new buffer
		For temp_i = 0 Until ncount
			temp_buffer :+ Chr(_buffer[nstart + temp_i])
		Next
		
		Return temp_buffer
	End Method

	Method SetCapacity(nsize:Int,nuseblocks:Int = False)
		'setcapacity the amount into blocks
		If nuseblocks nsize = CalculateBlockSize(nsize)
		
		'setcapacity the buffer
		If nsize <> _size
			Local temp_buffer:Byte Ptr
			Local temp_bytes:Int
			
			'create a tempory buffer and copy the old information into it
			temp_buffer = MemAlloc(nsize)
			
			'calculate number of bytes to copy
			If _filled > nsize
				temp_bytes = nsize
			Else
				temp_bytes = _filled
			End If
			
			'copy bytes into new buffer
			MemCopy(temp_buffer,_buffer,temp_bytes)
			
			'clear the old buffer
			MemFree(_buffer)
			'save the new buffer
			_buffer = temp_buffer
			_size = nsize
		EndIf
		
		'correct buffer if filled data exceeded it
		If _filled > _size _filled = _size
	End Method
	
	Method GetSize:Int()
		'gets the current size of the buffer
		Return _filled
	End Method
	
	Method CalculateBlockSize(nsize:Int)
		'takes a size value and calculates what to setcapacity that in blocks
		Local temp_i:Int = nsize Mod _blocksize
		Return (((nsize - temp_i) / _blocksize) + (temp_i > 0)) * _blocksize
	End Method

	Method Clear()
		'clears the buffer
		_filled = 0
	End Method
	
	Method PeekByte:Int(noffset:Int)
		Assert noffset >= 0 And noffset < _filled Else "Buffer out of bounds"
		Return _buffer[noffset]
	End Method
	
	Method PeekShort:Int(noffset:Int)
		Assert noffset >= 0 And noffset-1 < _filled Else "Buffer out of bounds"
		Return (Short Ptr(_buffer+noffset))[0]
	End Method
	
	Method PeekInt:Int(noffset:Int)
		Assert noffset >= 0 And noffset-3 < _filled Else "Buffer out of bounds"
		Return (Int Ptr(_buffer+noffset))[0]
	End Method
	
	Method GrabBuffer:tbuffer()
		'grabs the remaining bytes in the buffer and returns a new buffer
		Return cut(0,0)
	End Method
	
	Method GrabInt:Int()
		'grabs an int from the start of the buffer and trims it
		Assert _filled >= 4 Else "Buffer out of bounds"
		
		'get the return value
		Local temp_grab:Int = (Int Ptr(_buffer))[0]
		
		'trim the buffer
		trimleft(4)
		
		Return temp_grab
	End Method
	
	Method GrabShort:Int()
		'grabs an int from the start of the buffer and trims it
		Assert _filled >= 2 Else "Buffer out of bounds"
		
		'get the return value
		Local temp_grab:Short = (Short Ptr(_buffer))[0]
		
		'trim the buffer
		trimleft(2)
		
		Return temp_grab
	End Method
	
	Method GrabByte:Int()
		'grabs an int from the start of the buffer and trims it
		Assert _filled >= 1 Else "Buffer out of bounds"
		
		'get the return value
		Local temp_grab:Short = (Byte Ptr(_buffer))[0]
		
		'trim the buffer
		trimleft(1)
		
		Return temp_grab
	End Method
	
	Method GrabString:String()
		'grabs a string from the start of the buffer and trims it
		Assert _filled >= 4 Else "Buffer out of bounds"
		
		'get the string size
		Local temp_size:Int = (Int Ptr(_buffer))[0]
		
		'make sure buffer doesnt out of bounds
		Assert _filled >= 4 + temp_size Else "Buffer out of bounds"
		
		'read the string
		Local temp_string:String = ""
		Local temp_i:Int
		For temp_i = 0 Until temp_size
			temp_string:+Chr(PeekByte(4+temp_i))
		Next
		
		'trim the buffer
		trimleft(4+temp_size)
		
		Return temp_string
	End Method
	
	Method AppendLine:Int(ntext:String)
		'appends text not in a string format to the buffer
		
		'add end of line to the text
		ntext :+ _eol
		
		Local temp_count:Int = ntext.length
		Local temp_i:Int = 0
		
		'check if buffer needs resizing
		If _filled + temp_count > _size setcapacity(_filled + temp_count,True)
		
		'read data from string into buffer
		For temp_i = 0 Until temp_count
			_buffer[_filled] = ntext[temp_i]
			_filled :+ 1
		Next
	End Method
	
	Method AppendBuffer:Int(nbuffer:tbuffer)
		'appends buffer onto the end of this buffer
		Assert nbuffer Else "Invalid buffer object"
		
		Local temp_i:Int = 0
		
		'check if buffer needs resizing
		If _filled + nbuffer._filled > _size setcapacity(_filled + nbuffer._filled,True)
		
		'read int data from buffer to this buffer
		For temp_i = 0 Until nbuffer._filled
			_buffer[_filled + temp_i] = nbuffer._buffer[temp_i]
		Next
		'increase filled size of this buffer
		_filled :+ nbuffer._filled
	End Method
	
	Method AppendStream:Int(nstream:TStream,ncount:Int)
		'appends X amount of data from the specified stream
		Assert nstream Else "Invalid stream object"
		
		Local temp_i:Int = 0
		
		'check if buffer needs resizing
		If _filled + ncount > _size setcapacity(_filled + ncount,True)
		
		'read data from stream into bank
		For temp_i = 0 Until ncount
			_buffer[_filled] = nstream.readbyte()
			_filled :+ 1
		Next
	End Method
	
	Method AppendString:Int(ntext:String)
		'appends a string to the buffer, in the format int(string length)+bytes(string data)
		Local temp_count:Int = ntext.length
		Local temp_i:Int = 0
		
		'check if buffer needs resizing
		If _filled + 4 + temp_count > _size setcapacity(_filled + 4 + temp_count,True)
		
		'append string length
		(Int Ptr(_buffer+_filled))[0] = temp_count
		_filled :+ 4
		
		'read data from string into buffer
		For temp_i = 0 Until temp_count
			_buffer[_filled] = ntext[temp_i]
			_filled :+ 1
		Next
	End Method
	
	Method AppendText:Int(ntext:String)
		'appends text not in a string format to the buffer
		Local temp_count:Int = ntext.length
		Local temp_i:Int = 0
		
		'check if buffer needs resizing
		If _filled + temp_count > _size setcapacity(_filled + temp_count,True)
		
		'read data from string into buffer
		For temp_i = 0 Until temp_count
			_buffer[_filled] = ntext[temp_i]
			_filled :+ 1
		Next
	End Method
	
	Method AppendInt:Int(nint:Int)
		'appends an int into the buffer
		'check if buffer needs resizing
		If _filled + 4 > _size setcapacity(_filled + 4,True)
		
		(Int Ptr(_buffer+_filled))[0] = nint
		_filled :+ 4
	End Method
	
	Method AppendShort:Int(nshort:Short)
		'appends an int into the buffer
		'check if buffer needs resizing
		If _filled + 2 > _size setcapacity(_filled + 2,True)
		
		(Short Ptr(_buffer+_filled))[0] = nshort
		_filled :+ 2
	End Method
	
	Method AppendByte:Int(nbyte:Byte)
		'appends an int into the buffer
		'check if buffer needs resizing
		If _filled + 1 > _size setcapacity(_filled + 1,True)
		
		(Byte Ptr(_buffer+_filled))[0] = nbyte
		_filled :+ 1
	End Method

	Method FindString:Int(nfind:String="")
		'this method will search for a string in the bank without having to make costly bank conversions
		Assert nfind Else "Must supply find parameter"
		
		Local temp_total:Int = nfind.length
		Local temp_count:Int = 0
		Local temp_istart:Int = 0
		Local temp_iscan:Int = 0
		
		For temp_istart = 0 Until _filled - temp_total
			'search for starting character of string
			If _buffer[temp_istart] = nfind[0]
				'first character of the string was found so search rest of match
				temp_count = 1
				For temp_iscan = 1 Until temp_total
					'check for matching character
					If _buffer[temp_istart+temp_iscan] <> nfind[temp_iscan] Exit
					temp_count:+1
				Next
				'check if count of correct characters matches length of end of line
				If temp_count = temp_total
					Return temp_istart
				End If
			End If
		Next
		
		Return -1
	End Method
	
	Method ToString:String()
		'converts the data in the bank and returns as a string
		Local temp_data:String = ""
		Local temp_i:Int = 0
		
		For temp_i = 0 Until _filled
			temp_data :+ Chr(_buffer[temp_i])
		Next
		Return temp_data
	End Method
End Type

Function CreateBuffer:tbuffer(nsize:Int=0)
	Return tbuffer.Create(nsize)
End Function


I have this piece of code that gets imported from a folder, rather then the modules folder. (this way i dont have to keep compiling it via bmk).

Now when i import this into my code file, i get this error along with a host of others

D:/blitzmax/dev/global/types/.bmx/tbuffer.bmx.debug.win32.x86.o(code+0x40): undefined reference to `__bb_audio_audio'


At no point in my program do i use any audio functions.

Anyone ?


Brucey(Posted 2007) [#2]
Try a non-quick build of your app ?


skn3(Posted 2007) [#3]
Ah excellent. That helped. Thanks.