/*
 * 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);
        append_sc(&name, "/");
    }
    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);
}

static void
do_file_copy(Partition *part, char *src_file, char *dst_dir, char *dst_file){
    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);
    int32_t mem_size = partition_remaining(part);
    void *mem = push_block(part, mem_size);
    FILE *in = fopen(src_file, "rb");
    if (in){
        fseek(in, 0, SEEK_END);
        int32_t file_size = ftell(in);
        
        if (mem_size >= file_size){
        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;
        }
    }
    
        fclose(in);
    }
    end_temp_memory(temp);
    
    if (!success){
        fprintf(stderr, "Could not copy from %s to %s\n", src_file, dst);
    }
}

#endif

// BOTTOM