Well recently i have been trying to see if it is possible to use a single vbo to hold multiple vbo's. For example I'm trying to make a Text rendering sub that uses vbo however i do not want to bind a new vbo unless i truly have to for each symbols XY, UV, and RBGA. So I'm a little confused on if this is possible and if not then why not? Also If it is not possible any other way i can do things to make it better?

Here is the source for my text rendering class that I'm trying to get to use multiple VBO's into a single VBO.

Code :
void create_text_vertex(text *str, widget *control)//must be done every text change
{
	float x2,x = 0;
	float y2,y = 0;
	char *p = str->data;
	float w, h;
	float textx,texty;
	float texx,texy,texw,texh;
	GLuint index[4] = {0,1,2,3};
 
	textx = str->xy.x + control->actualpos.x;
	texty = str->xy.y + control->actualpos.y;
 
	if(str->textbuf.buffer == NULL){
		str->textbuf.buffer = (vertex_array *)calloc(1, 16 * sizeof(vertex_array));
		str->size = 16;
		str->count = 0;
	}
 
	while(*p){
		texx = (float)character[*p].x / 256;
		texw = (float)(character[*p].x + character[*p].glyph_bitmap->bitmap.width)/ 256;
		texy = (float)character[*p].y / 128;
		texh = (float)(character[*p].y + character[*p].glyph_bitmap->bitmap.rows)/ 128;
		x2 = (x + character[*p].glyph_bitmap->left);
		y2 = (y - character[*p].glyph_bitmap->top) ;
		w = (character[*p].glyph_bitmap->bitmap.width);
		h = (character[*p].glyph_bitmap->bitmap.rows + str->resize);
		y = texty; //reset Y to the original other wise text becomes out of control XD.
 
		//Moves a certain amount of space After the symbol based on glyph set size.
 
		x += (character[*p].advancex >> 6) + str->resize;
		y += (character[*p].advancey >> 6) + 12;
 
		if (!character[*p].glyph_bitmap->bitmap.width || !character[*p].glyph_bitmap->bitmap.rows){
			p++; continue;
		}
 
		if(str->count >= str->size){
			str->size = (uint16)next_power_of_two(str->size + 2);
			text_resize_buffer(str->textbuf.buffer,str->size);
		}
 
		/*index 0*/
		str->textbuf.buffer[str->count].vertex[0].u = texx; str->textbuf.buffer[str->count].vertex[0].v = texy;
		str->textbuf.buffer[str->count].vertex[0].x = x2; str->textbuf.buffer[str->count].vertex[0].y = y2;
		str->textbuf.buffer[str->count].vertex[0].r = str->col.r; str->textbuf.buffer[str->count].vertex[0].b = str->col.b; str->textbuf.buffer[str->count].vertex[0].g = str->col.g; str->textbuf.buffer[str->count].vertex[0].a = str->col.a;
 
		/*index 1*/
		str->textbuf.buffer[str->count].vertex[1].u = texw; str->textbuf.buffer[str->count].vertex[1].v = texy;
		str->textbuf.buffer[str->count].vertex[1].x = x2 + w; str->textbuf.buffer[str->count].vertex[1].y = y2;
		str->textbuf.buffer[str->count].vertex[1].r = str->col.r; str->textbuf.buffer[str->count].vertex[1].b = str->col.b; str->textbuf.buffer[str->count].vertex[1].g = str->col.g; str->textbuf.buffer[str->count].vertex[1].a = str->col.a;
 
		/*index 2*/
		str->textbuf.buffer[str->count].vertex[2].u = texx; str->textbuf.buffer[str->count].vertex[2].v = texh;
		str->textbuf.buffer[str->count].vertex[2].x = x2; str->textbuf.buffer[str->count].vertex[2].y = y2 + h;
		str->textbuf.buffer[str->count].vertex[2].r = str->col.r; str->textbuf.buffer[str->count].vertex[2].b = str->col.b; str->textbuf.buffer[str->count].vertex[2].g = str->col.g; str->textbuf.buffer[str->count].vertex[2].a = str->col.a;
 
		/*index 3*/
		str->textbuf.buffer[str->count].vertex[3].u = texw; str->textbuf.buffer[str->count].vertex[3].v = texh;
		str->textbuf.buffer[str->count].vertex[3].x = x2 + w; str->textbuf.buffer[str->count].vertex[3].y = y2 + h;
		str->textbuf.buffer[str->count].vertex[3].r = str->col.r; str->textbuf.buffer[str->count].vertex[3].b = str->col.b; str->textbuf.buffer[str->count].vertex[3].g = str->col.g; str->textbuf.buffer[str->count].vertex[3].a = str->col.a;
		str->count++;
		p++;
	}
 
	glGenBuffers(1,&str->textbuf.vertex_buffer);
	glGenBuffers(1,&str->textbuf.index_buffer);
 
	glBindBuffer(GL_ARRAY_BUFFER,str->textbuf.vertex_buffer);
	glBufferData(GL_ARRAY_BUFFER,str->size *( 4 * sizeof(vertex_t)),str->textbuf.buffer,GL_STATIC_DRAW);//fill up the array with vertex and color-data
 
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,str->textbuf.index_buffer);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER,4 * sizeof(GLuint),index,GL_STATIC_DRAW);//this one with indices
}

Code :
void text_draw_beta(text *str, widget *parent)
{
	char *p = str->data;
	uint16 count = 0;
	uint32 use = 0;
 
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
 
	glColor4f(str->col.r , str->col.g , str->col.b , str->col.a);// set the image color properties, 1 being highest 0.0000 being lowest
	glBindTexture(GL_TEXTURE_2D, texture);
 
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, str->textbuf.index_buffer);
	glIndexPointer(GL_UNSIGNED_INT,sizeof(GLuint),0);
 
	glBindBuffer(GL_ARRAY_BUFFER, str->textbuf.vertex_buffer);
 
	while(*p){
		if (!character[*p].glyph_bitmap->bitmap.width || !character[*p].glyph_bitmap->bitmap.rows){
			p++; continue;
		}
		glVertexPointer(2, GL_FLOAT, sizeof(struct vertex_t), 0);
		glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertex_t), (GLvoid *)offsetof(struct vertex_t, u));
		glColorPointer(4, GL_FLOAT, sizeof(struct vertex_t), (GLvoid *)offsetof(struct vertex_t, r));
 
		glDrawElements(GL_TRIANGLE_STRIP, 4 ,GL_UNSIGNED_INT,0); //GL_TRIANGLE_STRIP
		count++;
		p++;
	}
 
	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);
 
	glBindBuffer(GL_ARRAY_BUFFER, 0);
}

Code :
struct multi_buffer{
	GLuint vertex_buffer; //texture vertex buffer.
	GLuint index_buffer; //index buffer.
	vertex_array *buffer;
};
 
struct vertex_t {
	float x, y;
	float u, v;
	float r, g, b, a;
};
 
struct vertex_array {
	vertex_t vertex[4];
};

hopefully someone can at least point me in the right direction.