Exemplo n.º 1
0
int main(int argc, char **argv)
{
  ARRAY *a;
  SCAN *scan;
  char *str;
  int i;

  scan = scan_create(1, stdin);
  scan->delims = "+-=/";
  scan->whites = " \t\n";
  scan->comments = "";
  
  a = array_create(5, char);

  printf("> ");
  while((str = scan_get(scan)) != NULL) {
    if(*str == '=') {
      scan->delims = ""; scan->whites = "\n";
      str = scan_get(scan);
      scan->delims = "+-=/"; scan->whites = " \t\n";
      array_clear(a);
      array_append_ptr(a, str, strlen(str));
    }
    else if(*str == '+') {
      scan->delims = ""; scan->whites = "\n";
      str = scan_get(scan);
      scan->delims = "+-=/"; scan->whites = " \t\n";
      printf("append(%s)\n", str);
      array_append_ptr(a, str, strlen(str));      
    }
    else if(*str == '-') {
      scan->delims = ""; scan->whites = "\n";
      str = scan_get(scan);
      scan->delims = "+-=/"; scan->whites = " \t\n";
      printf("prepend(%s)\n", str);
      array_prepend_ptr(a, str, strlen(str));      
    }
    else if(*str == '/') {
      str = scan_get(scan);
      array_destroy_index(a, atoi(str));
    }
    else if(*str == '^') {
      str = scan_get(scan);
      i = atoi(str);
      str = scan_get(scan);
      scan->delims = "+-=/"; scan->whites = " \t\n";
      array_insert_index(a, *str, char, i);
    }
    str = array_to_pointer(a);
    printf(" \"%s\"\n> ", str);
    xfree(str);
  }
Exemplo n.º 2
0
static text_renderer_cell_p find_free_cell_or_revoke_unused_cell(text_renderer_p renderer, text_renderer_font_p font, uint32_t glyph_width, uint32_t glyph_height, uint32_t texture_width, uint32_t texture_height, size_t* line_idx, size_t* cell_idx) {
	// Padding between the glyphs
	const uint32_t padding = 1;
	// Keep track of the texture coordinates so we know where our cell is on the texture
	uint32_t x = 0, y = 0;
	
	// First search for a line with the matching height
	for(size_t i = 0; i < renderer->lines->length; i++) {
		text_renderer_line_p line = &array_data(renderer->lines, text_renderer_line_t)[i];
		
		if (line->height == glyph_height) {
			// We found a line with matching height, now look if we can get our cell in there
			x = 0;
			for(size_t j = 0; j < line->cells->length; j++) {
				text_renderer_cell_p current_cell = array_elem_ptr(line->cells, j);
				x += current_cell->width + padding;
			}
			
			if (x + glyph_width <= texture_width) {
				// There is space left at the end of this line, add our cell here
				text_renderer_cell_p cell = array_append_ptr(line->cells);
				memset(cell, 0, sizeof(text_renderer_cell_t));
				
				cell->x = x;
				cell->y = y;
				cell->width = glyph_width;
				
				*line_idx = i;
				*cell_idx = line->cells->length - 1;
				return cell;
			}
			
			// No space at end of line, search next line
		}
		
		y += line->height + padding;
	}
	
	// We haven't found a matching line or every matching line was full. Anyway add a new line
	// if there is space left at the bottom of the texture and put the cell in there.
	if (y + glyph_height + padding <= texture_height) {
		text_renderer_line_p line = array_append_ptr(renderer->lines);
		line->height = glyph_height;
		line->cells = array_of(text_renderer_cell_t);
		
		text_renderer_cell_p cell = array_append_ptr(line->cells);
		memset(cell, 0, sizeof(text_renderer_cell_t));
		
		cell->x = x;
		cell->y = y;
		cell->width = glyph_width;
		
		*line_idx = renderer->lines->length - 1;
		*cell_idx = 0;
		return cell;
	}
	
	// We would like to add a new line but there is not enough free space at the bottom
	// to the texture. For now just give up.
	*line_idx = (size_t)-1;
	*cell_idx = (size_t)-1;
	return NULL;
}