2016-11-03 21:37:29 +00:00
|
|
|
/*
|
|
|
|
* Mr. 4th Dimention - Allen Webster
|
|
|
|
*
|
|
|
|
* 25.02.2016
|
|
|
|
*
|
|
|
|
* File editing view for 4coder
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
// TOP
|
|
|
|
|
|
|
|
#if !defined(OUT_CONTEXT_4CODER)
|
|
|
|
#define OUT_CONTEXT_4CODER
|
|
|
|
|
|
|
|
typedef struct Out_Context{
|
|
|
|
char out_directory_space[256];
|
|
|
|
String out_directory;
|
|
|
|
FILE *file;
|
|
|
|
String *str;
|
|
|
|
} Out_Context;
|
|
|
|
|
|
|
|
static void
|
|
|
|
set_context_directory(Out_Context *context, char *dst_directory){
|
|
|
|
context->out_directory = make_fixed_width_string(context->out_directory_space);
|
|
|
|
copy_sc(&context->out_directory, dst_directory);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int32_t
|
|
|
|
begin_file_out(Out_Context *out_context, char *filename, String *out){
|
|
|
|
char str_space[512];
|
|
|
|
String name = make_fixed_width_string(str_space);
|
|
|
|
if (out_context->out_directory.size > 0){
|
|
|
|
append_ss(&name, out_context->out_directory);
|
2016-11-14 07:13:27 +00:00
|
|
|
append_sc(&name, "/");
|
2016-11-03 21:37:29 +00:00
|
|
|
}
|
|
|
|
append_sc(&name, filename);
|
|
|
|
terminate_with_null(&name);
|
|
|
|
|
|
|
|
int32_t r = 0;
|
|
|
|
out_context->file = fopen(name.str, "wb");
|
|
|
|
out_context->str = out;
|
|
|
|
out->size = 0;
|
|
|
|
if (out_context->file){
|
|
|
|
r = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return(r);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
dump_file_out(Out_Context out_context){
|
|
|
|
fwrite(out_context.str->str, 1, out_context.str->size, out_context.file);
|
|
|
|
out_context.str->size = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
end_file_out(Out_Context out_context){
|
|
|
|
dump_file_out(out_context);
|
|
|
|
fclose(out_context.file);
|
|
|
|
}
|
|
|
|
|
|
|
|
static String
|
|
|
|
make_out_string(int32_t x){
|
|
|
|
String str;
|
|
|
|
str.size = 0;
|
|
|
|
str.memory_size = x;
|
|
|
|
str.str = (char*)malloc(x);
|
|
|
|
return(str);
|
|
|
|
}
|
|
|
|
|
2016-11-28 19:13:53 +00:00
|
|
|
static void
|
2016-12-08 17:16:50 +00:00
|
|
|
do_file_copy(Partition *part, char *src_file, char *dst_dir, char *dst_file){
|
2016-11-28 19:13:53 +00:00
|
|
|
char dst[256];
|
|
|
|
String str = {0};
|
|
|
|
int32_t success = 0;
|
|
|
|
|
|
|
|
str = make_fixed_width_string(dst);
|
|
|
|
append_sc(&str, dst_dir);
|
|
|
|
append_sc(&str, "/");
|
|
|
|
append_sc(&str, dst_file);
|
|
|
|
terminate_with_null(&str);
|
|
|
|
|
|
|
|
Temp_Memory temp = begin_temp_memory(part);
|
2017-03-23 19:16:39 +00:00
|
|
|
int32_t mem_size = partition_remaining(part);
|
2016-11-28 19:13:53 +00:00
|
|
|
void *mem = push_block(part, mem_size);
|
2016-12-08 17:16:50 +00:00
|
|
|
FILE *in = fopen(src_file, "rb");
|
2016-11-28 19:13:53 +00:00
|
|
|
if (in){
|
|
|
|
fseek(in, 0, SEEK_END);
|
|
|
|
int32_t file_size = ftell(in);
|
|
|
|
if (mem_size >= file_size){
|
2017-07-09 03:25:29 +00:00
|
|
|
fseek(in, 0, SEEK_SET);
|
|
|
|
fread(mem, 1, file_size, in);
|
|
|
|
FILE *out = fopen(dst, "wb");
|
|
|
|
if (out){
|
|
|
|
fwrite(mem, 1, file_size, out);
|
|
|
|
fclose(out);
|
|
|
|
success = 1;
|
|
|
|
}
|
2016-11-28 19:13:53 +00:00
|
|
|
}
|
|
|
|
fclose(in);
|
|
|
|
}
|
|
|
|
end_temp_memory(temp);
|
|
|
|
|
2016-12-08 17:16:50 +00:00
|
|
|
if (!success){
|
|
|
|
fprintf(stderr, "Could not copy from %s to %s\n", src_file, dst);
|
|
|
|
}
|
2016-11-28 19:13:53 +00:00
|
|
|
}
|
|
|
|
|
2016-11-03 21:37:29 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// BOTTOM
|
|
|
|
|
|
|
|
|