pgplus/bin/
pgplus/help_files/
pgplus/port_redirector/
pgplus/src/configure/makefiles/
/*
 * file.c
 *
 * $Id: file.c,v 1.3 1996/03/29 16:51:01 athan Exp $
 *
 * $Log: file.c,v $
 * Revision 1.3  1996/03/29 16:51:01  athan
 * Cleanups
 * Fixed bug with free()'ing wrong variable
 *
 * Revision 1.2  1996/03/28 20:02:07  athan
 * General cleanups
 *
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>
#include <fcntl.h>

#include "file.h"

/* Extern Function Prototypes */

/* Extern Variables */

extern int verbose;
extern struct afile thefile;

/* Local Function Prototypes */

void load_file(char *fn, struct afile *it);

/* Local Variables */


/* Load a file. Not quite as simple as it seems, seeing as we convert
 * any '\n' we find to '\n\r'. To achieve this we load it into one buffer,
 * which is the size of the file read, then copy it into a second buffer
 * a character at a time. This second buffer is twice the length of the
 * first to  allow for the worse case scenario of the file being completely
 * full of '\n' characters.
 * Once this is achieved we allocate memory for the ACTUAL size of the
 * processed file, and copy it into this buffer, pointed to by the 'what'
 * part of the it struct passed to us.
 */

void load_file(char *fn, struct afile *it)
{
  int d;
  int len;
  char *buf, *startbuf;
  char *processed, *startprocessed;

  d = open(fn, O_RDONLY);
  if (d < 0)
  {
    fprintf(stderr, "Couldn't open file \'%s\'\n", fn);
    exit(-1);
  }
  len = lseek(d, 0, SEEK_END);
  lseek(d, 0, SEEK_SET);
  if (NULL == (startbuf = buf = (char *) malloc(len + 1)))
  {
    fprintf(stderr, "Failed to malloc(%d)\n", len + 1);
    exit(-1);
  }
  memset(buf, 0, len + 1);
  if (NULL == (startprocessed = processed = (char *) malloc((2 * len) + 1)))
  {
    fprintf(stderr, "Failed to malloc(%d)\n", (2 * len) + 1);
    exit(-1);
  }
  memset(processed, 0, (2 * len) + 1);
  if (-1 == (read(d, buf, len)))
  {
    fprintf(stderr, "Error reading file \'%s\'\n", fn);
    exit(-1);
  }
  close(d);
  while (*buf)
  {
    switch (*buf)
    {
    case '\n':
      *processed++ = *buf++;
      *processed++ = '\r';
      break;
    default:
      *processed++ = *buf++;
    }
  }
  free(startbuf);
  if (it->what)
  {
    free(it->what);
  }
  it->len = (size_t) (processed - startprocessed);
  if (NULL == (it->what = (char *) malloc(it->len + 1)))
  {
    fprintf(stderr, "Failed to malloc(%d)\n", it->len + 1);
    exit(-1);
  }
  memcpy(it->what, startprocessed, it->len);
  it->what[it->len] = '\0';
  free(startprocessed);
}