beta-tester for insque.c needed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi List,
i rewrote the example from insque.3
the code now uses a zero-size array and
has a demo for remque.

i need some feedback if that is working perhaps
with other libc version than glibc. (note i tested on 
arm and x86_64).

cu,
 wh
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <search.h>

struct element {
	struct element *forward;
	struct element *backward;
	char payload[];
};

static struct element *new_element(char *arg)
{
	struct element *e;

	e = calloc(sizeof(struct element)+1+strlen(arg),1);
	if (e == NULL) {
		fprintf(stderr, "malloc() failed\n");
		exit(EXIT_FAILURE);
	}
	strcpy(e->payload,arg);
	return e;
}

int main(int argc, char *argv[])
{
	struct element *first, *elem, *prev;
	int circular, opt, errfnd;

	/* The "-c" command-line option can be used to specify that the
	   list is circular */

	errfnd = 0;
	circular = 0;
	while ((opt = getopt(argc, argv, "c")) != -1) {
		switch (opt) {
		case 'c':
			circular = 1;
			break;
		default:
			errfnd = 1;
			break;
		}
	}

	if (errfnd || optind >= argc) {
		fprintf(stderr, "Usage: %s [-c] string...\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	/* Create first element and place it in the linked list */

	elem = new_element(argv[optind]);
	first = elem;

	if (circular) {
		elem->forward = elem;
		elem->backward = elem;
		insque(elem, elem);
	} else {
		insque(elem, NULL);
	}

	/* Add remaining command-line arguments as list elements */

	while (++optind < argc) {
		prev = elem;
		elem = new_element(argv[optind]);
		insque(elem, prev);
	}

	/* Traverse the list from the start, printing element names */

	printf("Traversing completed list:\n");
	elem = first;
	do {
		printf("     %s\n", elem->payload);
		elem = elem->forward;
	} while (elem != NULL && elem != first);

	if (elem == first)
		printf("That was a circular list\n");

	elem=first;
	do 
	{
		struct element *next;
		next= elem->forward;
		printf("free %s\n", elem->payload);
		remque(elem);
		free(elem);
		if (circular && elem==next ) 
			break;
		elem=next;
	} while (elem != NULL );
	exit(EXIT_SUCCESS);
}

[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux