int add_character(Text *text, char c) { size_t freespace = GAPSIZE(text); if (freespace <= 1) if (0 != resize_gap(text, RESIZE_BY)) return -1; text->buf[text->gap_start++] = c; return 0; }
int add_string(Text *text, char *buf, size_t len) { size_t freespace = GAPSIZE(text); if (freespace < len + 1) if (0 != resize_gap(text, RESIZE_BY + len)) return -1; memcpy(text->buf + text->gap_start, buf, len); text->gap_start += len; return 0; }
int attach_file(Buffer *buffer, char *filename) { FILE *fp; char buf[20]; size_t nread; int ret; long file_size; char *old_filename = buffer->filename; buffer->filename = calloc(1, strlen(filename) + 1); if (!buffer->filename) { buffer->filename = old_filename; return -1; } strcpy(buffer->filename, filename); if (old_filename) { free(old_filename); } fp = fopen(filename, "r"); if (!fp) return -1; fseek(fp, 0L, SEEK_END); file_size = ftell(fp); fseek(fp, 0L, SEEK_SET); resize_gap(buffer->text, file_size); while ((nread = fread(buf, 1, sizeof buf, fp)) > 0 && !ferror(fp)) add_string(buffer->text, buf, nread); if (ferror(fp)) { fclose(fp); return -1; } ret = fclose(fp); if (ret) return -1; move_cursor_to_beg(buffer->text); return 0; }