/* main - main program
 */

#include "pico.h"

int pico_mainloop(Picovars *);
int pico_quit(Picovars *);

int pico_main(Picovars *vars) {
 static FILE *fptr;
 static long bytes_left,transfer,j;
 static short i;
 pico_banner(vars);
 move(vars->screendata,0,1);
 refresh(vars->screendata);
 vars->filesize=0; vars->numrows=0; vars->position=0; vars->toppos=0;
 vars->toprow=0; vars->row=0; vars->column=0; vars->leftcol=0;
 vars->linebuf[0]=0; vars->modified=0; vars->mark=-1; vars->moved=0;
 fptr=NULL;
 if (vars->filename[0]!=0) fptr=fopen(vars->filename,"r");
 if (fptr==NULL) {
  pico_status(vars,"New Buffer");
 } else {
  pico_status(vars,"Reading file...");
  fseek(fptr,0,SEEK_END); bytes_left=ftell(fptr);
  fseek(fptr,0,SEEK_SET);
  if (pico_allocate(vars,bytes_left+1)==PICO_ERROR) {
   fclose(fptr);
   pico_status(vars,"Memory allocation failed");
   return(PICO_OK);
  }
  vars->filesize=bytes_left;
  i=0; while ((!feof(fptr)) && (bytes_left>0)) {
   transfer=bytes_left;
   if (transfer>PICO_BLOCK_SIZE) transfer=PICO_BLOCK_SIZE;
   fread(vars->blocks[i],1,transfer,fptr);
   for(j=0; j<transfer; j++) {
    if ((vars->blocks[i][j]<32) && (vars->blocks[i][j]!=10))
     vars->blocks[i][j]=32;
   }
   bytes_left-=transfer;
   i++;
  }
  fclose(fptr);
  pico_readline(vars);
  pico_screen(vars);
  pico_status(vars,"Counting number of lines...");
  pico_countlines(vars);
  if (vars->numrows!=1) {
   sprintf(vars->temp,"%d lines in file",vars->numrows);
  } else {sprintf(vars->temp,"1 line in file");}
  pico_status(vars,vars->temp);
 }
 return(pico_mainloop(vars));
}

int pico_mainloop(Picovars *vars) {
 static char finished;
 static int c;
 finished=0;
 do {
  c=readchar();
  switch(c) {
   case 3:pico_fullpos(vars); break;                                  /* ^C */
   case 5:pico_endline(vars); break;                                  /* ^E */
   case 10:pico_storeline(vars); pico_justify(vars); break;           /* ^J */
   case 11:pico_cut(vars); break;                                     /* ^K */
   case 12:redraw(vars->screendata); break;                           /* ^L */
   case 13:pico_newline(vars); break;                                 /* ^M */
   case 15:pico_save(vars); break;                                    /* ^O */
   case 18:pico_readfile(vars); break;                                /* ^R */
   case 21:pico_paste(vars); break;                                   /* ^U */
   case 22:pico_pagedown(vars); break;                                /* ^V */
   case 23:pico_whereis(vars); break;                                 /* ^W */
   case 24:finished=pico_quit(vars); break;                           /* ^X */
   case 25:pico_pageup(vars); break;                                  /* ^Y */
   case 30:pico_mark(vars); break;                                    /* ^^ */
   case 8:
   case 127:pico_delete(vars); break;
   case 136:pico_left(vars); break;
   case 137:pico_right(vars); break;
   case 138:pico_down(vars); break;
   case 139:pico_up(vars); break;
   default:pico_character(vars,c); break;
  }
 } while (!finished);
 return(PICO_OK);
}

int pico_quit(Picovars *vars) {
 static int a,b,x,y;
 if (!vars->modified) return(1);
 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 modified buffer (Y/N)? ");
 refresh(vars->screendata);
 a=readchar(); addch(vars->screendata,a); refresh(vars->screendata);
 if ((a=='Y') || (a=='y')) {pico_save(vars);} else {vars->modified=0;}
 standout(vars->screendata,b); move(vars->screendata,x,y);
 refresh(vars->screendata);
 return(!vars->modified);
}
