Language
Compiler
Options
$
'''
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Resources {
size_t n_buffers;
void *const *buffers;
size_t n_files;
FILE *const *files;
};
static inline void cleanup(struct Resources r) {
while (r.n_buffers--)
free(r.buffers[r.n_buffers]);
while (r.n_files--)
fclose(r.files[r.n_files]);
}
[[noreturn]] static inline void fail(const char msg[], struct Resources r) {
perror(msg);
cleanup(r);
exit(1);
}
static inline char *splice_file(const char path[], const char s[], size_t i) {
const size_t s_size = strlen(s) + 1;
assert(i < s_size);
FILE *const file = fopen(path, "rb");
struct Resources r = {};
if (file == NULL)
fail("fopen(3)", r);
r.n_files = 1;
r.files = &file;
if (fseek(file, 0, SEEK_END))
fail("fseek(3)", r);
const long file_size = ftell(file);
if (file_size == EOF)
fail("ftell(3)", r);
char *const spliced = malloc(s_size + (size_t)file_size);
if (spliced == NULL)
fail("malloc(3)", r);
r.n_buffers = 1;
r.buffers = (void*const*)&spliced;
memcpy(spliced, s, i);
rewind(file);
fread(spliced + i, 1, (size_t)file_size, file);
if (ferror(file))
fail("fread(3)", r);
fclose(file);
memcpy(spliced + i + file_size, s + i, s_size - i);
return spliced;
}
int main(void) {
char *const s = splice_file(__FILE__, "'''\n\n'''", 4);
puts(s);
free(s);
}
'''
Exit Code:
0