/* arclynx - simple version of Lynx for Acorn machines
 * (c) 1996 Andrew Wood
 *
 * Routines contained in this file (a_init.c):
 *   lynx_initialise()     - last modified 96/07/18
 *   lynx_init_alloc()     - last modified 96/07/16
 *   lynx_finalise()       - last modified 96/07/17
 *   lynx_clear_build()    - last modified 96/07/17
 *   lynx_clear_document() - last modified 96/07/18
 */

#include "arclynx.h"


void *lynx_init_alloc(Status *,size_t);     /* allocate memory (in a_init.c) */
void lynx_clear_build(Build *);     /* free building workspace (in a_init.c) */


/******************************************************************************
 * lynx_initialise(status) - clear all variables, allocate workspace
 */
void lynx_initialise(Status *status) {
 static int i;
 status->finished=0;                                  /* clear finished flag */
 status->build.anchor_href=(char **)lynx_init_alloc(status,MAX_ANCHOR_HREFS*4);
 status->build.anchor_name=(char **)lynx_init_alloc(status,MAX_ANCHOR_NAMES*4);
 status->build.line=(char **)lynx_init_alloc(status,LYNX_MAX_LINES*4);
 status->build.url=(char *)lynx_init_alloc(status,MAX_URL_LENGTH);
 status->build.filename=(char *)lynx_init_alloc(status,MAX_FILENAME_LENGTH);
 status->temp=(char *)lynx_init_alloc(status,LYNX_TEMP_WORKSPACE);
 status->history=(char **)lynx_init_alloc(status,LYNX_HISTORY*4);
 status->history_pos=0;                          /* current history position */
 status->build.anchor_hrefs=0;                              /* no hyperlinks */
 status->build.anchor_names=0;                           /* no named anchors */
 status->build.lines=0;                                    /* no lines built */
 status->build.fptr=NULL;                                    /* no file open */
 status->build.temporary=0;                             /* no temporary file */
 if (status->finished) return;                              /* error? return */
 status->build.url[0]=0; status->build.filename[0]=0; /* wipe URL & filename */
 sprintf(status->build.title,"No document loaded");        /* document title */
 for(i=0; i<MAX_ANCHOR_HREFS; i++) {status->build.anchor_href[i]=NULL;}
 for(i=0; i<MAX_ANCHOR_NAMES; i++) {status->build.anchor_name[i]=NULL;}
 for(i=0; i<LYNX_MAX_LINES; i++) {status->build.line[i]=NULL;}
 for(i=0; i<LYNX_HISTORY; i++) {status->history[i]=NULL;}
}


/******************************************************************************
 * lynx_init_alloc(status,size) - return pointer to <size> bytes of memory
 */
void *lynx_init_alloc(Status *status,size_t size) {
 void *ptr;
 if (status->finished) return(NULL);
 ptr = malloc(size); if (ptr!=NULL) return(ptr);
 fprintf(stderr,"Failed to allocate %ld bytes of workspace\n",size);
 status->finished=1; return(NULL);
}


/******************************************************************************
 * lynx_finalise(status) - free workspace, close files
 */
void lynx_finalise(Status *status) {
 static int i;                                  /* general iteration counter */
 lynx_clear_build(&(status->build));
 free(status->build.anchor_href);
 free(status->build.anchor_name);
 free(status->build.line);
 free(status->build.url);
 free(status->build.filename);
 free(status->temp);
 for(i=0; i<status->history_pos; i++) {free(status->history[i]);}
 free(status->history);
}


/******************************************************************************
 * lynx_clear_build(build) - free built document's workspace, close file,
 *                           erase temporary file if there was one
 */
void lynx_clear_build(Build *build) {
 if (build->fptr!=NULL) {fclose(build->fptr); build->fptr=NULL;}
 lynx_clear_document(build);
}


/******************************************************************************
 * lynx_clear_document(build) - free previous document's workspace,
 *                              erase temporary file if there was one
 */
void lynx_clear_document(Build *build) {
 static int i;                                  /* general iteration counter */
 for(i=0; i<(build->anchor_hrefs); i++) {free(build->anchor_href[i]);}
 for(i=0; i<(build->anchor_names); i++) {free(build->anchor_name[i]);}
 for(i=0; i<(build->lines); i++) {free(build->line[i]);}
 for(i=0; i<MAX_ANCHOR_HREFS; i++) {build->anchor_href[i]=NULL;}
 for(i=0; i<MAX_ANCHOR_NAMES; i++) {build->anchor_name[i]=NULL;}
 for(i=0; i<LYNX_MAX_LINES; i++) {build->line[i]=NULL;}
 build->anchor_hrefs=0;
 build->anchor_names=0;
 build->lines=0;
 if (build->temporary) remove(build->filename);
}
