ftp.nice.ch/pub/next/developer/languages/T/T.3.1.N.bs.tar.gz#/T3.1/tsystem/nextassist.c

This is nextassist.c in view mode; [Download] [Up]

/* This file contains main and the argument processing for T. */

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define MIN_HEAP_SIZE (1 << 19)  /* .5 Mb */
#define DEFAULT_HEAP_SIZE (1 << 22) /* 4 Mb  */

int main(int argc, char *argv[])
{
  long heap_wanted = -1;
  long debug = 0;
  long errors = 0;
  void *the_heaps;
  long total, aligned_total;
  long heap_size, aligned_heap_size;

  int ac = argc - 1;
  char **av = argv + 1;

  int start_t(long, long, long, int, char **, long);  

  for (; ac > 0; ac--, av++)
    if (av[0][0] == '-')
      switch (av[0][1]) {
      case 'h':
        (*av)++;
        if (strcmp(*av, "h") != 0 && strcmp(*av, "heap") != 0) break;
	ac--; av++;
	if (ac == 0) { errors++; break; }
	heap_wanted = atoi(*av);
	if (heap_wanted <= 0) errors++;
	if (heap_wanted < MIN_HEAP_SIZE) {
	  fprintf(stderr,"Heap requested is too small.\n");
	  heap_wanted = MIN_HEAP_SIZE;
	}
	break;
      case 'd':
        if (strcmp(*av, "d") != 0 && strcmp(*av, "debug") != 0) break;
	debug = -1;
	break;
      }
  if (errors != 0) {
    fprintf(stderr,"Usage: %s [-d] [-h <heap size in bytes>]\n", argv[0]);
    exit (1);
  }

  heap_size = heap_wanted > 0 ? heap_wanted : DEFAULT_HEAP_SIZE;

  the_heaps = malloc( heap_size * 2 );
  if (the_heaps == NULL)  {
    fprintf(stderr,
	    "T could not allocate two heaps of %d bytes.\n", heap_size);
    fprintf(stderr,
	    "Please retry with smaller heaps by using the -h switch.\n");
    exit(1);
  }

  total = (long) the_heaps;

  /* make heaps smaller (if necessary) for quadword alignment */

  aligned_total = (total + 15) & 0xFFFFFFF0;
  aligned_heap_size = ( ((heap_size * 2) - (aligned_total - total))
		       & 0xFFFFFFF0 );

  heap_size = aligned_heap_size / 2;

  /* print message if any command line flag is given */

  if (heap_wanted != -1)
    fprintf(stderr,"%d bytes per heap\n", heap_size);

  return start_t( aligned_total, (aligned_total + heap_size),
		 heap_size, argc, argv, debug);
}

void gc_interrupt(void)
{
  fprintf(stderr, "Interrupted during GC; "
	  "'q' to exit, anything else to continue GC.\n");
  if (getchar() == 'q')
    exit(0);
}

extern int errno;
extern char *sys_errlist[];
extern int sys_nerr;

void get_unix_error_msg(char *t, int size) 
{
  char *r; char *s;    
  r = sys_errlist[ errno ];
  s = t + size;
  while (t < s && ((*t++ = *r++) != '\0'));
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.