ftp.nice.ch/pub/next/unix/audio/shorten.1.12.s.tar.gz#/shorten-1.12/hsgetopt.c

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

/*
 * Copyright (c) 1987, 1989 University of Maryland
 * Department of Computer Science.  All rights reserved.
 * Permission to copy for any purpose is hereby granted
 * so long as this copyright notice remains intact.
 */

/*
 * getopt - get option letter from argv
 * (From Henry Spencer @ U of Toronto Zoology, slightly edited)
 */

/* 
 * modiifed by Tony Robinson on 27 March 1993 to remove the call to
 * index() and declare strcmp(); and strlen().
*/

/*
 * modified by Jon Fiscus on 18 August 1993: renamed to hs_getopt
 * to avoid conflicts with system provided calls.
*/

#include <stdio.h>

/* BEGIN AJR MOD */
extern int strcmp(/* char*, char* */);
extern int strlen(/* char* */);
/* END AJR MOD */

char	*hs_optarg;	/* Global argument pointer. */
int	 hs_optind;	/* Global argv index. */

static char *scan;	/* Private scan pointer. */

void hs_resetopt() {
        scan = (char *)0;
        hs_optind = 0;
} 

int
hs_getopt(argc, argv, optstring)
	register int argc;
	register char **argv;
	char *optstring;
{
	register int c;
	register char *place;

	hs_optarg = NULL;
	if (scan == NULL || *scan == 0) {
		if (hs_optind == 0)
			hs_optind++;
		if (hs_optind >= argc || argv[hs_optind][0] != '-' ||
		    argv[hs_optind][1] == 0)
			return (EOF);
		if (strcmp(argv[hs_optind], "--") == 0) {
			hs_optind++;
			return (EOF);
		}
		scan = argv[hs_optind] + 1;
		hs_optind++;
	}
	c = *scan++;

	/* BEGIN AJR MOD
	   this used to read:
	   place = index(optstring, c);
	   this code modified from code by Steve Lowe (steve@dragonsys.com)
	*/
	{ char *str = optstring;
	  if(str == NULL) place = NULL;
	  while((*str != '\0') && (*str != c)) str++;
	  if(*str == c) place = str;
	  else place = NULL;
	}
	/* END AJR MOD */

	if (place == NULL || c == ':') {
	  /* BEGIN AJR MOD
	     this used to read:

	     fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
	     return ('?');

	     but this has been deleted as we deal with this later
	     
	     NOTE: this makes this version of getopt non-standard

	     END AJR MOD
	  */
	  return(c);
	}
	place++;
	if (*place == ':') {
		if (*scan != '\0') {
			hs_optarg = scan;
			scan = NULL;
		} else {
			if (hs_optind >= argc) {
				fprintf(stderr,
					"%s: missing argument after -%c\n",
					argv[0], c);
				return ('?');
			}
			hs_optarg = argv[hs_optind];
			hs_optind++;
		}
	}
	return (c);
}

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