summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pages.c76
-rw-r--r--pages.h10
2 files changed, 55 insertions, 31 deletions
diff --git a/pages.c b/pages.c
index 9ce7e76..b6c396a 100644
--- a/pages.c
+++ b/pages.c
@@ -199,13 +199,12 @@ deletebytes(const char *file, long offset, size_t bytes)
}
int
-writefileatbyte(const char *dest, const char *source, long offset)
+writeatbyte(const char *dest, struct fileorstring *source, long offset)
{
/*
* write file 'source' into 'output_dir'/'file' starting at offset 'offset'
* return 1 on success. 0 on failure
*/
-
char filename[512] = {0};
size_t length = 512;
strncat(filename, output_dir, length-1);
@@ -227,18 +226,23 @@ writefileatbyte(const char *dest, const char *source, long offset)
return 0;
}
- FILE *src = fopen(source, "r");
- if (!src)
+ FILE *src = NULL;
+ if (source->file != NULL)
{
- fprintf(stderr, "unable to open file '%s', unrecoverable failure\n", source);
- fclose(in);
- fclose(tmp);
- return 0;
+ src = fopen(source->file, "r");
+ if (!src)
+ {
+ fprintf(stderr, "unable to open file '%s', unrecoverable failure\n", source->file);
+ fclose(in);
+ fclose(tmp);
+ return 0;
+ }
}
/*
* read file 'in' until byte 'offset', writing into file 'tmp'
- * write file 'src' into 'tmp'
+ * if source->file isn't NULL, write file 'src' into 'tmp'
+ * otherwise write 'source->str' into file 'tmp'
* finish writing file 'in' into 'tmp'
* delete file 'filename'
* rename file 'tmp' 'filename'
@@ -246,18 +250,30 @@ writefileatbyte(const char *dest, const char *source, long offset)
char c, t, a;
long curpos = 1;
+ int i = 0;
while ((c = fgetc(in)) != EOF)
{
if (curpos == offset)
{
- while ((t = fgetc(src)) != EOF)
+ if (src != NULL)
+ {
+ while ((t = fgetc(src)) != EOF)
+ {
+ /* prevent writing end of line '\n' if the next char is EOF */
+ a = fgetc(src);
+ ungetc(a, src);
+ if (a == EOF && t == '\n')
+ continue;
+ fputc(t, tmp);
+ }
+ }
+ else
{
- /* prevent writing end of line '\n' if the next char is EOF */
- a = fgetc(src);
- ungetc(a, src);
- if (a == EOF && t == '\n')
- continue;
- fputc(t, tmp);
+ while ((t = source->str[i]) != '\0')
+ {
+ fputc(source->str[i], tmp);
+ i++;
+ }
}
}
fputc(c, tmp);
@@ -266,7 +282,8 @@ writefileatbyte(const char *dest, const char *source, long offset)
fclose(tmp);
fclose(in);
- fclose(src);
+ if (src)
+ fclose(src);
if (remove(filename) == -1)
{
@@ -284,7 +301,7 @@ writefileatbyte(const char *dest, const char *source, long offset)
}
int
-replaceinpage(const char *outfile, const char *toreplace, const char *infile)
+replaceinpage(const char *outfile, const char *toreplace, struct fileorstring *source)
{
/*
* replace 'toreplace' in file 'outfile' taking 'infile' as input
@@ -304,7 +321,7 @@ replaceinpage(const char *outfile, const char *toreplace, const char *infile)
return 0;
}
- if (!writefileatbyte(outfile, infile, substrpos))
+ if (!writeatbyte(outfile, source, substrpos))
{
return 0;
}
@@ -340,20 +357,21 @@ frontpage(int flags)
return 0;
}
- createtmpfile("title.tmp", frontpage_title, strlen(frontpage_title));
- createtmpfile("info.tmp", frontpage_info, strlen(frontpage_info));
- createtmpfile("date.tmp", gettime(), strlen(gettime()));
- if (!replaceinpage(frontpage_index_output, content_string, frontpage_index) ||
- !replaceinpage(frontpage_index_output, title_string, "title.tmp") ||
- !replaceinpage(frontpage_index_output, info_string, "info.tmp") ||
- !replaceinpage(frontpage_index_output, time_string, "date.tmp"))
+ struct fileorstring index = {frontpage_index, NULL};
+ struct fileorstring title = {NULL, frontpage_title};
+ struct fileorstring info = {NULL, frontpage_info};
+ struct fileorstring time = {NULL, gettime()};
+ if (!replaceinpage(frontpage_index_output, content_string, &index) ||
+ !replaceinpage(frontpage_index_output, title_string, &title) ||
+ !replaceinpage(frontpage_index_output, info_string, &info) ||
+ !replaceinpage(frontpage_index_output, time_string, &time))
{
fprintf(stderr, "unable to generate frontpage\n");
return 0;
}
- remove("title.tmp");
- remove("date.tmp");
- remove("info.tmp");
+ //remove("title.tmp");
+ //remove("date.tmp");
+ //remove("info.tmp");
return 1;
}
diff --git a/pages.h b/pages.h
index e141376..3c34d98 100644
--- a/pages.h
+++ b/pages.h
@@ -21,12 +21,18 @@
#include <unistd.h>
#include <sys/stat.h>
+struct fileorstring
+{
+ const char *file;
+ const char *str;
+};
+
/* helpers */
int createfile(const char *file);
long findstring(const char *file, const char *str);
int deletebytes(const char *file, long offset, size_t bytes);
-int writefileatbyte(const char *dest, const char *source, long offset);
-int replaceinpage(const char *outfile, const char *toreplace, const char *infile);
+int writeatbyte(const char *dest, struct fileorstring *source, long offset);
+int replaceinpage(const char *outfile, const char *toreplace, struct fileorstring *source);
char *gettime();
int createtmpfile(const char *name, const char *content, size_t size);