boinc/dcapi/condor/ts.c

158 lines
3.8 KiB
C

/* Local variables: */
/* c-file-style: "linux" */
/* End: */
#include "dc_client.h"
#include <stdio.h>
#include <ctype.h>
static char infile_logical[] = "in.txt";
static char outfile_logical[] = "out.txt";
static char ckptfile_logical[] = "ckpt.txt";
static FILE *infile;
static FILE *outfile;
static FILE *ckptfile;
static int frac_input_size;
static int frac_current_pos = 0;
static void frac_init(void){
frac_current_pos = ftell(infile);
fseek(infile, 0, SEEK_END);
frac_input_size = ftell(infile);
fseek(infile, 0, SEEK_SET);
}
static int do_checkpoint(int frac_current_pos){
FILE *ckptfile;
char *ckptfile_physical;
int retval;
ckptfile_physical = DC_resolveFileName(DC_FILE_OUT, DC_CHECKPOINT_FILE);
ckptfile = fopen(ckptfile_physical, "w");
if (ckptfile == NULL){
fprintf(stderr, "APP: cannot open checkpoint file for write!!\n");
DC_finishClient(6);
}
fprintf(ckptfile, "%d", frac_current_pos);
fclose(ckptfile);
retval = fflush(outfile);
if (retval) {
fprintf(stderr, "APP: uppercase flush failed %d\n", retval);
DC_finishClient(5);
}
return 0;
}
static void init_files(void){
int ckpt_position;
char *infile_physical;
char *outfile_physical;
char *ckptfile_physical;
const char *outfile_openmode = "w";
/* Open input file */
infile_physical = DC_resolveFileName(DC_FILE_IN, infile_logical);
infile = fopen(infile_physical, "rb");
if (infile == NULL){
fprintf(stderr, "APP: Cannot open input file! Logical name: %s, physical name: %s.\n",
infile_logical, infile_physical);
DC_finishClient(1);
}
frac_init();
/* check ckpt file */
ckptfile_physical = DC_resolveFileName(DC_FILE_IN, DC_CHECKPOINT_FILE);
ckptfile = fopen(ckptfile_physical, "r");
if (ckptfile != NULL){
/* ckpt file exists: read and set everything according to it */
fscanf(ckptfile, "%d", &ckpt_position);
fclose(ckptfile);
fprintf(stderr, "APP: Found checkpoint file. Checkpoint position: %d.\n", ckpt_position);
fseek(infile, ckpt_position, SEEK_SET);
frac_current_pos = ckpt_position;
outfile_openmode = "r+";
}
/* open output file */
outfile_physical = DC_resolveFileName(DC_FILE_OUT, outfile_logical);
outfile = fopen(outfile_physical, outfile_openmode);
if (outfile == NULL){
fprintf(stderr, "APP: Cannot open output file! Logical name: %s, physical name: %s.\n",
outfile_logical, outfile_physical);
DC_finishClient(2);
}
fseek(outfile, frac_current_pos, SEEK_SET);
}
static void do_work(void){
int c;
int retval;
while (1) {
c = fgetc(infile);
if (c == EOF) break;
c = toupper(c);
fputc(c, outfile);
frac_current_pos++;
// if (DC_timeToCheckpoint()){
if (1){
if(do_checkpoint(frac_current_pos)){
fprintf(stderr, "APP: uppercase checkpoint failed.\n");
DC_finishClient(3);
}
// DC_checkpointMade();
}
DC_fractionDone(frac_current_pos/frac_input_size);
}
retval = fflush(outfile);
if (retval) {
fprintf(stderr, "APP: uppercase flush failed %d\n", retval);
DC_finishClient(5);
}
fclose(outfile);
}
int main(int argc, char **argv) {
int retval = 0;
retval = DC_initClient();
if (retval) {
fprintf(stderr, "APP: Error while the initialize. Return value = %d.\n", retval);
DC_finishClient(retval);
}
fprintf(stdout, "APP: Init successful.\n");
init_files();
fprintf(stdout, "APP: Starting from line %d.\n", frac_current_pos+1);
do_work();
fprintf(stdout, "APP: Work finished.\n");
fprintf(stderr, "APP: This is only a test error message.\n");
DC_sendMessage("Client completed. Exiting.");
DC_finishClient(0);
return(0); // Tho' we never reach this line
}
#ifdef _WIN32
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR Args, int WinMode) {
LPSTR command_line;
char* argv[100];
int argc;
command_line = GetCommandLine();
argc = parse_command_line( command_line, argv );
return main(argc, argv);
}
#endif