mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
Add routine add_file_to_string and use it in load_textarea_file.
This commit is contained in:
parent
dc29fa0a0b
commit
517bb03da4
@ -4,8 +4,13 @@
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE /* XXX: fseeko, ftello */
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@ -325,6 +330,46 @@ add_string_to_string(struct string *string, struct string *from)
|
||||
return add_bytes_to_string(string, from->source, from->length);
|
||||
}
|
||||
|
||||
struct string *
|
||||
add_file_to_string(struct string *string, unsigned char *filename)
|
||||
{
|
||||
FILE *file;
|
||||
off_t filelen;
|
||||
int newlength;
|
||||
|
||||
assertm(string && filename, "[add_file_to_string]");
|
||||
if_assert_failed { return NULL; }
|
||||
|
||||
check_string_magic(string);
|
||||
|
||||
file = fopen(filename, "rb");
|
||||
if (!file) return NULL;
|
||||
|
||||
if (fseeko(file, 0, SEEK_END)) goto err;
|
||||
|
||||
filelen = ftello(file);
|
||||
if (filelen == -1) goto err;
|
||||
|
||||
if (fseeko(file, 0, SEEK_SET)) goto err;
|
||||
|
||||
newlength = string->length + filelen;
|
||||
if (!realloc_string(string, newlength)) goto err;
|
||||
|
||||
string->length += fread(string->source + string->length, 1,
|
||||
(size_t) filelen, file);
|
||||
string->source[string->length] = 0;
|
||||
fclose(file);
|
||||
|
||||
if (string->length != newlength) goto err;
|
||||
|
||||
return string;
|
||||
|
||||
err:
|
||||
fclose(file);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct string *
|
||||
string_concat(struct string *string, ...)
|
||||
{
|
||||
|
@ -157,6 +157,7 @@ struct string *add_to_string(struct string *string,
|
||||
const unsigned char *source);
|
||||
struct string *add_char_to_string(struct string *string, unsigned char character);
|
||||
struct string *add_string_to_string(struct string *to, struct string *from);
|
||||
struct string *add_file_to_string(struct string *string, unsigned char *filename);
|
||||
struct string *add_crlf_to_string(struct string *string);
|
||||
|
||||
/* Adds each C string to @string until a terminating NULL is met. */
|
||||
|
@ -314,32 +314,17 @@ save_textarea_file(unsigned char *value)
|
||||
static unsigned char *
|
||||
load_textarea_file(unsigned char *filename, size_t maxlength)
|
||||
{
|
||||
unsigned char *value = NULL;
|
||||
FILE *file = fopen(filename, "rb+");
|
||||
off_t filelen = -1;
|
||||
struct string file;
|
||||
|
||||
if (!file) return NULL;
|
||||
if (!init_string(&file)
|
||||
|| !add_file_to_string(&file, filename))
|
||||
return NULL;
|
||||
|
||||
if (!fseeko(file, 0, SEEK_END)) {
|
||||
filelen = ftello(file);
|
||||
if (filelen != -1 && fseeko(file, 0, SEEK_SET))
|
||||
filelen = -1;
|
||||
}
|
||||
|
||||
if (filelen >= 0 && filelen <= maxlength) {
|
||||
value = mem_alloc((size_t) (filelen + 1));
|
||||
if (value) {
|
||||
size_t bread;
|
||||
|
||||
bread = fread(value, 1, (size_t) filelen, file);
|
||||
value[bread] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
unlink(filename);
|
||||
|
||||
return value;
|
||||
if (file.length > maxlength) { done_string(&file); return NULL; }
|
||||
|
||||
return file.source;
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user