*** _Makefile	Mon Feb 19 22:43:02 1990
--- Makefile	Thu Feb 22 22:04:21 1990
***************
*** 81,90 ****
  # Also choose just one of -g and -O.
  #CC=		 gcc
  
! OPTIMIZE=	-O
  PROFILE=	#-pg
  DEBUG=		#-DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
! DEBUGGER=	#-g -Bstatic
  WARN=		#-W -Wunused -Wimplicit -Wreturn-type -Wcomment	# for gcc only
  
  # Parser to use on grammar -- if you don't have bison use the first one
--- 81,90 ----
  # Also choose just one of -g and -O.
  #CC=		 gcc
  
! OPTIMIZE=	#-O
  PROFILE=	#-pg
  DEBUG=		#-DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
! DEBUGGER=	-g # -Bstatic
  WARN=		#-W -Wunused -Wimplicit -Wreturn-type -Wcomment	# for gcc only
  
  # Parser to use on grammar -- if you don't have bison use the first one
***************
*** 102,113 ****
  # need to customize this file below this point.
  #
  
! FLAGS= $(MISSING) $(DEBUG)
  CFLAGS= $(FLAGS) $(DEBUGGER) $(PROFILE) $(OPTIMIZE) $(WARN)
  
  # object files
  AWKOBJS = main.o eval.o builtin.o msg.o debug.o io.o field.o array.o node.o \
! 		version.o missing.o
  
  ALLOBJS = $(AWKOBJS) awk.tab.o
  
--- 102,116 ----
  # need to customize this file below this point.
  #
  
! FLAGS= $(MISSING) $(DEBUG) -DSNMP
  CFLAGS= $(FLAGS) $(DEBUGGER) $(PROFILE) $(OPTIMIZE) $(WARN)
+ SNMP-C	=	snmp.c
+ SNMP-O	=	snmp.o
+ SNMP-LIB=	-lsnmp -lisode
  
  # object files
  AWKOBJS = main.o eval.o builtin.o msg.o debug.o io.o field.o array.o node.o \
! 		version.o missing.o $(SNMP-O)
  
  ALLOBJS = $(AWKOBJS) awk.tab.o
  
***************
*** 117,123 ****
  
  # source and documentation files
  SRC =	main.c eval.c builtin.c msg.c \
! 	debug.c io.c field.c array.c node.c missing.c
  
  ALLSRC= $(SRC) awk.tab.c
  
--- 120,126 ----
  
  # source and documentation files
  SRC =	main.c eval.c builtin.c msg.c \
! 	debug.c io.c field.c array.c node.c missing.c $(SNMP-C)
  
  ALLSRC= $(SRC) awk.tab.c
  
***************
*** 153,159 ****
  
  # rules to build gawk
  gawk: $(ALLOBJS) $(GNUOBJS)
! 	$(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) -lm
  
  $(AWKOBJS): awk.h
  
--- 156,162 ----
  
  # rules to build gawk
  gawk: $(ALLOBJS) $(GNUOBJS)
! 	$(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) $(SNMP-LIB) -lm
  
  $(AWKOBJS): awk.h
  
*** _array.c	Thu Aug 31 08:46:15 1989
--- array.c	Fri Feb 23 06:49:17 1990
***************
*** 35,41 ****
--- 35,46 ----
  #define MAKE_POS(v) (v & ~0x80000000)	/* make number positive */
  
  NODE *
+ #ifndef	SNMP
  concat_exp(tree)
+ #else
+ concat_exp(tree,isnmp)
+ int	isnmp;
+ #endif
  NODE *tree;
  {
  	NODE *r;
***************
*** 51,58 ****
--- 56,73 ----
  	r = force_string(tree_eval(tree->lnode));
  	if (tree->rnode == NULL)
  		return r;
+ #ifdef	SNMP
+ 	if (isnmp) {
+ 	    subseplen = Ndot_string -> stlen;
+ 	    subsep = Ndot_string -> stptr;
+ 	}
+ 	else {
+ #endif
  	subseplen = SUBSEP_node->lnode->stlen;
  	subsep = SUBSEP_node->lnode->stptr;
+ #ifdef	SNMP
+ 	}
+ #endif
  	len = r->stlen + subseplen + 1;
  	emalloc(str, char *, len, "concat_exp");
  	s = str;
***************
*** 90,95 ****
--- 105,114 ----
  	int i;
  	NODE *bucket, *next;
  
+ #ifdef	SNMP
+ 	if (symbol -> magic)
+ 	    fatal ("split into SNMP array variable not allowed");
+ #endif
  	if (symbol->var_array == 0)
  		return;
  	for (i = 0; i < ASSOC_HASHSIZE; i++) {
***************
*** 133,138 ****
--- 152,162 ----
  {
  	register NODE *bucket;
  
+ #ifdef	SNMP
+ 	if (symbol -> magic)
+ 	    fatal ("assoc_find: internal error");
+ #endif
+ 
  	for (bucket = symbol->var_array[hash1]; bucket; bucket = bucket->ahnext) {
  		if (cmp_nodes(bucket->ahname, subs))
  			continue;
***************
*** 152,160 ****
--- 176,193 ----
  
  	if (symbol->type == Node_param_list)
  		symbol = stack_ptr[symbol->param_cnt];
+ #ifdef	SNMP
+ 	if (symbol -> magic)
+ 	    return *assoc_lookup (symbol, concat_exp (subs, 1))
+ 			!= Nnull_string;
+ #endif
  	if (symbol->var_array == 0)
  		return 0;
+ #ifndef	SNMP
  	subs = concat_exp(subs);
+ #else
+ 	subs = concat_exp(subs,0);
+ #endif
  	hash1 = hash_calc(subs);
  	if (assoc_find(symbol, subs, hash1) == NULL) {
  		free_temp(subs);
***************
*** 181,186 ****
--- 214,225 ----
  
  	hash1 = hash_calc(subs);
  
+ #ifdef	SNMP
+ 	if (symbol -> magic) {
+ 	    snmp_get (symbol, force_string (subs) -> stptr);
+ 	    return &symbol -> var_value;
+ 	}
+ #endif
  	if (symbol->var_array == 0) {	/* this table really should grow
  					 * dynamically */
  		emalloc(symbol->var_array, NODE **, (sizeof(NODE *) *
***************
*** 211,219 ****
--- 250,266 ----
  	register NODE *bucket, *last;
  	NODE *subs;
  
+ #ifdef	SNMP
+ 	if (symbol -> magic)
+ 	    fatal ("delete into SNMP array variable not allowed");
+ #endif
  	if (symbol->var_array == 0)
  		return;
+ #ifndef	SNMP
  	subs = concat_exp(tree);
+ #else
+ 	subs = concat_exp(tree,0);
+ #endif
  	hash1 = hash_calc(subs);
  
  	last = NULL;
***************
*** 240,245 ****
--- 287,296 ----
  {
  	struct search *lookat;
  
+ #ifdef	SNMP
+ 	if (symbol -> magic)
+ 	    return snmp_assoc_scan (symbol);
+ #endif
  	if (!symbol->var_array)
  		return 0;
  	emalloc(lookat, struct search *, sizeof(struct search), "assoc_scan");
***************
*** 246,258 ****
--- 297,322 ----
  	lookat->numleft = ASSOC_HASHSIZE;
  	lookat->arr_ptr = symbol->var_array;
  	lookat->bucket = symbol->var_array[0];
+ #ifndef	SNMP
  	return assoc_next(lookat);
+ #else
+ 	return assoc_next(symbol, lookat);
+ #endif
  }
  
  struct search *
+ #ifndef	SNMP
  assoc_next(lookat)
+ #else
+ assoc_next(symbol, lookat)
+ NODE *symbol;
+ #endif
  struct search *lookat;
  {
+ #ifdef	SNMP
+ 	if (symbol -> magic)
+ 	    return snmp_assoc_next (lookat, 0);
+ #endif
  	for (; lookat->numleft; lookat->numleft--) {
  		while (lookat->bucket != 0) {
  			lookat->retval = lookat->bucket->ahname;
*** _awk.h	Mon Oct 23 16:18:23 1989
--- awk.h	Tue Mar  6 14:19:04 1990
***************
*** 62,68 ****
  #endif
  
  #ifdef __STDC__
! extern void *malloc(unsigned), *realloc(void *, unsigned);
  extern void free(char *);
  extern char *getenv(char *);
  
--- 62,68 ----
  #endif
  
  #ifdef __STDC__
! extern char *malloc(unsigned), *realloc(void *, unsigned);
  extern void free(char *);
  extern char *getenv(char *);
  
***************
*** 237,242 ****
--- 237,245 ----
  
  	/* Variables */
  	Node_var,		/* rnode is value, lnode is array stuff */
+ #ifdef	SNMP
+ 				/* magic is pointer to (OT) */
+ #endif
  	Node_var_array,		/* array is ptr to elements, asize num of
  				 * eles */
  	Node_val,		/* node is a value - type in flags */
***************
*** 290,295 ****
--- 293,301 ----
  			char *name;
  			short number;
  			unsigned char recase;
+ #ifdef	SNMP
+ 			caddr_t cookie;
+ #endif
  		} nodep;
  		struct {
  			AWKNUM fltnum;	/* this is here for optimal packing of
***************
*** 333,338 ****
--- 339,347 ----
  #define lnode	sub.nodep.l.lptr
  #define nextp	sub.nodep.l.nextnode
  #define rnode	sub.nodep.r.rptr
+ #ifdef	SNMP
+ #define	magic	sub.nodep.cookie
+ #endif
  #define source_file	sub.nodep.name
  #define	source_line	sub.nodep.number
  #define	param_cnt	sub.nodep.number
***************
*** 525,531 ****
--- 534,544 ----
  extern	NODE **get_lhs(NODE *, int);
  extern	void do_deref(void );
  extern	struct search *assoc_scan(NODE *);
+ #ifndef	SNMP
  extern	struct search *assoc_next(struct search *);
+ #else	SNMP
+ extern  struct search *assoc_next(NODE *symbol, struct search *lookat);
+ #endif	SNMP
  extern	NODE **assoc_lookup(NODE *, NODE *);
  extern	double r_force_number(NODE *);
  extern	NODE *r_force_string(NODE *);
***************
*** 596,598 ****
--- 609,640 ----
  #endif
  
  extern char casetable[];	/* for case-independent regexp matching */
+ 
+ 
+ #ifdef	SNMP
+ extern	NODE   *AGENT_node,
+ 	       *COMMUNITY_node,
+ 	       *DIAGNOSTIC_node,
+ 	       *ERROR_node,
+ 	       *RETRIES_node,
+ 	       *TIMEOUT_node;
+ 
+ extern	NODE   *Ndot_string;
+ 
+ extern	int	snmp_enabled;
+ extern	char   *snmp_file;
+ 
+ 
+ #ifdef	__STDC__
+ int check_snmp(NODE *r, char *name);
+ int snmp_get(NODE *ptr, char *instname);
+ char *snmp_name(NODE *ptr);
+ struct search *snmp_assoc_scan(NODE *symbol);
+ struct search *snmp_assoc_next(struct search *lookat, int done);
+ #else
+ int	check_snmp ();
+ int	snmp_get ();
+ char   *snmp_name ();
+ struct search *snmp_assoc_scan (), *snmp_assoc_next ();
+ #endif
+ #endif
*** _awk.tab.c	Tue Oct 24 13:37:57 1989
--- awk.tab.c	Tue Feb 27 17:33:59 1990
***************
*** 1930,1935 ****
--- 1930,1938 ----
  	*do_split(),	*do_system(),	*do_int(),	*do_close(),
  	*do_atan2(),	*do_sin(),	*do_cos(),	*do_rand(),
  	*do_srand(),	*do_match(),	*do_tolower(),	*do_toupper(),
+ #ifdef	SNMP
+ 	*do_band (),	*do_bor (),
+ #endif
  	*do_sub(),	*do_gsub();
  
  /* Special functions for debugging */
***************
*** 1943,1948 ****
--- 1946,1955 ----
  	{ "BEGIN",	Node_illegal,		LEX_BEGIN,	0,	0 },
  	{ "END",	Node_illegal,		LEX_END,	0,	0 },
  	{ "atan2",	Node_builtin,		LEX_BUILTIN,	0,	do_atan2 },
+ #ifdef	SNMP
+ 	{ "bit_and",	Node_builtin,		LEX_BUILTIN,	0,	do_band },
+ 	{ "bit_or",	Node_builtin,		LEX_BUILTIN,	0,	do_bor },
+ #endif
  #ifdef DEBUG
  	{ "bp",		Node_builtin,		LEX_BUILTIN,	0,	do_bp },
  #endif
***************
*** 2926,2932 ****
--- 2933,2947 ----
  	register NODE *r;
  
  	if ((r = lookup(variables, name)) == NULL)
+ #ifdef	SNMP
+ 	{
+ #endif
  		r = install(variables, name,
  			node(Nnull_string, Node_var, (NODE *) NULL));
+ #ifdef	SNMP
+ 		if (snmp_enabled && r)
+ 		    check_snmp (r, name);
+ 	}
+ #endif
  	return r;
  }
*** _awk.y	Wed Oct 18 08:02:07 1989
--- awk.y	Tue Feb 27 17:33:31 1990
***************
*** 684,689 ****
--- 684,692 ----
  	*do_split(),	*do_system(),	*do_int(),	*do_close(),
  	*do_atan2(),	*do_sin(),	*do_cos(),	*do_rand(),
  	*do_srand(),	*do_match(),	*do_tolower(),	*do_toupper(),
+ #ifdef	SNMP
+ 	*do_band (),	*do_bor (),
+ #endif
  	*do_sub(),	*do_gsub();
  
  /* Special functions for debugging */
***************
*** 697,702 ****
--- 700,709 ----
  	{ "BEGIN",	Node_illegal,		LEX_BEGIN,	0,	0 },
  	{ "END",	Node_illegal,		LEX_END,	0,	0 },
  	{ "atan2",	Node_builtin,		LEX_BUILTIN,	0,	do_atan2 },
+ #ifdef	SNMP
+ 	{ "bit_and",	Node_builtin,		LEX_BUILTIN,	0,	do_band },
+ 	{ "bit_or",	Node_builtin,		LEX_BUILTIN,	0,	do_bor },
+ #endif
  #ifdef DEBUG
  	{ "bp",		Node_builtin,		LEX_BUILTIN,	0,	do_bp },
  #endif
***************
*** 1680,1686 ****
--- 1687,1701 ----
  	register NODE *r;
  
  	if ((r = lookup(variables, name)) == NULL)
+ #ifdef	SNMP
+ 	{
+ #endif
  		r = install(variables, name,
  			node(Nnull_string, Node_var, (NODE *) NULL));
+ #ifdef	SNMP
+ 		if (snmp_enabled && r)
+ 		    check_snmp (r, name);
+ 	}
+ #endif
  	return r;
  }
*** _builtin.c	Wed Oct 18 08:02:08 1989
--- builtin.c	Tue Feb 27 17:33:32 1990
***************
*** 535,540 ****
--- 535,608 ----
  		fflush(fp);
  }
  
+ #ifdef	SNMP
+ NODE   *do_band (tree)
+ NODE   *tree;
+ {
+ #ifdef	sun386
+     long	l;
+ #endif
+     unsigned long d1,
+ 		  d2;
+     NODE   *s1,
+ 	   *s2;
+ 
+     get_two (tree, &s1, &s2);
+ 
+ #ifdef	sun386
+     l = force_number (s1);
+     d1 = (unsigned long) l;
+ #else
+     d1 = (unsigned long) force_number (s1);
+ #endif
+ 
+ #ifdef	sun386
+     l = force_number (s2);
+     d2 = (unsigned long) l;
+ #else
+     d2 = (unsigned long) force_number (s2);
+ #endif
+ 
+     free_temp (s1);
+     free_temp (s2);
+ 
+     return tmp_number ((AWKNUM) ((unsigned long) (d1 & d2)));
+ }
+ 
+ NODE   *do_bor (tree)
+ NODE   *tree;
+ {
+ #ifdef	sun386
+     long	l;
+ #endif
+     unsigned long d1,
+ 		  d2;
+     NODE   *s1,
+ 	   *s2;
+ 
+     get_two (tree, &s1, &s2);
+ 
+ #ifdef	sun386
+     l = force_number (s1);
+     d1 = (unsigned long) l;
+ #else
+     d1 = (unsigned long) force_number (s1);
+ #endif
+ 
+ #ifdef	sun386
+     l = force_number (s2);
+     d2 = (unsigned long) l;
+ #else
+     d2 = (unsigned long) force_number (s2);
+ #endif
+ 
+     free_temp (s1);
+     free_temp (s2);
+ 
+     return tmp_number ((AWKNUM) ((unsigned long) (d1 | d2)));
+ }
+ #endif
+ 
  NODE *
  do_sqrt(tree)
  NODE *tree;
*** _debug.c	Wed Aug  9 20:06:00 1989
--- debug.c	Thu Feb 22 16:27:38 1990
***************
*** 109,116 ****
--- 109,124 ----
  		{
  		struct search *l;
  
+ #ifndef	SNMP
  		printf("(0x%x Array)\n", ptr);
  		for (l = assoc_scan(ptr); l; l = assoc_next(l)) {
+ #else
+ 		printf("(0x%x Array%s)\n", ptr,
+ 		       ptr -> magic ? " {SNMP}": "");
+ 		if (ptr -> magic)
+ 		    return;
+ 		for (l = assoc_scan(ptr); l; l = assoc_next(ptr, l)) {
+ #endif
  			printf("\tindex: ");
  			print_parse_tree(l->retval);
  			printf("\tvalue: ");
***************
*** 343,348 ****
--- 351,360 ----
  			for (buc = variables[n]; buc; buc = buc->hnext) {
  				if (buc->hvalue == ptr) {
  					printf("%.*s", buc->hlength, buc->hname);
+ #ifdef	SNMP
+ 					if (ptr -> magic)
+ 					    printf ("{SNMP}");
+ #endif
  					n = HASHSIZE;
  					break;
  				}
*** _eval.c	Wed Oct 18 08:02:09 1989
--- eval.c	Tue Feb 27 08:33:06 1990
***************
*** 302,308 ****
--- 302,312 ----
  		if (t->type == Node_param_list)
  			t = stack_ptr[t->param_cnt];
  		stable_tree = tree;
+ #ifndef	SNMP
  		for (l = assoc_scan(t); l; l = assoc_next((struct search *)l)) {
+ #else
+ 		for (l = assoc_scan(t); l; l = assoc_next(t, l)) {
+ #endif
  			deref = *((NODE **) lhs);
  			do_deref();
  			*lhs = dupnode(l->retval);
***************
*** 318,323 ****
--- 322,331 ----
  				break;
  
  			case TAG_BREAK:
+ #ifdef	SNMP
+ 				if (t -> magic)
+ 				    (void) snmp_assoc_next (l, 1);
+ #endif
  				RESTORE_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);
  				field_num = -1;
  				return 1;
***************
*** 912,918 ****
--- 920,930 ----
  		 */
  		if (arg->type == Node_param_list)
  			arg = stack_ptr[arg->param_cnt];
+ #ifndef	SNMP
  		if (arg->type == Node_var_array)
+ #else
+ 		if (arg -> type == Node_var_array && !arg -> magic)
+ #endif
  			*r = *arg;
  		else {
  			n = tree_eval(arg);
***************
*** 980,985 ****
--- 992,1002 ----
  		arg = argp->lnode;
  		n = *sp++;
  		if (arg->type == Node_var && n->type == Node_var_array) {
+ #ifdef	SNMP
+ 			if (arg -> magic)
+ 			    fatal ("array assignment to SNMP scalar variable \"%s\"",
+ 				   snmp_name (arg));
+ #endif
  			arg->var_array = n->var_array;
  			arg->type = Node_var_array;
  		}
***************
*** 1031,1036 ****
--- 1048,1062 ----
  	switch (ptr->type) {
  	case Node_var:
  	case Node_var_array:
+ #ifdef	SNMP
+ 	    if (ptr -> magic)
+ 		if (assign)
+ 		    fatal ("attempt to set SNMP %s variable \"%s\"",
+ 			   ptr -> type == Node_var ? "scalar" : "array",
+ 			   snmp_name (ptr));
+ 	        else
+ 		    snmp_get (ptr, (char *) NULL);
+ #endif
  		if (ptr == NF_node && (int) NF_node->var_value->numbr == -1)
  			(void) get_field(HUGE-1, assign); /* parse record */
  		deref = ptr->var_value;
***************
*** 1067,1073 ****
--- 1093,1107 ----
  		n = ptr->lnode;
  		if (n->type == Node_param_list)
  			n = stack_ptr[n->param_cnt];
+ #ifdef	SNMP
+ 	        if (n -> magic && assign)
+ 		    fatal ("attempt to set SNMP array variable \"%s\"",
+ 			   snmp_name (n));
+ 		aptr = assoc_lookup(n,
+ 				    concat_exp(ptr->rnode, n -> magic ? 1 : 0));
+ #else
  		aptr = assoc_lookup(n, concat_exp(ptr->rnode));
+ #endif
  		deref = *aptr;
  #ifdef DEBUG
  		if (deref->type != Node_val)
*** _main.c	Tue Oct 17 10:08:24 1989
--- main.c	Mon Feb 26 17:18:48 1990
***************
*** 94,101 ****
--- 94,106 ----
   */
  #define EXTENSIONS	8	/* where to clear */
  #ifdef DEBUG
+ #ifndef	SNMP
  char awk_opts[] = "F:f:v:caeCVdD";
  #else
+ char awk_opts[] = "F:f:v:caeCVdDsS";
+ extern int debug;
+ #endif
+ #else
  char awk_opts[] = "F:f:v:caeCV";
  #endif
  
***************
*** 189,195 ****
--- 194,210 ----
  			debugging++;
  			yydebug = 2;
  			break;
+ 
+ #ifdef	SNMP
+ 		case 's':
+ 			debug = 1;
+ 			break;
+ 
+ 		case 'S':
+ 			debug = 2;
+ 			break;
  #endif
+ #endif
  
  #ifndef STRICT
  		case 'c':
***************
*** 478,483 ****
--- 493,506 ----
  	RSTART_node = spc_var("RSTART", make_number(0.0));
  	SUBSEP_node = spc_var("SUBSEP", make_string("\034", 1));
  	IGNORECASE_node = spc_var("IGNORECASE", make_number(0.0));
+ #ifdef	SNMP
+ 	AGENT_node = spc_var ("AGENT", make_string ("localhost", 9));
+ 	COMMUNITY_node = spc_var ("COMMUNITY", make_string ("public", 6));
+ 	DIAGNOSTIC_node = spc_var ("DIAGNOSTIC", Nnull_string);
+ 	ERROR_node = spc_var ("ERROR", make_number (0.0));
+ 	RETRIES_node = spc_var ("RETRIES", make_number (3.0));
+ 	TIMEOUT_node = spc_var ("TIMEOUT", make_number (10.0));
+ #endif
  
  	ENVIRON_node = spc_var("ENVIRON", Nnull_string);
  	for (i = 0; environ[i]; i++) {
*** _node.c	Wed Oct 11 15:57:31 1989
--- node.c	Fri Feb 23 06:43:17 1990
***************
*** 276,281 ****
--- 276,284 ----
  #endif
  	it->type = ty;
  	it->flags = MALLOC;
+ #ifdef	SNMP
+ 	it->magic = NULL;
+ #endif
  #ifdef MEMDEBUG
  	fprintf(stderr, "node: new: %0x\n", it);
  #endif
