Wandbox
SettingsLog
SettingsLog
Language
GitHubLogin
Ran/Viewed Log

Author

anonymous

about 7 years ago

Language

Compiler

Options

Author

anonymous

about 7 years ago

$
'''
#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