Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/libgdsl-beispiel

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

#include <gdsl_types.h>
#include <gdsl_stack.h>


/** Copies the given data element (a string in our case) */
gdsl_element_t alloc_element(void *elem) {
	int len = strlen((char *)elem);
	gdsl_element_t result = malloc(len + 1);
	memcpy(result, elem, len + 1);
	return result;
}

/** Frees memory consumed by the given element */
void free_element(gdsl_element_t e) {
	free(e);
}

/** Prints the given element to an arbitrary stream */
void print_element(gdsl_element_t element, FILE *file,
		   gdsl_location_t location, void *user_data) {
	fprintf(file, "%i: %s\n", location, (char*)element);
}

/** Call-back function for traversal of data structure */
int do_something(gdsl_element_t element,
		gdsl_location_t location,
		void *user_data) {
	printf("%s", (char*)element);	/* just print the element */
	return GDSL_MAP_CONT;		/* continue traversal */
}

#define BUFFER_SIZE 1000

int main(int argc, char **argv) {

	/* Initialize the stack structure with pointers to alloc-
	 * and free functions */
	gdsl_stack_t stack = gdsl_stack_alloc("Mein Stack",
			                      alloc_element,
					      free_element);

	/* Fill the stack dynamically */
        char buffer[BUFFER_SIZE];
	printf("> ");
	fgets(buffer, sizeof(buffer)-1, stdin);
	while (strlen(buffer) > 1) {
		gdsl_stack_insert(stack, buffer);
		printf("> ");
	        fgets(buffer, sizeof(buffer)-1, stdin);
	}

	/* Traverse stack forward */
	printf("map_forward\n-----------\n");
	gdsl_stack_map_forward(stack, do_something, NULL);

	/* Traverse stack backward */
	printf("map_backward\n------------\n");
	gdsl_stack_map_backward(stack, do_something, NULL);
	
	/* printf("\nDump: ");
	gdsl_stack_write_xml(stack, print_element, stdout, NULL); */

	
	/* Traverse and free stack manually */
	while (!gdsl_stack_is_empty(stack)) {
		gdsl_element_t e = gdsl_stack_remove(stack);
		free_element(e);
	}
	
	/* Free complete data structure and its contents */
	gdsl_stack_free(stack);

	return EXIT_SUCCESS;

}