/* Pico copy - simple text editor for the CLI prompt
 *
 * (c) 1996 Andrew Wood
 */

#include "pico.h"
#include <string.h>

char *pico_allocate_all(Picovars *);
void pico_free_all(Picovars *);

int main(int argc,char *argv[]) {
 Picovars vars;
 int status,i;
 char *e;
 e=pico_allocate_all(&vars);
 if (e!=NULL) {
  pico_free_all(&vars);
  fprintf(stderr,"Allocation of %s failed\n\r",e);
  return(PICO_ERROR);
 }
 vars.screendata->width=-1;
 vars.screendata->height=-1;
 vars.screendata->foreground=-1;
 vars.screendata->background=-1;
 vars.filename[0]=0;
 for (i=1; i<argc; i++) {
  switch(argv[i][0]) {
   case '-':
    switch(argv[i][1]) {
     case 'W':
     case 'w':i++; sscanf(argv[i],"%d",&(vars.screendata->width)); break;
     case 'H':
     case 'h':i++; sscanf(argv[i],"%d",&(vars.screendata->height)); break;
     case 'F':
     case 'f':i++; sscanf(argv[i],"%d",&(vars.screendata->foreground)); break;
     case 'B':
     case 'b':i++; sscanf(argv[i],"%d",&(vars.screendata->background)); break;
     default:break;
    }
    break;
   default:strcpy(vars.filename,argv[i]); break;
  }
 }
 if (init_screen(vars.screendata)==0) {
  status=pico_main(&vars);
  end_screen(vars.screendata);
 } else {
  fprintf(stderr,"Failed to allocate screen content buffers\n\r");
  status=PICO_ERROR;
 }
 pico_free_all(&vars);
 return(status);
}

char *pico_allocate_all(Picovars *vars) {
 static int i;
 vars->temp=NULL;
 vars->filename=NULL;
 vars->screendata=NULL;
 vars->blocks=NULL;
 vars->linebuf=NULL;
 vars->clipboard=NULL;
 if ((vars->temp=(char *)malloc(PICO_TEMP_SIZE))==NULL)
  return("temporary workspace");
 if ((vars->filename=(char *)malloc(PICO_FILENAME_SIZE))==NULL)
  return("filename buffer");
 if ((vars->screendata=(Screendata *)malloc(sizeof(Screendata)))==NULL)
  return("screen data buffer");
 if ((vars->blocks=(char **)malloc(PICO_MEM_BLOCKS*sizeof(char *)))==NULL)
  return("memory page block");
 for(i=0; i<PICO_MEM_BLOCKS; i++) {vars->blocks[i]=NULL;}
 if ((vars->linebuf=(char *)malloc(PICO_LINE_SIZE))==NULL)
  return("line buffer");
 return(NULL);
}

void pico_free_all(Picovars *vars) {
 static int i;
 if (vars->temp!=NULL) free(vars->temp);
 if (vars->filename!=NULL) free(vars->filename);
 if (vars->screendata!=NULL) free(vars->screendata);
 if (vars->blocks!=NULL) {
  for(i=0; i<PICO_MEM_BLOCKS; i++) {
   if (vars->blocks[i]!=NULL) free(vars->blocks[i]);
  }
  free(vars->blocks);
 }
 if (vars->linebuf!=NULL) free(vars->linebuf);
 if (vars->clipboard!=NULL) free(vars->clipboard);
}
