/* filing - load/save functions
 */

#include "pico.h"

void pico_save(Picovars *vars) {
 static int a,b,i,x,y;
 static FILE *fptr;
 static long bytes_left,transfer;
 pico_storeline(vars);
 b=standout(vars->screendata,1);
 x=vars->screendata->x; y=vars->screendata->y;
 move(vars->screendata,0,(vars->screendata->height)-1);
 for(a=0; a<vars->screendata->width; a++) {addch(vars->screendata,' ');}
 move(vars->screendata,0,(vars->screendata->height)-1);
 addstr(vars->screendata,"Save as: ");
 a=pico_input(vars,vars->filename);
 if ((a==10) || (a==13)) {
  fptr=fopen(vars->filename,"w");
  if (fptr==NULL) {
   sprintf(vars->temp,"Failed to write to '%s'",vars->filename);
   a=-1; pico_status(vars,vars->temp);
  } else {
   pico_status(vars,"Saving...");
   move(vars->screendata,0,0); refresh(vars->screendata);
   bytes_left=vars->filesize; i=0;
   while (bytes_left>0) {
    transfer=bytes_left;
    if (transfer>PICO_BLOCK_SIZE) transfer=PICO_BLOCK_SIZE;
    fwrite(vars->blocks[i],1,transfer,fptr);
    i++; bytes_left-=transfer;
   }
   fclose(fptr);
   vars->modified=0;
  }
 } else {
  a=-1; pico_status(vars,"Save Cancelled");
 }
 standout(vars->screendata,b); move(vars->screendata,x,y);
 if (a>=0) {pico_position(vars);} else {refresh(vars->screendata);}
 pico_readline(vars);
}

void pico_readfile(Picovars *vars) {
 static int a,b,x,y;
 static FILE *fptr;
 static long bytes_left,position;
 pico_storeline(vars);
 b=standout(vars->screendata,1);
 x=vars->screendata->x; y=vars->screendata->y;
 move(vars->screendata,0,(vars->screendata->height)-1);
 for(a=0; a<vars->screendata->width; a++) {addch(vars->screendata,' ');}
 move(vars->screendata,0,(vars->screendata->height)-1);
 addstr(vars->screendata,"Load file: ");
 vars->temp[0]=0;
 a=pico_input(vars,vars->temp);
 if ((a==10) || (a==13)) {
  fptr=fopen(vars->temp,"r");
  if (fptr==NULL) {
   sprintf(vars->temp,"Failed to read file");
   a=-1; pico_status(vars,vars->temp);
  } else {
   pico_status(vars,"Loading...");
   move(vars->screendata,0,0); refresh(vars->screendata);
   fseek(fptr,0,SEEK_END); bytes_left=ftell(fptr);
   fseek(fptr,0,SEEK_SET); position=vars->position;
   pico_insert(vars,position,bytes_left);
   while (bytes_left>0) {
    pico_writechar(vars,position,fgetc(fptr)); position++; bytes_left--;
   }
   fclose(fptr);
   pico_countlines(vars);
   vars->modified=1;
  }
 } else {
  a=-1; pico_status(vars,"Load Cancelled");
 }
 standout(vars->screendata,b); move(vars->screendata,x,y);
 pico_readline(vars); pico_screen(vars);
 if (a>=0) {pico_position(vars);} else {refresh(vars->screendata);}
}
