usual WSL problem

This commit is contained in:
MarcUs7i 2025-03-26 13:22:44 +01:00
parent e8fef7e170
commit 003502d8dd
40 changed files with 7324 additions and 7324 deletions

170
.gitignore vendored
View file

@ -1,85 +1,85 @@
# specific name of executable generated
toh_main_driver
toh_test_driver
# Created by https://www.gitignore.io/api/c++,macos,linux
# Edit at https://www.gitignore.io/?templates=c++,macos,linux
### C++ ###
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# End of https://www.gitignore.io/api/c++,macos,linux
# specific name of executable generated
toh_main_driver
toh_test_driver
# Created by https://www.gitignore.io/api/c++,macos,linux
# Edit at https://www.gitignore.io/?templates=c++,macos,linux
### C++ ###
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# End of https://www.gitignore.io/api/c++,macos,linux

3130
Doxyfile

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/G1aZJ1Dv)
### if.04.22 Procedural Programming
# Assignment Lists
## Doubly Linked List
With this assignment you shall implement abstract data types for a list in C.
Clone this assignment, open the index.html, read the assignment instructions and try to make all unit tests green.
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/G1aZJ1Dv)
### if.04.22 Procedural Programming
# Assignment Lists
## Doubly Linked List
With this assignment you shall implement abstract data types for a list in C.
Clone this assignment, open the index.html, read the assignment instructions and try to make all unit tests green.

View file

@ -1,108 +1,108 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: Allocator for lists and list elements.
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Implementation of memory allocation functions.
* ----------------------------------------------------------
*/
#include "allocator.h"
#include <stdio.h>
#include <string.h>
#include "shortcut.h"
/* ===================================================================== */
/* Private memory allocation functions */
#define MAX_BLOCK_CNT 64
struct MemAllocStat {
bool block_alloc_calls;
int alloc_call_cnt;
int free_call_cnt;
int mem_block_cnt;
void* mem_blocks[MAX_BLOCK_CNT];
};
static struct MemAllocStat mem_stat = {false, 0, 0, 0, {0}};
void mem_reset_calls() {
mem_stat.block_alloc_calls = false;
mem_stat.alloc_call_cnt = 0;
mem_stat.free_call_cnt = 0;
}
void mem_reset_stat() {
mem_reset_calls();
memset(mem_stat.mem_blocks, 0, MAX_BLOCK_CNT * sizeof(void*));
mem_stat.mem_block_cnt = 0;
}
static int mem_get_alloc_idx(void* p) {
if (p == 0) {
return MAX_BLOCK_CNT;
}
int idx = 0;
for (; idx < MAX_BLOCK_CNT && p != mem_stat.mem_blocks[idx]; idx++);
return idx;
}
bool mem_is_allocated(void* p) {
return mem_get_alloc_idx(p) < MAX_BLOCK_CNT;
}
void mem_block_allocs(bool block) {
mem_stat.block_alloc_calls = block;
}
int mem_get_alloc_call_cnt() {
return mem_stat.alloc_call_cnt;
}
int mem_get_free_call_cnt() {
return mem_stat.free_call_cnt;
}
int mem_get_allocated_block_cnt() {
return mem_stat.mem_block_cnt;
}
/* ===================================================================== */
void* alloc_mem(size_t size) {
void* p = 0;
mem_stat.alloc_call_cnt++;
if (!mem_stat.block_alloc_calls) {
p = malloc(size);
if (p != 0) {
int idx = 0;
for (; idx < MAX_BLOCK_CNT && mem_stat.mem_blocks[idx] != 0; idx++);
if (idx < MAX_BLOCK_CNT) {
mem_stat.mem_blocks[idx] = p;
mem_stat.mem_block_cnt++;
} else {
free(p);
p = 0;
}
}
}
return p;
}
void free_mem(void* p_mem) {
mem_stat.free_call_cnt++;
if(p_mem == 0) {
printf("\tFailure: Freeing 0 (NULL)\n");
} else {
int mem_block_idx = mem_get_alloc_idx(p_mem);
if(mem_block_idx >= MAX_BLOCK_CNT) {
printf("\tFailure: Freeing memory that is not allocated [%p]\n", p_mem);
} else {
mem_stat.mem_blocks[mem_block_idx] = 0;
mem_stat.mem_block_cnt--;
}
}
free(p_mem);
}
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: Allocator for lists and list elements.
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Implementation of memory allocation functions.
* ----------------------------------------------------------
*/
#include "allocator.h"
#include <stdio.h>
#include <string.h>
#include "shortcut.h"
/* ===================================================================== */
/* Private memory allocation functions */
#define MAX_BLOCK_CNT 64
struct MemAllocStat {
bool block_alloc_calls;
int alloc_call_cnt;
int free_call_cnt;
int mem_block_cnt;
void* mem_blocks[MAX_BLOCK_CNT];
};
static struct MemAllocStat mem_stat = {false, 0, 0, 0, {0}};
void mem_reset_calls() {
mem_stat.block_alloc_calls = false;
mem_stat.alloc_call_cnt = 0;
mem_stat.free_call_cnt = 0;
}
void mem_reset_stat() {
mem_reset_calls();
memset(mem_stat.mem_blocks, 0, MAX_BLOCK_CNT * sizeof(void*));
mem_stat.mem_block_cnt = 0;
}
static int mem_get_alloc_idx(void* p) {
if (p == 0) {
return MAX_BLOCK_CNT;
}
int idx = 0;
for (; idx < MAX_BLOCK_CNT && p != mem_stat.mem_blocks[idx]; idx++);
return idx;
}
bool mem_is_allocated(void* p) {
return mem_get_alloc_idx(p) < MAX_BLOCK_CNT;
}
void mem_block_allocs(bool block) {
mem_stat.block_alloc_calls = block;
}
int mem_get_alloc_call_cnt() {
return mem_stat.alloc_call_cnt;
}
int mem_get_free_call_cnt() {
return mem_stat.free_call_cnt;
}
int mem_get_allocated_block_cnt() {
return mem_stat.mem_block_cnt;
}
/* ===================================================================== */
void* alloc_mem(size_t size) {
void* p = 0;
mem_stat.alloc_call_cnt++;
if (!mem_stat.block_alloc_calls) {
p = malloc(size);
if (p != 0) {
int idx = 0;
for (; idx < MAX_BLOCK_CNT && mem_stat.mem_blocks[idx] != 0; idx++);
if (idx < MAX_BLOCK_CNT) {
mem_stat.mem_blocks[idx] = p;
mem_stat.mem_block_cnt++;
} else {
free(p);
p = 0;
}
}
}
return p;
}
void free_mem(void* p_mem) {
mem_stat.free_call_cnt++;
if(p_mem == 0) {
printf("\tFailure: Freeing 0 (NULL)\n");
} else {
int mem_block_idx = mem_get_alloc_idx(p_mem);
if(mem_block_idx >= MAX_BLOCK_CNT) {
printf("\tFailure: Freeing memory that is not allocated [%p]\n", p_mem);
} else {
mem_stat.mem_blocks[mem_block_idx] = 0;
mem_stat.mem_block_cnt--;
}
}
free(p_mem);
}

View file

@ -1,50 +1,50 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: Dynamic memory allocator.
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Declaration of memory allocation functions.
* ----------------------------------------------------------
*/
#ifndef ___ALLOCATOR__H
#define ___ALLOCATOR__H
#include <stdlib.h>
#include <stdbool.h>
/**
* Allocates a memory block of the given size in bytes
* in a similar way as `malloc(size)`.
*
* Note: use `sizeof(X)` function to determines the size
* of a specfic type or value.
*
* @param size The number of bytes to allocate.
* @return The pointer to the allocated memory block or 0,
* if no memory could be allocated.
*/
void* alloc_mem(size_t size);
/**
* Release the addressed memory block that was allocated via function `alloc_mem(...)`.
*
* @param p_mem The pointer to the memory to free.
*/
void free_mem(void* p_mem);
/* ==================================================== */
/* functions used for testing only! */
void mem_reset_calls();
void mem_reset_stat();
bool mem_is_allocated(void* p);
void mem_block_allocs(bool block);
int mem_get_alloc_call_cnt();
int mem_get_free_call_cnt();
int mem_get_allocated_block_cnt();
#endif
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: Dynamic memory allocator.
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Declaration of memory allocation functions.
* ----------------------------------------------------------
*/
#ifndef ___ALLOCATOR__H
#define ___ALLOCATOR__H
#include <stdlib.h>
#include <stdbool.h>
/**
* Allocates a memory block of the given size in bytes
* in a similar way as `malloc(size)`.
*
* Note: use `sizeof(X)` function to determines the size
* of a specfic type or value.
*
* @param size The number of bytes to allocate.
* @return The pointer to the allocated memory block or 0,
* if no memory could be allocated.
*/
void* alloc_mem(size_t size);
/**
* Release the addressed memory block that was allocated via function `alloc_mem(...)`.
*
* @param p_mem The pointer to the memory to free.
*/
void free_mem(void* p_mem);
/* ==================================================== */
/* functions used for testing only! */
void mem_reset_calls();
void mem_reset_stat();
bool mem_is_allocated(void* p);
void mem_block_allocs(bool block);
int mem_get_alloc_call_cnt();
int mem_get_free_call_cnt();
int mem_get_allocated_block_cnt();
#endif

View file

@ -1,16 +1,16 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Exercise Number: n/a
* Title: Configuration Options
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Global application configuration options
* ----------------------------------------------------------
*/
#ifndef ___CONFIGURATION_H
#define ___CONFIGURATION_H
#endif
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Exercise Number: n/a
* Title: Configuration Options
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Global application configuration options
* ----------------------------------------------------------
*/
#ifndef ___CONFIGURATION_H
#define ___CONFIGURATION_H
#endif

View file

@ -1,64 +1,64 @@
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: Doubly Linked List implementation
* Author: */<your name>;/*
* ----------------------------------------------------------
* Description:
* Implementation of a doubly linked list.
* ----------------------------------------------------------
*/
/*
Implementation notes:
1) The 'ListData' struct of this linked list SHALL have
- a pointer to the head node,
- a pointer to the tail node
- and the size of the list
as members!
2) List list, node, and iterator allocation:
Use functions `mem_alloc()` and `mem_free()`
declared in `allocator.h`. DO NOT use `malloc()` and `free()` directly
as unit tests will fail.
3) Use 'limits.h' to get maximum and minimum values for numeric types, if needed.
4) Implement 'list_iterator.h' in this file as well.
5) Avoid code duplication wherever (reasonably) possible.
This is valid for implementation of similar functions as well
as for reoccurring code patterns, such as list iteration.
Nevertheless, aim for efficiency, e.g. `remove_all` shall traverse
the list only once and not use `remove` as defined, because
the later would start at the beginning of the list for each iteration.
*/
#include "doubly_linked_list_with_iterator.h"
/** The type of list nodes */
/** The implementation of list node data */
/** The implementation of list data */
/** The implementation of list iterator data */
/* ===================================================================== */
/* private list functions */
/* abstract away and generalize also memory allocation for list nodes */
static <node-type> list_obtain_node(<params>) {
}
static void list_release_node(<node-type>) {
}
/* optional: implement a function for printing the content of the list - may be useful for debugging */
void list_dump(char* prefix, IntList list) {
}
/* ===================================================================== */
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: Doubly Linked List implementation
* Author: */<your name>;/*
* ----------------------------------------------------------
* Description:
* Implementation of a doubly linked list.
* ----------------------------------------------------------
*/
/*
Implementation notes:
1) The 'ListData' struct of this linked list SHALL have
- a pointer to the head node,
- a pointer to the tail node
- and the size of the list
as members!
2) List list, node, and iterator allocation:
Use functions `mem_alloc()` and `mem_free()`
declared in `allocator.h`. DO NOT use `malloc()` and `free()` directly
as unit tests will fail.
3) Use 'limits.h' to get maximum and minimum values for numeric types, if needed.
4) Implement 'list_iterator.h' in this file as well.
5) Avoid code duplication wherever (reasonably) possible.
This is valid for implementation of similar functions as well
as for reoccurring code patterns, such as list iteration.
Nevertheless, aim for efficiency, e.g. `remove_all` shall traverse
the list only once and not use `remove` as defined, because
the later would start at the beginning of the list for each iteration.
*/
#include "doubly_linked_list_with_iterator.h"
/** The type of list nodes */
/** The implementation of list node data */
/** The implementation of list data */
/** The implementation of list iterator data */
/* ===================================================================== */
/* private list functions */
/* abstract away and generalize also memory allocation for list nodes */
static <node-type> list_obtain_node(<params>) {
}
static void list_release_node(<node-type>) {
}
/* optional: implement a function for printing the content of the list - may be useful for debugging */
void list_dump(char* prefix, IntList list) {
}
/* ===================================================================== */

View file

@ -1,27 +1,27 @@
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: Doubly Linked List
* Author: */<your name;/*
* ----------------------------------------------------------
* Description:
* The declaration of a linked list abstract data type
* based on an implementation of a doubly linked list.
* ----------------------------------------------------------
*/
#ifndef ___DOUBLY_LINKED_LIST__H
#define ___DOUBLY_LINKED_LIST__H
#include "list.h"
#include "list_iterator.h"
/** This header file maps only the common 'list' interface
* into naming conventions for doubly linked list implementation.
*
* It does (for now) not extend or alter the function prototypes of the
* common interface.
*/
#endif
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: Doubly Linked List
* Author: */<your name;/*
* ----------------------------------------------------------
* Description:
* The declaration of a linked list abstract data type
* based on an implementation of a doubly linked list.
* ----------------------------------------------------------
*/
#ifndef ___DOUBLY_LINKED_LIST__H
#define ___DOUBLY_LINKED_LIST__H
#include "list.h"
#include "list_iterator.h"
/** This header file maps only the common 'list' interface
* into naming conventions for doubly linked list implementation.
*
* It does (for now) not extend or alter the function prototypes of the
* common interface.
*/
#endif

View file

@ -1,14 +1,14 @@
code {
background: #eaeaea;
padding: 0 0.3em;
border-radius: 4px;
}
div.fragment {
padding: 0.5em;
border-radius: 4px;
margin: 1em 0;
}
div.line {
line-height: 1.4;
code {
background: #eaeaea;
padding: 0 0.3em;
border-radius: 4px;
}
div.fragment {
padding: 0.5em;
border-radius: 4px;
margin: 1em 0;
}
div.line {
line-height: 1.4;
}

View file

@ -1,20 +1,20 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Exercise Number: n/a
* Title: general.h
* Author: P. Bauer, S. Schraml
* ----------------------------------------------------------
* Description:
* General usable definitions and types.
* ----------------------------------------------------------
*/
#ifndef ___GENERAL_H
#define ___GENERAL_H
/** Convenience macro do get maximum of two numbers */
#define MAX(x, y) ((x) > (y) ? (x) : (y))
/** Convenience macro do get maximum of two numbers */
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#endif
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Exercise Number: n/a
* Title: general.h
* Author: P. Bauer, S. Schraml
* ----------------------------------------------------------
* Description:
* General usable definitions and types.
* ----------------------------------------------------------
*/
#ifndef ___GENERAL_H
#define ___GENERAL_H
/** Convenience macro do get maximum of two numbers */
#define MAX(x, y) ((x) > (y) ? (x) : (y))
/** Convenience macro do get maximum of two numbers */
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#endif

File diff suppressed because it is too large Load diff

View file

@ -1,14 +1,14 @@
code {
background: #eaeaea;
padding: 0 0.3em;
border-radius: 4px;
}
div.fragment {
padding: 0.5em;
border-radius: 4px;
margin: 1em 0;
}
div.line {
line-height: 1.4;
code {
background: #eaeaea;
padding: 0 0.3em;
border-radius: 4px;
}
div.fragment {
padding: 0.5em;
border-radius: 4px;
margin: 1em 0;
}
div.line {
line-height: 1.4;
}

View file

@ -1,121 +1,121 @@
/*
@licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}
function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
function toggleLevel(level)
{
$('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}
function toggleFolder(id)
{
// the clicked row
var currentRow = $('#row_'+id);
// all rows after the clicked row
var rows = currentRow.nextAll("tr");
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
// only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); });
// first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING
// replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
}
function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}
/* @license-end */
/*
@licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}
function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
function toggleLevel(level)
{
$('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}
function toggleFolder(id)
{
// the clicked row
var currentRow = $('#row_'+id);
// all rows after the clicked row
var rows = currentRow.nextAll("tr");
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
// only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); });
// first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING
// replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
}
function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}
/* @license-end */

View file

@ -1,82 +1,82 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">File List</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="mainpage_8h_source.html"><span class="icondoc"></span></a><a class="el" href="mainpage_8h.html" target="_self">mainpage.h</a></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">File List</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="mainpage_8h_source.html"><span class="icondoc"></span></a><a class="el" href="mainpage_8h.html" target="_self">mainpage.h</a></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>

View file

@ -1,117 +1,117 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: Main Page</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">Doubly Linked List Documentation</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="intro"></a>
Introduction</h1>
<p>The implementation of a "Doubly Linked List with List Iterator".</p>
<h1><a class="anchor" id="objective"></a>
Assignment Objective</h1>
<p>In this assignment an Abstract Data Type of a "Doubly Linked List" shall be implemented against the defined common interface of a list. This interface is declared within file 'list.h'. In addition shall support a list iterator with the interface declared within file 'list_iterator.h'. It is intended to be used by applications or other libraries and aims to abstract the 'list' functionality as far as possible.</p>
<p>The 'Doubly Linked List' shall have the following members of the list data:</p><ul>
<li>the pointer to the list head node</li>
<li>the pointer to the list tail node</li>
<li>the size of the list</li>
</ul>
<p>The list iterator shall be implemented in the same .c file as the list.</p>
<p><b>Tip:</b> Feel free to reuse <b>YOUR</b> Simple Singly Linked List implementation: Copy the functions from simple_singly_linked_list.c into doubly_linked_list.c and modify the data and functions accordingly. Don't miss the iterator functions.</p>
<p><b>Configuration</b></p>
<p>There is no configuration required.</p>
<h1><a class="anchor" id="assignment"></a>
Assignment</h1>
<p>The 'Doubly Linked List' shall be implemented in file 'doubly_linked_list_with_iterator.c'. The corresponding header file includes the common interface 'list.h' and 'list_iterator.h' but does not add functions by its own.</p>
<p>The library 'allocator' is provided for memory allocation functionality that integrates with unit testing. Behind the facade, allocats memory dynamically similar to <code>malloc</code>. Allocated memory must be freed when it is not used anymore. The 'allocator' library must be used for memory alloction operations, otherwise unit tests will fail.</p>
<ol type="1">
<li>Implement 'doubly_linked_list_with_iterator.c' against interface indirectly declared in 'list.h' AND 'list.iterator.h': Make the program and tests compile: Implement all functions in all relevant files declared in the headers EMTPY (return nothing, 0, false, ... as required).<ul>
<li>All unit tests shall run but FAIL after this step</li>
<li><b>&ndash;COMMIT&ndash;</b></li>
</ul>
</li>
<li>Implement the empty functions one by one to make the unit tests pass one by one.<ul>
<li>The purpose of a function is specified as API documentation within the header files.</li>
<li>Obey comments in source files. Run the unit tests frequently and fix failures.</li>
<li><b>&ndash;COMMIT&ndash; after each implemented function.</b></li>
</ul>
</li>
</ol>
<p>Main driver is not required in this assignment.</p>
<h1><a class="anchor" id="notes"></a>
Notes</h1>
<ol type="1">
<li>make cleantest: This new make target for clearing the console, building, and running unit test is available.</li>
<li>Sometimes changes are not properly detected by incremental builds. If something very strange happens during compilation, try to run <code>make clean</code> followed by <code>make</code> to start a clean build. This approach is also recommended after everthing is done, because some compiler warning appears only in clean builds. </li>
</ol>
</div></div><!-- PageDoc -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: Main Page</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">Doubly Linked List Documentation</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="intro"></a>
Introduction</h1>
<p>The implementation of a "Doubly Linked List with List Iterator".</p>
<h1><a class="anchor" id="objective"></a>
Assignment Objective</h1>
<p>In this assignment an Abstract Data Type of a "Doubly Linked List" shall be implemented against the defined common interface of a list. This interface is declared within file 'list.h'. In addition shall support a list iterator with the interface declared within file 'list_iterator.h'. It is intended to be used by applications or other libraries and aims to abstract the 'list' functionality as far as possible.</p>
<p>The 'Doubly Linked List' shall have the following members of the list data:</p><ul>
<li>the pointer to the list head node</li>
<li>the pointer to the list tail node</li>
<li>the size of the list</li>
</ul>
<p>The list iterator shall be implemented in the same .c file as the list.</p>
<p><b>Tip:</b> Feel free to reuse <b>YOUR</b> Simple Singly Linked List implementation: Copy the functions from simple_singly_linked_list.c into doubly_linked_list.c and modify the data and functions accordingly. Don't miss the iterator functions.</p>
<p><b>Configuration</b></p>
<p>There is no configuration required.</p>
<h1><a class="anchor" id="assignment"></a>
Assignment</h1>
<p>The 'Doubly Linked List' shall be implemented in file 'doubly_linked_list_with_iterator.c'. The corresponding header file includes the common interface 'list.h' and 'list_iterator.h' but does not add functions by its own.</p>
<p>The library 'allocator' is provided for memory allocation functionality that integrates with unit testing. Behind the facade, allocats memory dynamically similar to <code>malloc</code>. Allocated memory must be freed when it is not used anymore. The 'allocator' library must be used for memory alloction operations, otherwise unit tests will fail.</p>
<ol type="1">
<li>Implement 'doubly_linked_list_with_iterator.c' against interface indirectly declared in 'list.h' AND 'list.iterator.h': Make the program and tests compile: Implement all functions in all relevant files declared in the headers EMTPY (return nothing, 0, false, ... as required).<ul>
<li>All unit tests shall run but FAIL after this step</li>
<li><b>&ndash;COMMIT&ndash;</b></li>
</ul>
</li>
<li>Implement the empty functions one by one to make the unit tests pass one by one.<ul>
<li>The purpose of a function is specified as API documentation within the header files.</li>
<li>Obey comments in source files. Run the unit tests frequently and fix failures.</li>
<li><b>&ndash;COMMIT&ndash; after each implemented function.</b></li>
</ul>
</li>
</ol>
<p>Main driver is not required in this assignment.</p>
<h1><a class="anchor" id="notes"></a>
Notes</h1>
<ol type="1">
<li>make cleantest: This new make target for clearing the console, building, and running unit test is available.</li>
<li>Sometimes changes are not properly detected by incremental builds. If something very strange happens during compilation, try to run <code>make clean</code> followed by <code>make</code> to start a clean build. This approach is also recommended after everthing is done, because some compiler warning appears only in clean builds. </li>
</ol>
</div></div><!-- PageDoc -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>

68
html/jquery.js vendored

File diff suppressed because one or more lines are too long

View file

@ -1,79 +1,79 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: mainpage.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">mainpage.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<p><a href="mainpage_8h_source.html">Go to the source code of this file.</a></p>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: mainpage.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">mainpage.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<p><a href="mainpage_8h_source.html">Go to the source code of this file.</a></p>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>

View file

@ -1,78 +1,78 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: mainpage.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">mainpage.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="mainpage_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doubly Linked List: mainpage.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Doubly Linked List
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">mainpage.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="mainpage_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Feb 23 2021 00:46:06 for Doubly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>

View file

@ -1,51 +1,51 @@
/*
@licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) {
var result='';
if ('children' in data) {
result+='<ul>';
for (var i in data.children) {
result+='<li><a href="'+relPath+data.children[i].url+'">'+
data.children[i].text+'</a>'+
makeTree(data.children[i],relPath)+'</li>';
}
result+='</ul>';
}
return result;
}
$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) {
if (serverSide) {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
}
}
$('#main-menu').smartmenus();
}
/* @license-end */
/*
@licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) {
var result='';
if ('children' in data) {
result+='<ul>';
for (var i in data.children) {
result+='<li><a href="'+relPath+data.children[i].url+'">'+
data.children[i].text+'</a>'+
makeTree(data.children[i],relPath)+'</li>';
}
result+='</ul>';
}
return result;
}
$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) {
if (serverSide) {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
}
}
$('#main-menu').smartmenus();
}
/* @license-end */

View file

@ -1,28 +1,28 @@
/*
@licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/
var menudata={children:[
{text:"Main Page",url:"index.html"},
{text:"Files",url:"files.html",children:[
{text:"File List",url:"files.html"}]}]}
/*
@licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/
var menudata={children:[
{text:"Main Page",url:"index.html"},
{text:"Files",url:"files.html",children:[
{text:"File List",url:"files.html"}]}]}

View file

@ -1,36 +1,36 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_0.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">Loading...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
window.addEventListener("message", function(event) {
if (event.data == "take_focus") {
var elem = searchResults.NavNext(0);
if (elem) elem.focus();
}
});
/* @license-end */
--></script>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_0.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">Loading...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
window.addEventListener("message", function(event) {
if (event.data == "take_focus") {
var elem = searchResults.NavNext(0);
if (elem) elem.focus();
}
});
/* @license-end */
--></script>
</div>
</body>
</html>

View file

@ -1,4 +1,4 @@
var searchData=
[
['mainpage_2eh_0',['mainpage.h',['../mainpage_8h.html',1,'']]]
];
var searchData=
[
['mainpage_2eh_0',['mainpage.h',['../mainpage_8h.html',1,'']]]
];

View file

@ -1,36 +1,36 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="files_0.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">Loading...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
window.addEventListener("message", function(event) {
if (event.data == "take_focus") {
var elem = searchResults.NavNext(0);
if (elem) elem.focus();
}
});
/* @license-end */
--></script>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="files_0.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">Loading...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
window.addEventListener("message", function(event) {
if (event.data == "take_focus") {
var elem = searchResults.NavNext(0);
if (elem) elem.focus();
}
});
/* @license-end */
--></script>
</div>
</body>
</html>

View file

@ -1,4 +1,4 @@
var searchData=
[
['mainpage_2eh_1',['mainpage.h',['../mainpage_8h.html',1,'']]]
];
var searchData=
[
['mainpage_2eh_1',['mainpage.h',['../mainpage_8h.html',1,'']]]
];

View file

@ -1,12 +1,12 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</body>
</html>

View file

@ -1,271 +1,271 @@
/*---------------- Search Box */
#FSearchBox {
float: left;
}
#MSearchBox {
white-space : nowrap;
float: none;
margin-top: 8px;
right: 0px;
width: 170px;
height: 24px;
z-index: 102;
}
#MSearchBox .left
{
display:block;
position:absolute;
left:10px;
width:20px;
height:19px;
background:url('search_l.png') no-repeat;
background-position:right;
}
#MSearchSelect {
display:block;
position:absolute;
width:20px;
height:19px;
}
.left #MSearchSelect {
left:4px;
}
.right #MSearchSelect {
right:5px;
}
#MSearchField {
display:block;
position:absolute;
height:19px;
background:url('search_m.png') repeat-x;
border:none;
width:115px;
margin-left:20px;
padding-left:4px;
color: #909090;
outline: none;
font: 9pt Arial, Verdana, sans-serif;
-webkit-border-radius: 0px;
}
#FSearchBox #MSearchField {
margin-left:15px;
}
#MSearchBox .right {
display:block;
position:absolute;
right:10px;
top:8px;
width:20px;
height:19px;
background:url('search_r.png') no-repeat;
background-position:left;
}
#MSearchClose {
display: none;
position: absolute;
top: 4px;
background : none;
border: none;
margin: 0px 4px 0px 0px;
padding: 0px 0px;
outline: none;
}
.left #MSearchClose {
left: 6px;
}
.right #MSearchClose {
right: 2px;
}
.MSearchBoxActive #MSearchField {
color: #000000;
}
/*---------------- Search filter selection */
#MSearchSelectWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #90A5CE;
background-color: #F9FAFC;
z-index: 10001;
padding-top: 4px;
padding-bottom: 4px;
-moz-border-radius: 4px;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
}
.SelectItem {
font: 8pt Arial, Verdana, sans-serif;
padding-left: 2px;
padding-right: 12px;
border: 0px;
}
span.SelectionMark {
margin-right: 4px;
font-family: monospace;
outline-style: none;
text-decoration: none;
}
a.SelectItem {
display: block;
outline-style: none;
color: #000000;
text-decoration: none;
padding-left: 6px;
padding-right: 12px;
}
a.SelectItem:focus,
a.SelectItem:active {
color: #000000;
outline-style: none;
text-decoration: none;
}
a.SelectItem:hover {
color: #FFFFFF;
background-color: #3D578C;
outline-style: none;
text-decoration: none;
cursor: pointer;
display: block;
}
/*---------------- Search results window */
iframe#MSearchResults {
width: 60ex;
height: 15em;
}
#MSearchResultsWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #000;
background-color: #EEF1F7;
z-index:10000;
}
/* ----------------------------------- */
#SRIndex {
clear:both;
padding-bottom: 15px;
}
.SREntry {
font-size: 10pt;
padding-left: 1ex;
}
.SRPage .SREntry {
font-size: 8pt;
padding: 1px 5px;
}
body.SRPage {
margin: 5px 2px;
}
.SRChildren {
padding-left: 3ex; padding-bottom: .5em
}
.SRPage .SRChildren {
display: none;
}
.SRSymbol {
font-weight: bold;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRScope {
display: block;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRSymbol:focus, a.SRSymbol:active,
a.SRScope:focus, a.SRScope:active {
text-decoration: underline;
}
span.SRScope {
padding-left: 4px;
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
}
.SRResult {
display: none;
}
DIV.searchresults {
margin-left: 10px;
margin-right: 10px;
}
/*---------------- External search page results */
.searchresult {
background-color: #F0F3F8;
}
.pages b {
color: white;
padding: 5px 5px 3px 5px;
background-image: url("../tab_a.png");
background-repeat: repeat-x;
text-shadow: 0 1px 1px #000000;
}
.pages {
line-height: 17px;
margin-left: 4px;
text-decoration: none;
}
.hl {
font-weight: bold;
}
#searchresults {
margin-bottom: 20px;
}
.searchpages {
margin-top: 10px;
}
/*---------------- Search Box */
#FSearchBox {
float: left;
}
#MSearchBox {
white-space : nowrap;
float: none;
margin-top: 8px;
right: 0px;
width: 170px;
height: 24px;
z-index: 102;
}
#MSearchBox .left
{
display:block;
position:absolute;
left:10px;
width:20px;
height:19px;
background:url('search_l.png') no-repeat;
background-position:right;
}
#MSearchSelect {
display:block;
position:absolute;
width:20px;
height:19px;
}
.left #MSearchSelect {
left:4px;
}
.right #MSearchSelect {
right:5px;
}
#MSearchField {
display:block;
position:absolute;
height:19px;
background:url('search_m.png') repeat-x;
border:none;
width:115px;
margin-left:20px;
padding-left:4px;
color: #909090;
outline: none;
font: 9pt Arial, Verdana, sans-serif;
-webkit-border-radius: 0px;
}
#FSearchBox #MSearchField {
margin-left:15px;
}
#MSearchBox .right {
display:block;
position:absolute;
right:10px;
top:8px;
width:20px;
height:19px;
background:url('search_r.png') no-repeat;
background-position:left;
}
#MSearchClose {
display: none;
position: absolute;
top: 4px;
background : none;
border: none;
margin: 0px 4px 0px 0px;
padding: 0px 0px;
outline: none;
}
.left #MSearchClose {
left: 6px;
}
.right #MSearchClose {
right: 2px;
}
.MSearchBoxActive #MSearchField {
color: #000000;
}
/*---------------- Search filter selection */
#MSearchSelectWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #90A5CE;
background-color: #F9FAFC;
z-index: 10001;
padding-top: 4px;
padding-bottom: 4px;
-moz-border-radius: 4px;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
}
.SelectItem {
font: 8pt Arial, Verdana, sans-serif;
padding-left: 2px;
padding-right: 12px;
border: 0px;
}
span.SelectionMark {
margin-right: 4px;
font-family: monospace;
outline-style: none;
text-decoration: none;
}
a.SelectItem {
display: block;
outline-style: none;
color: #000000;
text-decoration: none;
padding-left: 6px;
padding-right: 12px;
}
a.SelectItem:focus,
a.SelectItem:active {
color: #000000;
outline-style: none;
text-decoration: none;
}
a.SelectItem:hover {
color: #FFFFFF;
background-color: #3D578C;
outline-style: none;
text-decoration: none;
cursor: pointer;
display: block;
}
/*---------------- Search results window */
iframe#MSearchResults {
width: 60ex;
height: 15em;
}
#MSearchResultsWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #000;
background-color: #EEF1F7;
z-index:10000;
}
/* ----------------------------------- */
#SRIndex {
clear:both;
padding-bottom: 15px;
}
.SREntry {
font-size: 10pt;
padding-left: 1ex;
}
.SRPage .SREntry {
font-size: 8pt;
padding: 1px 5px;
}
body.SRPage {
margin: 5px 2px;
}
.SRChildren {
padding-left: 3ex; padding-bottom: .5em
}
.SRPage .SRChildren {
display: none;
}
.SRSymbol {
font-weight: bold;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRScope {
display: block;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRSymbol:focus, a.SRSymbol:active,
a.SRScope:focus, a.SRScope:active {
text-decoration: underline;
}
span.SRScope {
padding-left: 4px;
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
}
.SRResult {
display: none;
}
DIV.searchresults {
margin-left: 10px;
margin-right: 10px;
}
/*---------------- External search page results */
.searchresult {
background-color: #F0F3F8;
}
.pages b {
color: white;
padding: 5px 5px 3px 5px;
background-image: url("../tab_a.png");
background-repeat: repeat-x;
text-shadow: 0 1px 1px #000000;
}
.pages {
line-height: 17px;
margin-left: 4px;
text-decoration: none;
}
.hl {
font-weight: bold;
}
#searchresults {
margin-bottom: 20px;
}
.searchpages {
margin-top: 10px;
}

File diff suppressed because it is too large Load diff

View file

@ -1,18 +1,18 @@
var indexSectionsWithContent =
{
0: "m",
1: "m"
};
var indexSectionNames =
{
0: "all",
1: "files"
};
var indexSectionLabels =
{
0: "All",
1: "Files"
};
var indexSectionsWithContent =
{
0: "m",
1: "m"
};
var indexSectionNames =
{
0: "all",
1: "files"
};
var indexSectionLabels =
{
0: "All",
1: "Files"
};

File diff suppressed because one or more lines are too long

318
list.h
View file

@ -1,159 +1,159 @@
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: List Interface
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* The declaration of a list abstract data type.
* ----------------------------------------------------------
*/
#ifndef ___LIST__H
#define ___LIST__H
#include <stdbool.h>
#include "list_types.h"
/**
* Obtains ('creates') and provides a 'new' list instance.
* Any list obtained via this function MUST be released using
* function `release_list()`.
*
* Note: This function does not make any assumptions
* about how list components, esp. nodes, are allocated.
*
* @return The list instance or 0, if no list could by instantiated.
*/
IntList list_obtain();
/**
* Releases a list that was obtained earlier via function `obtain_list`.
* Released lists MUST NOT be used anymore.
*
* Note: The implementation of this function does not make any assumptions
* about the allocation method of list elements, but MUST match the implementation
* of function `obtain_list` as its inverse function.
*
* @param p_list The pointer to the list to release. The value of the pointer
* is set to 0, if the list was successfully released, otherwise it is left untouched.
*/
void list_release(IntList* p_list);
/**
* Determines whether or not the given list is valid.
*
* @param list The list to evaluate.
* @return `True` if the list is valid, false otherwise.
*/
bool list_is_valid(IntList list);
/**
* Determines whether or not the list contains at least one item.
*
* @param list The list to evaluate.
* @return `False` if the list contains one or more items, `true` otherwise.
*/
bool list_is_empty(IntList list);
/**
* Provides the number of values stored in the list.
*
* @param list The list to evaluate.
* @return The number of values the list contains.
*/
int list_get_size(IntList list);
/**
* Determines whether or not the list given list contains the queried value
* at least once.
*
* @param list The list to query.
* @param value The value.
* @return `True` if the list contains at least one instance of the value,
* `false ` otherwise.
*/
bool list_contains(IntList list, int value);
/**
* Provides the value stored in the list at the given position.
*
* @param list The list from which the value shall be retrieved.
* @param index The zero-based position index of the value to retrieve.
* @return The value stored at the given position or 0, if the position
* is not available.
*/
int list_get_at(IntList list, unsigned int index);
/**
* Inserts the given value at the end of the given list.
*
* @param list The list to which the value shall be appended.
* @param value The value to append to the list.
*/
void list_insert(IntList list, int value);
/**
* Inserts the given value at the indexed position in a way the
* the inserted value is on that position. The index is
* - similar to arrays - zero-based. If the the list is shorter
* than the indexed position, the value is inserted at the end
* of the list.
*
* @param list The list into which the value shall be appended.
* @param index The position index of the value to insert.
* @param value The value to insert.
*/
void list_insert_at(IntList list, unsigned int index, int value);
/**
* Appends the `list_to_append` at the end of the given `list`.
* The appended list is empty afterwards, because all nodes of that list
* have been transferred to `list`.
*
* @param list The list that receives the other list.
* @param list_to_append The list that is appended to `list`.
*/
void list_append(IntList list, IntList list_to_append);
/**
* Removes the first occurrance of `value` from the given list.
* If the list does not contain that value, the list shall not
* be modified.
*
* @param list The list from which the given value shall be removed.
* @param value The value to remove from the list.
*/
void list_remove(IntList list, int value);
/**
* Removes all occurrances of `value` from the list.
* If the list does not contain that value, the list shall not
* be modified.
*
* @param list The list from which all occurrances of `value` shall be removed.
* @param value The `value` to remove throughout the list.
*/
void list_remove_all(IntList list, int value);
/**
* Removes the value at the indexed position from the given list
* and provides that value. If the list does not have a value
* at that position, the list remains unmodified.
*
* @param list The list from which the value at the given index shall be returned.
* @param index The zero-based index of the value to return.
* @return The removed value or 0 in case of errors.
*/
int list_remove_at(IntList list, unsigned int index);
/**
* Clears the given list by removing all values from the list.
*
* @param list The list to clear.
*/
void list_clear(IntList list);
#endif
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: List Interface
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* The declaration of a list abstract data type.
* ----------------------------------------------------------
*/
#ifndef ___LIST__H
#define ___LIST__H
#include <stdbool.h>
#include "list_types.h"
/**
* Obtains ('creates') and provides a 'new' list instance.
* Any list obtained via this function MUST be released using
* function `release_list()`.
*
* Note: This function does not make any assumptions
* about how list components, esp. nodes, are allocated.
*
* @return The list instance or 0, if no list could by instantiated.
*/
IntList list_obtain();
/**
* Releases a list that was obtained earlier via function `obtain_list`.
* Released lists MUST NOT be used anymore.
*
* Note: The implementation of this function does not make any assumptions
* about the allocation method of list elements, but MUST match the implementation
* of function `obtain_list` as its inverse function.
*
* @param p_list The pointer to the list to release. The value of the pointer
* is set to 0, if the list was successfully released, otherwise it is left untouched.
*/
void list_release(IntList* p_list);
/**
* Determines whether or not the given list is valid.
*
* @param list The list to evaluate.
* @return `True` if the list is valid, false otherwise.
*/
bool list_is_valid(IntList list);
/**
* Determines whether or not the list contains at least one item.
*
* @param list The list to evaluate.
* @return `False` if the list contains one or more items, `true` otherwise.
*/
bool list_is_empty(IntList list);
/**
* Provides the number of values stored in the list.
*
* @param list The list to evaluate.
* @return The number of values the list contains.
*/
int list_get_size(IntList list);
/**
* Determines whether or not the list given list contains the queried value
* at least once.
*
* @param list The list to query.
* @param value The value.
* @return `True` if the list contains at least one instance of the value,
* `false ` otherwise.
*/
bool list_contains(IntList list, int value);
/**
* Provides the value stored in the list at the given position.
*
* @param list The list from which the value shall be retrieved.
* @param index The zero-based position index of the value to retrieve.
* @return The value stored at the given position or 0, if the position
* is not available.
*/
int list_get_at(IntList list, unsigned int index);
/**
* Inserts the given value at the end of the given list.
*
* @param list The list to which the value shall be appended.
* @param value The value to append to the list.
*/
void list_insert(IntList list, int value);
/**
* Inserts the given value at the indexed position in a way the
* the inserted value is on that position. The index is
* - similar to arrays - zero-based. If the the list is shorter
* than the indexed position, the value is inserted at the end
* of the list.
*
* @param list The list into which the value shall be appended.
* @param index The position index of the value to insert.
* @param value The value to insert.
*/
void list_insert_at(IntList list, unsigned int index, int value);
/**
* Appends the `list_to_append` at the end of the given `list`.
* The appended list is empty afterwards, because all nodes of that list
* have been transferred to `list`.
*
* @param list The list that receives the other list.
* @param list_to_append The list that is appended to `list`.
*/
void list_append(IntList list, IntList list_to_append);
/**
* Removes the first occurrance of `value` from the given list.
* If the list does not contain that value, the list shall not
* be modified.
*
* @param list The list from which the given value shall be removed.
* @param value The value to remove from the list.
*/
void list_remove(IntList list, int value);
/**
* Removes all occurrances of `value` from the list.
* If the list does not contain that value, the list shall not
* be modified.
*
* @param list The list from which all occurrances of `value` shall be removed.
* @param value The `value` to remove throughout the list.
*/
void list_remove_all(IntList list, int value);
/**
* Removes the value at the indexed position from the given list
* and provides that value. If the list does not have a value
* at that position, the list remains unmodified.
*
* @param list The list from which the value at the given index shall be returned.
* @param index The zero-based index of the value to return.
* @return The removed value or 0 in case of errors.
*/
int list_remove_at(IntList list, unsigned int index);
/**
* Clears the given list by removing all values from the list.
*
* @param list The list to clear.
*/
void list_clear(IntList list);
#endif

View file

@ -1,104 +1,104 @@
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: List Iterator Interface
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* The declaration of a list iterator abstract data type.
* ----------------------------------------------------------
*/
#ifndef ___LIST_ITERATOR__H
#define ___LIST_ITERATOR__H
#include <stdbool.h>
#include "list_types.h"
/**
* Obtains ('creates') and provides a 'new' list iterator instance for the given list.
* The provided iterator initially points to the head node of the list.
*
* Any iterator obtained via this function MUST be released using
* function `release_iterator()`.
*
* Note: This function does not make any assumptions
* about how list components, esp. nodes, are allocated.
*
* @param list The list for which the iterator is obtained.
* @return The list iterator instance or 0, if no list iterator could by instantiated.
*/
IntListIterator list_it_obtain(IntList list);
/**
* Releases a list iterator that was obtained earlier via function `list_it_obtain`.
* Released list iterators MUST NOT be used anymore.
*
* Note: The implementation of this function does not make any assumptions
* about the allocation method of list iterator elements, but MUST match the implementation
* of function `list_it_obtain` as its inverse function.
*
* @param p_it The pointer to the list iterator to release. The value of the pointer
* is set to 0, if the list iterator was successfully released, otherwise it is left untouched.
*/
void list_it_release(IntListIterator* p_it);
/**
* Determines whether or not the given list iterator is valid.
*
* @param it The list iterator to evaluate.
* @return `True` if the list iterator is valid, false otherwise.
*/
bool list_it_is_valid(IntListIterator it);
/**
* Proceeds the list iterator to the next list element, if possible.
*
* @param it The list iterator to evaluate.
* @return `True` if the list iterator could proceed to the next list node, `false` otherwise.
*/
bool list_it_next(IntListIterator it);
/**
* Proceeds the list iterator to the previous list element, if possible.
*
* @param it The list iterator to evaluate.
* @return `True` if the list iterator could proceed to the previous list node, `false` otherwise.
*/
bool list_it_previous(IntListIterator it);
/**
* Provides the value of the node the list iterator currently points to.
*
* @param it The list iterator to evaluate.
* @return The value of the current list node under the iterator.
*/
int list_it_get(IntListIterator it);
/**
* Applies the given value to the node the list iterator currently points to.
*
* @param it The list iterator to evaluate.
* @param value The value to set to the current list node under the iterator.
*/
void list_it_set(IntListIterator it, int value);
/**
* Inserts the given value after the node under the iterator and proceeds the iterator to the
* inserted node.
*
* @param it The list iterator to evaluate.
* @param value The value to insert.
*/
// void list_it_insert(IntListIterator it, int value);
/**
* Removes the node under the iterator and proceeds the iterator to the 'next' node.
*
* @param it The list iterator to evaluate.
*/
// void list_it_remove(IntListIterator it);
#endif
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: List Iterator Interface
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* The declaration of a list iterator abstract data type.
* ----------------------------------------------------------
*/
#ifndef ___LIST_ITERATOR__H
#define ___LIST_ITERATOR__H
#include <stdbool.h>
#include "list_types.h"
/**
* Obtains ('creates') and provides a 'new' list iterator instance for the given list.
* The provided iterator initially points to the head node of the list.
*
* Any iterator obtained via this function MUST be released using
* function `release_iterator()`.
*
* Note: This function does not make any assumptions
* about how list components, esp. nodes, are allocated.
*
* @param list The list for which the iterator is obtained.
* @return The list iterator instance or 0, if no list iterator could by instantiated.
*/
IntListIterator list_it_obtain(IntList list);
/**
* Releases a list iterator that was obtained earlier via function `list_it_obtain`.
* Released list iterators MUST NOT be used anymore.
*
* Note: The implementation of this function does not make any assumptions
* about the allocation method of list iterator elements, but MUST match the implementation
* of function `list_it_obtain` as its inverse function.
*
* @param p_it The pointer to the list iterator to release. The value of the pointer
* is set to 0, if the list iterator was successfully released, otherwise it is left untouched.
*/
void list_it_release(IntListIterator* p_it);
/**
* Determines whether or not the given list iterator is valid.
*
* @param it The list iterator to evaluate.
* @return `True` if the list iterator is valid, false otherwise.
*/
bool list_it_is_valid(IntListIterator it);
/**
* Proceeds the list iterator to the next list element, if possible.
*
* @param it The list iterator to evaluate.
* @return `True` if the list iterator could proceed to the next list node, `false` otherwise.
*/
bool list_it_next(IntListIterator it);
/**
* Proceeds the list iterator to the previous list element, if possible.
*
* @param it The list iterator to evaluate.
* @return `True` if the list iterator could proceed to the previous list node, `false` otherwise.
*/
bool list_it_previous(IntListIterator it);
/**
* Provides the value of the node the list iterator currently points to.
*
* @param it The list iterator to evaluate.
* @return The value of the current list node under the iterator.
*/
int list_it_get(IntListIterator it);
/**
* Applies the given value to the node the list iterator currently points to.
*
* @param it The list iterator to evaluate.
* @param value The value to set to the current list node under the iterator.
*/
void list_it_set(IntListIterator it, int value);
/**
* Inserts the given value after the node under the iterator and proceeds the iterator to the
* inserted node.
*
* @param it The list iterator to evaluate.
* @param value The value to insert.
*/
// void list_it_insert(IntListIterator it, int value);
/**
* Removes the node under the iterator and proceeds the iterator to the 'next' node.
*
* @param it The list iterator to evaluate.
*/
// void list_it_remove(IntListIterator it);
#endif

View file

@ -1,17 +1,17 @@
/*-----------------------------------------------------------------------------
* HTBLA-Leonding / Class: <your class name here>
*-----------------------------------------------------------------------------
* Exercise Number: S02
*-----------------------------------------------------------------------------
* Description:
* The assignment does not require to implement an application.
* Run 'make test' to build and execute all required unit tests.
*-----------------------------------------------------------------------------
*/
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("The assignment does not require to implement an application.\n");
printf("Run 'make test' to build and execute all required unit tests.\n");
/*-----------------------------------------------------------------------------
* HTBLA-Leonding / Class: <your class name here>
*-----------------------------------------------------------------------------
* Exercise Number: S02
*-----------------------------------------------------------------------------
* Description:
* The assignment does not require to implement an application.
* Run 'make test' to build and execute all required unit tests.
*-----------------------------------------------------------------------------
*/
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("The assignment does not require to implement an application.\n");
printf("Run 'make test' to build and execute all required unit tests.\n");
}

View file

@ -1,118 +1,118 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: Tests implementation of a Liked List.
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Unit tests for a linked list implemenation.
* ----------------------------------------------------------
*/
#include <stdio.h>
#include <string.h>
#include "shortcut.h"
#include "test_list.h"
int main(int argc, char *argv[])
{
ADD_TEST(test_list_obtain__shall_allocate_a_list);
ADD_TEST(test_list_obtain__shall_allocate_a_fresh_list);
ADD_TEST(test_list_obtain__shall_allocate_a_different_list);
ADD_TEST(test_list_obtain_failed__shall_not_allocate_a_list);
ADD_TEST(test_list_get_size__shall_be_0_for_newly_obtained_list);
ADD_TEST(test_list_get_size__shall_reflect_number_of_values_after_adding_values);
ADD_TEST(test_list_get_size__shall_reflect_number_of_values_after_removing_values);
ADD_TEST(test_list_get_size__shall_be_0_after_clear);
ADD_TEST(test_list_get_size__shall_be_0_for_invalid_list);
ADD_TEST(test_list_release__shall_release_a_valid_empty_list);
ADD_TEST(test_list_release__shall_release_a_valid_filled_list);
ADD_TEST(test_list_release__shall_ignore_release_of_an_invalid_list);
ADD_TEST(test_list_is_valid__shall_be_true_for_valid_list);
ADD_TEST(test_list_is_valid__shall_be_false_for_invalid_list);
ADD_TEST(test_list_is_empty__shall_be_true__for_newly_obtained_list);
ADD_TEST(test_list_is_empty__shall_be_false__after_adding_values);
ADD_TEST(test_list_is_empty__shall_be_true_for_invalid_list);
ADD_TEST(test_list_insert__shall_add_one_value_to_empty_list);
ADD_TEST(test_list_insert__shall_add_multiple_values);
ADD_TEST(test_list_insert__shall_ignore_invalid_list);
ADD_TEST(test_list_remove__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove__shall_remove_only_value);
ADD_TEST(test_list_remove__shall_remove_one_value);
ADD_TEST(test_list_remove__shall_remove_first_value);
ADD_TEST(test_list_remove__shall_remove_value_in_the_middle);
ADD_TEST(test_list_remove__shall_remove_value_at_the_end);
ADD_TEST(test_list_remove__shall_not_remove_missing_value);
ADD_TEST(test_list_remove_all__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove_all__shall_remove_only_value);
ADD_TEST(test_list_remove_all__shall_remove_all_values);
ADD_TEST(test_list_remove_all__shall_remove_one_value);
ADD_TEST(test_list_remove_all__shall_remove_all_values_in_a_row);
ADD_TEST(test_list_remove_all__shall_remove_all_distributed_values);
ADD_TEST(test_list_remove_all__shall_not_remove_missing_value);
ADD_TEST(test_list_remove_all__shall_ignore_invalid_list);
ADD_TEST(test_list_insert_at__shall_insert_single_value_in_empty_list);
ADD_TEST(test_list_insert_at__shall_insert_value_at_the_beginning);
ADD_TEST(test_list_insert_at__shall_insert_value_in_the_middle);
ADD_TEST(test_list_insert_at__shall_insert_value_at_the_end);
ADD_TEST(test_list_insert_at__shall_insert_value_after_the_end);
ADD_TEST(test_list_insert_at__shall_ignore_invalid_list);
ADD_TEST(test_list_remove_at__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove_at__shall_remove_value_at_the_beginning);
ADD_TEST(test_list_remove_at__shall_remove_value_in_the_middle);
ADD_TEST(test_list_remove_at__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove_at__shall_remove_value_at_the_end);
ADD_TEST(test_list_remove_at__shall_not_remove_value_after_the_end);
ADD_TEST(test_list_remove_at__shall_ignore_invalid_list);
ADD_TEST(test_list_clear__shall_clear_empty_list);
ADD_TEST(test_list_clear__shall_clear_list_with_one_value);
ADD_TEST(test_list_clear__shall_clear_list_with_multiple_values);
ADD_TEST(test_list_clear__shall_ingore_invalid_list);
ADD_TEST(test_list_contains__shall_be_false_for_empty_list);
ADD_TEST(test_list_contains__shall_be_true_for_one_value);
ADD_TEST(test_list_contains__shall_be_true_for_multiple_values);
ADD_TEST(test_list_contains__shall_be_false_form_missing_value);
ADD_TEST(test_list_contains__shall_be_false_for_invalid_list);
ADD_TEST(test_list_get_at__shall_return_0_for_empty_list);
ADD_TEST(test_list_get_at__shall_return_single_value);
ADD_TEST(test_list_get_at__shall_return_first_value);
ADD_TEST(test_list_get_at__shall_return_values_in_added_order);
ADD_TEST(test_list_get_at__shall_return_0_for_invalid_list);
ADD_TEST(test_list_append__shall_append_empty_list_to_empty_list);
ADD_TEST(test_list_append__shall_append_filled_list_to_empty_list);
ADD_TEST(test_list_append__shall_append_empty_list_to_filled_list);
ADD_TEST(test_list_append__shall_append_filled_list_to_filled_list);
ADD_TEST(test_list_append__shall_ignore_invalid_lists);
ADD_TEST(test_list_it_obtain__shall_allocate_and_release_a_list_iterator_for_a_list);
ADD_TEST(test_list_it_obtain__shall_allocate_and_point_to_list_head);
ADD_TEST(test_list_it_obtain__shall_not_allocate_a_list_iterator_for_an_invalid_list);
ADD_TEST(test_list_it_is_valid);
ADD_TEST(test_list_it_is_valid__shall_be_invalid_for_0_iterator);
ADD_TEST(test_list_it_is_valid__shall_be_invalid_for_empty_list);
ADD_TEST(test_list_it_next__shall_move_to_next);
ADD_TEST(test_list_it_next__shall_return_false_for_invalid_it);
ADD_TEST(test_list_it_next__shall_move_to_previous);
ADD_TEST(test_list_it_previous_shall_return_false_for_invalid_it);
ADD_TEST(test_list_it_set_get__shall_modify_value);
ADD_TEST(test_list_it_get__shall_return_0_for_invalid_iterator);
ADD_TEST(test_list_it_set__shall_ignore_call_for_invalid_iterator);
run_tests();
return 0;
}
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: Tests implementation of a Liked List.
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Unit tests for a linked list implemenation.
* ----------------------------------------------------------
*/
#include <stdio.h>
#include <string.h>
#include "shortcut.h"
#include "test_list.h"
int main(int argc, char *argv[])
{
ADD_TEST(test_list_obtain__shall_allocate_a_list);
ADD_TEST(test_list_obtain__shall_allocate_a_fresh_list);
ADD_TEST(test_list_obtain__shall_allocate_a_different_list);
ADD_TEST(test_list_obtain_failed__shall_not_allocate_a_list);
ADD_TEST(test_list_get_size__shall_be_0_for_newly_obtained_list);
ADD_TEST(test_list_get_size__shall_reflect_number_of_values_after_adding_values);
ADD_TEST(test_list_get_size__shall_reflect_number_of_values_after_removing_values);
ADD_TEST(test_list_get_size__shall_be_0_after_clear);
ADD_TEST(test_list_get_size__shall_be_0_for_invalid_list);
ADD_TEST(test_list_release__shall_release_a_valid_empty_list);
ADD_TEST(test_list_release__shall_release_a_valid_filled_list);
ADD_TEST(test_list_release__shall_ignore_release_of_an_invalid_list);
ADD_TEST(test_list_is_valid__shall_be_true_for_valid_list);
ADD_TEST(test_list_is_valid__shall_be_false_for_invalid_list);
ADD_TEST(test_list_is_empty__shall_be_true__for_newly_obtained_list);
ADD_TEST(test_list_is_empty__shall_be_false__after_adding_values);
ADD_TEST(test_list_is_empty__shall_be_true_for_invalid_list);
ADD_TEST(test_list_insert__shall_add_one_value_to_empty_list);
ADD_TEST(test_list_insert__shall_add_multiple_values);
ADD_TEST(test_list_insert__shall_ignore_invalid_list);
ADD_TEST(test_list_remove__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove__shall_remove_only_value);
ADD_TEST(test_list_remove__shall_remove_one_value);
ADD_TEST(test_list_remove__shall_remove_first_value);
ADD_TEST(test_list_remove__shall_remove_value_in_the_middle);
ADD_TEST(test_list_remove__shall_remove_value_at_the_end);
ADD_TEST(test_list_remove__shall_not_remove_missing_value);
ADD_TEST(test_list_remove_all__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove_all__shall_remove_only_value);
ADD_TEST(test_list_remove_all__shall_remove_all_values);
ADD_TEST(test_list_remove_all__shall_remove_one_value);
ADD_TEST(test_list_remove_all__shall_remove_all_values_in_a_row);
ADD_TEST(test_list_remove_all__shall_remove_all_distributed_values);
ADD_TEST(test_list_remove_all__shall_not_remove_missing_value);
ADD_TEST(test_list_remove_all__shall_ignore_invalid_list);
ADD_TEST(test_list_insert_at__shall_insert_single_value_in_empty_list);
ADD_TEST(test_list_insert_at__shall_insert_value_at_the_beginning);
ADD_TEST(test_list_insert_at__shall_insert_value_in_the_middle);
ADD_TEST(test_list_insert_at__shall_insert_value_at_the_end);
ADD_TEST(test_list_insert_at__shall_insert_value_after_the_end);
ADD_TEST(test_list_insert_at__shall_ignore_invalid_list);
ADD_TEST(test_list_remove_at__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove_at__shall_remove_value_at_the_beginning);
ADD_TEST(test_list_remove_at__shall_remove_value_in_the_middle);
ADD_TEST(test_list_remove_at__shall_not_remove_from_empty_list);
ADD_TEST(test_list_remove_at__shall_remove_value_at_the_end);
ADD_TEST(test_list_remove_at__shall_not_remove_value_after_the_end);
ADD_TEST(test_list_remove_at__shall_ignore_invalid_list);
ADD_TEST(test_list_clear__shall_clear_empty_list);
ADD_TEST(test_list_clear__shall_clear_list_with_one_value);
ADD_TEST(test_list_clear__shall_clear_list_with_multiple_values);
ADD_TEST(test_list_clear__shall_ingore_invalid_list);
ADD_TEST(test_list_contains__shall_be_false_for_empty_list);
ADD_TEST(test_list_contains__shall_be_true_for_one_value);
ADD_TEST(test_list_contains__shall_be_true_for_multiple_values);
ADD_TEST(test_list_contains__shall_be_false_form_missing_value);
ADD_TEST(test_list_contains__shall_be_false_for_invalid_list);
ADD_TEST(test_list_get_at__shall_return_0_for_empty_list);
ADD_TEST(test_list_get_at__shall_return_single_value);
ADD_TEST(test_list_get_at__shall_return_first_value);
ADD_TEST(test_list_get_at__shall_return_values_in_added_order);
ADD_TEST(test_list_get_at__shall_return_0_for_invalid_list);
ADD_TEST(test_list_append__shall_append_empty_list_to_empty_list);
ADD_TEST(test_list_append__shall_append_filled_list_to_empty_list);
ADD_TEST(test_list_append__shall_append_empty_list_to_filled_list);
ADD_TEST(test_list_append__shall_append_filled_list_to_filled_list);
ADD_TEST(test_list_append__shall_ignore_invalid_lists);
ADD_TEST(test_list_it_obtain__shall_allocate_and_release_a_list_iterator_for_a_list);
ADD_TEST(test_list_it_obtain__shall_allocate_and_point_to_list_head);
ADD_TEST(test_list_it_obtain__shall_not_allocate_a_list_iterator_for_an_invalid_list);
ADD_TEST(test_list_it_is_valid);
ADD_TEST(test_list_it_is_valid__shall_be_invalid_for_0_iterator);
ADD_TEST(test_list_it_is_valid__shall_be_invalid_for_empty_list);
ADD_TEST(test_list_it_next__shall_move_to_next);
ADD_TEST(test_list_it_next__shall_return_false_for_invalid_it);
ADD_TEST(test_list_it_next__shall_move_to_previous);
ADD_TEST(test_list_it_previous_shall_return_false_for_invalid_it);
ADD_TEST(test_list_it_set_get__shall_modify_value);
ADD_TEST(test_list_it_get__shall_return_0_for_invalid_iterator);
ADD_TEST(test_list_it_set__shall_ignore_call_for_invalid_iterator);
run_tests();
return 0;
}

View file

@ -1,24 +1,24 @@
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: List Types
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* The declaration of a common list specific type declarations.
* ----------------------------------------------------------
*/
#ifndef ___LIST_TYPES__H
#define ___LIST_TYPES__H
#include <stdbool.h>
/** The type of the integer list. */
typedef struct IntListData* IntList;
/** The type of the integer list iterator. */
typedef struct IntListIteratorData* IntListIterator;
#endif
/*----------------------------------------------------------
* HTBLA-Leonding / Class: <your class>
* ---------------------------------------------------------
* Exercise Number: S02
* Title: List Types
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* The declaration of a common list specific type declarations.
* ----------------------------------------------------------
*/
#ifndef ___LIST_TYPES__H
#define ___LIST_TYPES__H
#include <stdbool.h>
/** The type of the integer list. */
typedef struct IntListData* IntList;
/** The type of the integer list iterator. */
typedef struct IntListIteratorData* IntListIterator;
#endif

View file

@ -1,55 +1,55 @@
/**
* @mainpage
* @section intro Introduction
*
* The implementation of a "Doubly Linked List with List Iterator".
*
* @section objective Assignment Objective
* In this assignment an Abstract Data Type of a "Doubly Linked List" shall be implemented against
* the defined common interface of a list. This interface is declared within file 'list.h'. In addition
* shall support a list iterator with the interface declared within file 'list_iterator.h'. It is intended
* to be used by applications or other libraries and aims to abstract the 'list' functionality as far as possible.
*
* The 'Doubly Linked List' shall have the following members of the list data:
* - the pointer to the list head node
* - the pointer to the list tail node
* - the size of the list
*
* The list iterator shall be implemented in the same .c file as the list.
*
* **Tip:** Feel free to reuse **YOUR** Simple Singly Linked List implementation:
* Copy the functions from simple_singly_linked_list.c into doubly_linked_list.c
and modify the data and functions accordingly. Don't miss the iterator functions.
*
* **Configuration**
*
* There is no configuration required.
*
* @section assignment Assignment
* The 'Doubly Linked List' shall be implemented in file 'doubly_linked_list_with_iterator.c'. The corresponding header file
* includes the common interface 'list.h' and 'list_iterator.h' but does not add functions by its own.
*
* The library 'allocator' is provided for memory allocation functionality that integrates with unit testing. Behind the facade,
* allocats memory dynamically similar to `malloc`. Allocated memory must be freed when it is not used anymore. The 'allocator'
* library must be used for memory alloction operations, otherwise unit tests will fail.
*
*
* -# Implement 'doubly_linked_list_with_iterator.c' against interface indirectly declared in 'list.h' AND 'list.iterator.h':
* Make the program and tests compile: Implement all functions in all relevant files declared in the headers
* EMTPY (return nothing, 0, false, ... as required).
* - All unit tests shall run but FAIL after this step
* - **--COMMIT--**
* -# Implement the empty functions one by one to make the unit tests pass one by one.
* - The purpose of a function is specified as API documentation within the header files.
* - Obey comments in source files. Run the unit tests frequently and fix failures.
* - **--COMMIT-- after each implemented function.**
*
* Main driver is not required in this assignment.
*
* @section notes Notes
* -# make cleantest: This new make target for clearing the console, building, and running unit test is available.
* -# Sometimes changes are not properly detected by incremental builds. If something very strange
* happens during compilation, try to run `make clean` followed by `make` to start a clean build.
* This approach is also recommended after everthing is done, because some compiler warning appears
* only in clean builds.
/**
* @mainpage
* @section intro Introduction
*
* The implementation of a "Doubly Linked List with List Iterator".
*
* @section objective Assignment Objective
* In this assignment an Abstract Data Type of a "Doubly Linked List" shall be implemented against
* the defined common interface of a list. This interface is declared within file 'list.h'. In addition
* shall support a list iterator with the interface declared within file 'list_iterator.h'. It is intended
* to be used by applications or other libraries and aims to abstract the 'list' functionality as far as possible.
*
* The 'Doubly Linked List' shall have the following members of the list data:
* - the pointer to the list head node
* - the pointer to the list tail node
* - the size of the list
*
* The list iterator shall be implemented in the same .c file as the list.
*
* **Tip:** Feel free to reuse **YOUR** Simple Singly Linked List implementation:
* Copy the functions from simple_singly_linked_list.c into doubly_linked_list.c
and modify the data and functions accordingly. Don't miss the iterator functions.
*
* **Configuration**
*
* There is no configuration required.
*
* @section assignment Assignment
* The 'Doubly Linked List' shall be implemented in file 'doubly_linked_list_with_iterator.c'. The corresponding header file
* includes the common interface 'list.h' and 'list_iterator.h' but does not add functions by its own.
*
* The library 'allocator' is provided for memory allocation functionality that integrates with unit testing. Behind the facade,
* allocats memory dynamically similar to `malloc`. Allocated memory must be freed when it is not used anymore. The 'allocator'
* library must be used for memory alloction operations, otherwise unit tests will fail.
*
*
* -# Implement 'doubly_linked_list_with_iterator.c' against interface indirectly declared in 'list.h' AND 'list.iterator.h':
* Make the program and tests compile: Implement all functions in all relevant files declared in the headers
* EMTPY (return nothing, 0, false, ... as required).
* - All unit tests shall run but FAIL after this step
* - **--COMMIT--**
* -# Implement the empty functions one by one to make the unit tests pass one by one.
* - The purpose of a function is specified as API documentation within the header files.
* - Obey comments in source files. Run the unit tests frequently and fix failures.
* - **--COMMIT-- after each implemented function.**
*
* Main driver is not required in this assignment.
*
* @section notes Notes
* -# make cleantest: This new make target for clearing the console, building, and running unit test is available.
* -# Sometimes changes are not properly detected by incremental builds. If something very strange
* happens during compilation, try to run `make clean` followed by `make` to start a clean build.
* This approach is also recommended after everthing is done, because some compiler warning appears
* only in clean builds.
*/

198
makefile
View file

@ -1,99 +1,99 @@
CC = gcc
CCLINK = g++
LIBS =
CCOPTIONS = -Wall -pedantic -std=gnu11 -g
LDOPTIONS =
BUILD_DIR = build
TEST = test_doubly_linked_list_with_iterator
PROGRAM = simple_doubly_linked_list_with_iterator
COMMON_HDRS = config.h general.h list.h list_iterator.h list_types.h
LIBRARY_FILES = shortcut allocator
ASSIGNMENT_HDRS =
ASSIGNMENT_FILES = doubly_linked_list_with_iterator
TEST_FILES = test_list
MAIN_DRIVER = list_main_driver
TEST_DRIVER = list_test_driver
LIBRARY_H = $(addsuffix .h, $(LIBRARY_FILES))
ASSIGNMENT_H = $(addsuffix .h, $(ASSIGNMENT_FILES)) $(ASSIGNMENT_HDRS)
ASSIGNMENT_C = $(addsuffix .c, $(ASSIGNMENT_FILES)) $(MAIN_DRIVER).c
HDRS = $(ASSIGNEMT_H) $(SHARED_HDRS) $(COMMON_HDRS) $(LIBRARY_H)
TESTOBJECT = $(addprefix $(BUILD_DIR)/, $(TEST_DRIVER).o)
MAINOBJECT = $(addprefix $(BUILD_DIR)/, $(MAIN_DRIVER).o)
LIBRARY_OBJS = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(LIBRARY_FILES)))
TEST_OBJS = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(TEST_FILES)))
MAIN_OBJ = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(ASSIGNMENT_FILES)))
OBJS = $(LIBRARY_OBJS) $(MAIN_OBJ) $(TEST_OBJS)
DOXY = doxygen
all: $(PROGRAM)
./$(PROGRAM)
$(TEST): $(BUILD_DIR) $(OBJS) $(TESTOBJECT)
$(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(TESTOBJECT)
$(PROGRAM): $(BUILD_DIR) $(OBJS) $(MAINOBJECT)
$(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(MAINOBJECT)
.PHONY: clean cleanall doxy test setsample setassignment definesample defineassignment assignmentfolder
clean:
rm -f $(PROGRAM) $(TEST) $(TESTOBJECT) $(MAINOBJECT) $(OBJS)
rm -rf $(BUILD_DIR)
rm -f *.o
cleanall: clean
rm -f index.html
rm -rf html
doxy:
$(DOXY)
rm -f index.html
ln -s html/index.html index.html
test: $(TEST)
./$(TEST)
cleantest: clean
clear
make test
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
$(BUILD_DIR)/%.o: %.c
$(CC) $(CCOPTIONS) -c -o $@ $<
#sets project as sample solution
setsample:
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name).sample $(name);)
#sets project as assignment
setassignment:
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name).assignment $(name);)
# defines current state of project as sample solution
definesample:
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name) $(name).sample;)
# defines current sate of project as assignment
defineassignment :
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name) $(name).assignment;)
# creates a folder which can serve as a publishable assignment
assignmentfolder:
make setassignment
make doxy
rm -rf ../assignment
mkdir ../assignment
cp -R * ../assignment
cp .gitignore ../assignment
rm ../assignment/*.sample
rm ../assignment/*.assignment
make cleanall
CC = gcc
CCLINK = g++
LIBS =
CCOPTIONS = -Wall -pedantic -std=gnu11 -g
LDOPTIONS =
BUILD_DIR = build
TEST = test_doubly_linked_list_with_iterator
PROGRAM = simple_doubly_linked_list_with_iterator
COMMON_HDRS = config.h general.h list.h list_iterator.h list_types.h
LIBRARY_FILES = shortcut allocator
ASSIGNMENT_HDRS =
ASSIGNMENT_FILES = doubly_linked_list_with_iterator
TEST_FILES = test_list
MAIN_DRIVER = list_main_driver
TEST_DRIVER = list_test_driver
LIBRARY_H = $(addsuffix .h, $(LIBRARY_FILES))
ASSIGNMENT_H = $(addsuffix .h, $(ASSIGNMENT_FILES)) $(ASSIGNMENT_HDRS)
ASSIGNMENT_C = $(addsuffix .c, $(ASSIGNMENT_FILES)) $(MAIN_DRIVER).c
HDRS = $(ASSIGNEMT_H) $(SHARED_HDRS) $(COMMON_HDRS) $(LIBRARY_H)
TESTOBJECT = $(addprefix $(BUILD_DIR)/, $(TEST_DRIVER).o)
MAINOBJECT = $(addprefix $(BUILD_DIR)/, $(MAIN_DRIVER).o)
LIBRARY_OBJS = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(LIBRARY_FILES)))
TEST_OBJS = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(TEST_FILES)))
MAIN_OBJ = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(ASSIGNMENT_FILES)))
OBJS = $(LIBRARY_OBJS) $(MAIN_OBJ) $(TEST_OBJS)
DOXY = doxygen
all: $(PROGRAM)
./$(PROGRAM)
$(TEST): $(BUILD_DIR) $(OBJS) $(TESTOBJECT)
$(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(TESTOBJECT)
$(PROGRAM): $(BUILD_DIR) $(OBJS) $(MAINOBJECT)
$(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(MAINOBJECT)
.PHONY: clean cleanall doxy test setsample setassignment definesample defineassignment assignmentfolder
clean:
rm -f $(PROGRAM) $(TEST) $(TESTOBJECT) $(MAINOBJECT) $(OBJS)
rm -rf $(BUILD_DIR)
rm -f *.o
cleanall: clean
rm -f index.html
rm -rf html
doxy:
$(DOXY)
rm -f index.html
ln -s html/index.html index.html
test: $(TEST)
./$(TEST)
cleantest: clean
clear
make test
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
$(BUILD_DIR)/%.o: %.c
$(CC) $(CCOPTIONS) -c -o $@ $<
#sets project as sample solution
setsample:
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name).sample $(name);)
#sets project as assignment
setassignment:
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name).assignment $(name);)
# defines current state of project as sample solution
definesample:
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name) $(name).sample;)
# defines current sate of project as assignment
defineassignment :
$(foreach name, $(ASSIGNMENT_H) $(ASSIGNMENT_C), cp $(name) $(name).assignment;)
# creates a folder which can serve as a publishable assignment
assignmentfolder:
make setassignment
make doxy
rm -rf ../assignment
mkdir ../assignment
cp -R * ../assignment
cp .gitignore ../assignment
rm ../assignment/*.sample
rm ../assignment/*.assignment
make cleanall

View file

@ -1,151 +1,151 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: shortcut.c
* Author: P. Bauer
* Date: November 08, 2010
* ----------------------------------------------------------
* Description:
* Test driver.
* ----------------------------------------------------------
*/
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "shortcut.h"
#define MAX_TEST_FUNCTIONS 256
static char assert_msg_buffer[1024];
static int tc_count = 0;
static int tc_fail_count = 0;
static struct TestCase test_cases[MAX_TEST_FUNCTIONS];
const char* version()
{
return "ShortCut v. 1.3.0";
}
char* format_msg(char* format, ...) {
va_list args;
va_start (args, format);
vsprintf(assert_msg_buffer, format, args);
return assert_msg_buffer;
}
void assert_true(bool bool_expr, struct TestCase *tc, const char *msg,
const char* file, int line)
{
if (!bool_expr) {
if (tc->success) {
tc->success = false;
tc_fail_count++;
}
printf("\n\tFailure (file: %s, line %d): %s: %s", file, line, tc->name, msg);
}
}
void assert_false(bool bool_expr, struct TestCase *tc, const char *msg,
const char* file, int line)
{
assert_true(!bool_expr, tc, msg, file, line);
}
static void assert_string_failure(const char *expected, char *actual, struct TestCase *tc,
const char *msg, const char* file, int line);
void assert_equals_str(const char *expected, char *actual, struct TestCase *tc,
const char *msg, const char* file, int line)
{
if (expected == actual) {
return;
}
if (expected == 0 || actual == 0) {
assert_string_failure(expected, actual, tc, msg, file, line);
return;
}
if (strcmp(actual, expected) != 0) {
assert_string_failure(expected, actual, tc, msg, file, line);
return;
}
}
#define MAX_MSG_LEN 128
static void assert_string_failure(const char *expected, char *actual, struct TestCase *tc,
const char *msg, const char* file, int line)
{
char new_msg[MAX_MSG_LEN];
sprintf(new_msg, "Expected \"%s\", actual \"%s\". %s", expected, actual, msg);
assert_true(false, tc, new_msg, file, line);
}
void assert_equals(int expected, int actual, struct TestCase *tc,
const char *msg, const char* file, int line)
{
char new_msg[MAX_MSG_LEN];
sprintf(new_msg, "Expected %d, actual %d. %s", expected, actual, msg);
assert_true(expected == actual, tc, new_msg, file, line);
}
void assert_equals_f(double expected, double actual, double tolerance, struct TestCase* tc,
const char* msg, const char* file, int line)
{
char new_msg[MAX_MSG_LEN];
sprintf(new_msg, "Expected %f, actual %f. %s", expected, actual, msg);
double min_val = expected - tolerance;
double max_val = expected + tolerance;
assert_true(min_val <= actual && actual <= max_val, tc, new_msg, file, line);
}
int get_test_count()
{
return tc_count;
}
bool add_test(void (*test_function)(struct TestCase *tc), const char *test_name)
{
if (tc_count == MAX_TEST_FUNCTIONS) {
return false;
}
else {
test_cases[tc_count].success = true;
test_cases[tc_count].name = test_name;
test_cases[tc_count].test_function = test_function;
tc_count++;
return true;
}
}
void run_tests()
{
int i;
printf("\n%s: Running tests\n", version());
for (i = 0; i < get_test_count(); i++) {
printf("Running test %s ...", test_cases[i].name);
test_cases[i].test_function(&test_cases[i]);
if (test_cases[i].success) {
printf("\033[32m OK\033[m");
}
else {
printf("\033[31m ... FAIL\033[m");
}
printf("\n");
}
printf("\nTotal tests run: %d\n", tc_count);
if (tc_fail_count > 0) {
printf("\033[31mTests failed: %d\033[m\n", tc_fail_count);
}
else {
printf("\033[32mAll tests run successfully\033[m\n");
}
}
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: shortcut.c
* Author: P. Bauer
* Date: November 08, 2010
* ----------------------------------------------------------
* Description:
* Test driver.
* ----------------------------------------------------------
*/
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "shortcut.h"
#define MAX_TEST_FUNCTIONS 256
static char assert_msg_buffer[1024];
static int tc_count = 0;
static int tc_fail_count = 0;
static struct TestCase test_cases[MAX_TEST_FUNCTIONS];
const char* version()
{
return "ShortCut v. 1.3.0";
}
char* format_msg(char* format, ...) {
va_list args;
va_start (args, format);
vsprintf(assert_msg_buffer, format, args);
return assert_msg_buffer;
}
void assert_true(bool bool_expr, struct TestCase *tc, const char *msg,
const char* file, int line)
{
if (!bool_expr) {
if (tc->success) {
tc->success = false;
tc_fail_count++;
}
printf("\n\tFailure (file: %s, line %d): %s: %s", file, line, tc->name, msg);
}
}
void assert_false(bool bool_expr, struct TestCase *tc, const char *msg,
const char* file, int line)
{
assert_true(!bool_expr, tc, msg, file, line);
}
static void assert_string_failure(const char *expected, char *actual, struct TestCase *tc,
const char *msg, const char* file, int line);
void assert_equals_str(const char *expected, char *actual, struct TestCase *tc,
const char *msg, const char* file, int line)
{
if (expected == actual) {
return;
}
if (expected == 0 || actual == 0) {
assert_string_failure(expected, actual, tc, msg, file, line);
return;
}
if (strcmp(actual, expected) != 0) {
assert_string_failure(expected, actual, tc, msg, file, line);
return;
}
}
#define MAX_MSG_LEN 128
static void assert_string_failure(const char *expected, char *actual, struct TestCase *tc,
const char *msg, const char* file, int line)
{
char new_msg[MAX_MSG_LEN];
sprintf(new_msg, "Expected \"%s\", actual \"%s\". %s", expected, actual, msg);
assert_true(false, tc, new_msg, file, line);
}
void assert_equals(int expected, int actual, struct TestCase *tc,
const char *msg, const char* file, int line)
{
char new_msg[MAX_MSG_LEN];
sprintf(new_msg, "Expected %d, actual %d. %s", expected, actual, msg);
assert_true(expected == actual, tc, new_msg, file, line);
}
void assert_equals_f(double expected, double actual, double tolerance, struct TestCase* tc,
const char* msg, const char* file, int line)
{
char new_msg[MAX_MSG_LEN];
sprintf(new_msg, "Expected %f, actual %f. %s", expected, actual, msg);
double min_val = expected - tolerance;
double max_val = expected + tolerance;
assert_true(min_val <= actual && actual <= max_val, tc, new_msg, file, line);
}
int get_test_count()
{
return tc_count;
}
bool add_test(void (*test_function)(struct TestCase *tc), const char *test_name)
{
if (tc_count == MAX_TEST_FUNCTIONS) {
return false;
}
else {
test_cases[tc_count].success = true;
test_cases[tc_count].name = test_name;
test_cases[tc_count].test_function = test_function;
tc_count++;
return true;
}
}
void run_tests()
{
int i;
printf("\n%s: Running tests\n", version());
for (i = 0; i < get_test_count(); i++) {
printf("Running test %s ...", test_cases[i].name);
test_cases[i].test_function(&test_cases[i]);
if (test_cases[i].success) {
printf("\033[32m OK\033[m");
}
else {
printf("\033[31m ... FAIL\033[m");
}
printf("\n");
}
printf("\nTotal tests run: %d\n", tc_count);
if (tc_fail_count > 0) {
printf("\033[31mTests failed: %d\033[m\n", tc_fail_count);
}
else {
printf("\033[32mAll tests run successfully\033[m\n");
}
}

View file

@ -1,110 +1,110 @@
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: shortcut
* Author: P. Bauer
* Date: November 03, 2010
* ----------------------------------------------------------
* Description:
* A simple unit testing frame work for C.
* ----------------------------------------------------------
*/
#ifndef ___SHORTCUT_H
#define ___SHORTCUT_H
#include <stdbool.h>
/** TestCase is the struct to define one test case. A test case can
*** be added to a test. If the test is run all added test cases are
*** run and the result of the run of each test case is checked automatically.
*/
struct TestCase {
const char *name;
/** true if the test passed, false otherwise. */
bool success;
/** The test function which is executed by the test framework. */
void (*test_function)(struct TestCase *tc);
};
/**
*** @return Version of shortcut as string
***/
const char* version();
/**
*** @return The fromated string as generated using sprintf(format, ...)
***/
char* format_msg(char* format, ...);
/** assert_true checks, whether a boolean expression passed is true or false.
*** in case it is false the test case stating the assertion is marked
*** as failed and msg is printed.
*** @param bool_expr Expression which is evaluated.
*** @param tc Pointer to the test case which states this assertion.
*** @param msg Message to be printed if assertion evaluates to false.
*** @param file File in which the assert is given.
*** @param line Line in which the assert is given.
*/
void assert_true(bool bool_expr, struct TestCase *tc, const char *msg,
const char* file, int line);
/** assert_false does the same as assert() but the boolean expression
*** has to evaluate to false. If it evaluates to true the assertion
*** fails.
*** @see assert
*/
void assert_false(bool bool_expr, struct TestCase* tc, const char* msg,
const char* file, int line);
/** assert_equals checks whether two values are equal. Currently the following
*** data formats are supported:
*** - strings
*** - integer
*** @param expected The expected string value
*** @param actual The actual string value
*** @param tc Pointer to the test case which states this assertion.
*** @param msg Message to be printed if assertion evaluates to false.
*** @param file File in which the assert is given.
*** @param line Line in which the assert is given.
*** @see assert
*/
void assert_equals(int expected, int actual, struct TestCase* tc,
const char* msg, const char* file, int line);
void assert_equals_str(const char* expected, char* actual, struct TestCase* tc,
const char* msg, const char* file, int line);
void assert_equals_f(double expected, double actual, double tolerance, struct TestCase* tc,
const char* msg, const char* file, int line);
/** @return The total number of test cases added to the test.
*/
int get_test_count();
/** add_test creates a new test case and adds the a test function to
*** this test case.
*** @param test_function Pointer to the test function to be added
*** to the newly created test case.
*** @param test_case_name Name which should be assigned to the newly
*** created test case.
*/
bool add_test(void (*test_function)(struct TestCase *tc), const char *test_case_name);
void run_tests();
#define TEST(testname) void testname(struct TestCase *tc)
#define MSG(format, ...) format_msg(format, ##__VA_ARGS__)
#define ASSERT_TRUE(condition, msg) assert_true(condition, tc, msg, __FILE__, __LINE__)
#define ASSERT_FALSE(condition, msg) assert_false(condition, tc, msg, __FILE__, __LINE__)
#define ASSERT_EQUALS(expected, actual) assert_equals(expected, actual, tc, "", __FILE__, __LINE__)
#define ASSERT_EQUALS_STR(expected, actual) assert_equals_str(expected, actual, tc, "", __FILE__, __LINE__)
#define ASSERT_EQUALS_TOLERANCE(expected, actual, tolerance) assert_equals_f(expected, actual, tolerance, tc, "", __FILE__, __LINE__)
#define ADD_TEST(testfunction) add_test(testfunction, #testfunction)
#endif
/*----------------------------------------------------------
* HTBLA-Leonding
* ---------------------------------------------------------
* Title: shortcut
* Author: P. Bauer
* Date: November 03, 2010
* ----------------------------------------------------------
* Description:
* A simple unit testing frame work for C.
* ----------------------------------------------------------
*/
#ifndef ___SHORTCUT_H
#define ___SHORTCUT_H
#include <stdbool.h>
/** TestCase is the struct to define one test case. A test case can
*** be added to a test. If the test is run all added test cases are
*** run and the result of the run of each test case is checked automatically.
*/
struct TestCase {
const char *name;
/** true if the test passed, false otherwise. */
bool success;
/** The test function which is executed by the test framework. */
void (*test_function)(struct TestCase *tc);
};
/**
*** @return Version of shortcut as string
***/
const char* version();
/**
*** @return The fromated string as generated using sprintf(format, ...)
***/
char* format_msg(char* format, ...);
/** assert_true checks, whether a boolean expression passed is true or false.
*** in case it is false the test case stating the assertion is marked
*** as failed and msg is printed.
*** @param bool_expr Expression which is evaluated.
*** @param tc Pointer to the test case which states this assertion.
*** @param msg Message to be printed if assertion evaluates to false.
*** @param file File in which the assert is given.
*** @param line Line in which the assert is given.
*/
void assert_true(bool bool_expr, struct TestCase *tc, const char *msg,
const char* file, int line);
/** assert_false does the same as assert() but the boolean expression
*** has to evaluate to false. If it evaluates to true the assertion
*** fails.
*** @see assert
*/
void assert_false(bool bool_expr, struct TestCase* tc, const char* msg,
const char* file, int line);
/** assert_equals checks whether two values are equal. Currently the following
*** data formats are supported:
*** - strings
*** - integer
*** @param expected The expected string value
*** @param actual The actual string value
*** @param tc Pointer to the test case which states this assertion.
*** @param msg Message to be printed if assertion evaluates to false.
*** @param file File in which the assert is given.
*** @param line Line in which the assert is given.
*** @see assert
*/
void assert_equals(int expected, int actual, struct TestCase* tc,
const char* msg, const char* file, int line);
void assert_equals_str(const char* expected, char* actual, struct TestCase* tc,
const char* msg, const char* file, int line);
void assert_equals_f(double expected, double actual, double tolerance, struct TestCase* tc,
const char* msg, const char* file, int line);
/** @return The total number of test cases added to the test.
*/
int get_test_count();
/** add_test creates a new test case and adds the a test function to
*** this test case.
*** @param test_function Pointer to the test function to be added
*** to the newly created test case.
*** @param test_case_name Name which should be assigned to the newly
*** created test case.
*/
bool add_test(void (*test_function)(struct TestCase *tc), const char *test_case_name);
void run_tests();
#define TEST(testname) void testname(struct TestCase *tc)
#define MSG(format, ...) format_msg(format, ##__VA_ARGS__)
#define ASSERT_TRUE(condition, msg) assert_true(condition, tc, msg, __FILE__, __LINE__)
#define ASSERT_FALSE(condition, msg) assert_false(condition, tc, msg, __FILE__, __LINE__)
#define ASSERT_EQUALS(expected, actual) assert_equals(expected, actual, tc, "", __FILE__, __LINE__)
#define ASSERT_EQUALS_STR(expected, actual) assert_equals_str(expected, actual, tc, "", __FILE__, __LINE__)
#define ASSERT_EQUALS_TOLERANCE(expected, actual, tolerance) assert_equals_f(expected, actual, tolerance, tc, "", __FILE__, __LINE__)
#define ADD_TEST(testfunction) add_test(testfunction, #testfunction)
#endif

File diff suppressed because it is too large Load diff

View file

@ -1,113 +1,113 @@
/*----------------------------------------------------------
* HTBLA-Leonding / Klasse: n/a
* ---------------------------------------------------------
* Title: Unit Tests for a List implementation
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Tests functions of a list.
* ----------------------------------------------------------
*/
#ifndef ___TEST_LIST_H
#define ___TEST_LIST_H
#include "shortcut.h"
TEST(test_list_obtain__shall_allocate_a_list);
TEST(test_list_obtain__shall_allocate_a_fresh_list);
TEST(test_list_obtain__shall_allocate_a_different_list);
TEST(test_list_obtain_failed__shall_not_allocate_a_list);
TEST(test_list_release__shall_release_a_valid_empty_list);
TEST(test_list_release__shall_release_a_valid_filled_list);
TEST(test_list_release__shall_ignore_release_of_an_invalid_list);
TEST(test_list_is_valid__shall_be_true_for_valid_list);
TEST(test_list_is_valid__shall_be_false_for_invalid_list);
TEST(test_list_insert__shall_add_one_value_to_empty_list);
TEST(test_list_insert__shall_add_multiple_values);
TEST(test_list_insert__shall_ignore_invalid_list);
TEST(test_list_remove__shall_not_remove_from_empty_list);
TEST(test_list_remove__shall_remove_only_value);
TEST(test_list_remove__shall_remove_one_value);
TEST(test_list_remove__shall_remove_first_value);
TEST(test_list_remove__shall_remove_value_in_the_middle);
TEST(test_list_remove__shall_remove_value_at_the_end);
TEST(test_list_remove__shall_not_remove_missing_value);
TEST(test_list_remove_all__shall_not_remove_from_empty_list);
TEST(test_list_remove_all__shall_remove_only_value);
TEST(test_list_remove_all__shall_remove_all_values);
TEST(test_list_remove_all__shall_remove_one_value);
TEST(test_list_remove_all__shall_remove_all_values_in_a_row);
TEST(test_list_remove_all__shall_remove_all_distributed_values);
TEST(test_list_remove_all__shall_not_remove_missing_value);
TEST(test_list_remove_all__shall_ignore_invalid_list);
TEST(test_list_insert_at__shall_insert_single_value_in_empty_list);
TEST(test_list_insert_at__shall_insert_value_at_the_beginning);
TEST(test_list_insert_at__shall_insert_value_in_the_middle);
TEST(test_list_insert_at__shall_insert_value_at_the_end);
TEST(test_list_insert_at__shall_insert_value_after_the_end);
TEST(test_list_insert_at__shall_ignore_invalid_list);
TEST(test_list_remove_at__shall_not_remove_from_empty_list);
TEST(test_list_remove_at__shall_remove_value_at_the_beginning);
TEST(test_list_remove_at__shall_remove_value_in_the_middle);
TEST(test_list_remove_at__shall_not_remove_from_empty_list);
TEST(test_list_remove_at__shall_remove_value_at_the_end);
TEST(test_list_remove_at__shall_not_remove_value_after_the_end);
TEST(test_list_remove_at__shall_ignore_invalid_list);
TEST(test_list_clear__shall_clear_empty_list);
TEST(test_list_clear__shall_clear_list_with_one_value);
TEST(test_list_clear__shall_clear_list_with_multiple_values);
TEST(test_list_clear__shall_ingore_invalid_list);
TEST(test_list_is_empty__shall_be_true__for_newly_obtained_list);
TEST(test_list_is_empty__shall_be_false__after_adding_values);
TEST(test_list_is_empty__shall_be_true_for_invalid_list);
TEST(test_list_get_size__shall_be_0_for_newly_obtained_list);
TEST(test_list_get_size__shall_reflect_number_of_values_after_adding_values);
TEST(test_list_get_size__shall_reflect_number_of_values_after_removing_values);
TEST(test_list_get_size__shall_be_0_after_clear);
TEST(test_list_get_size__shall_be_0_for_invalid_list);
TEST(test_list_contains__shall_be_false_for_empty_list);
TEST(test_list_contains__shall_be_true_for_one_value);
TEST(test_list_contains__shall_be_true_for_multiple_values);
TEST(test_list_contains__shall_be_false_form_missing_value);
TEST(test_list_contains__shall_be_false_for_invalid_list);
TEST(test_list_get_at__shall_return_0_for_empty_list);
TEST(test_list_get_at__shall_return_single_value);
TEST(test_list_get_at__shall_return_first_value);
TEST(test_list_get_at__shall_return_values_in_added_order);
TEST(test_list_get_at__shall_return_0_for_invalid_list);
TEST(test_list_append__shall_append_empty_list_to_empty_list);
TEST(test_list_append__shall_append_filled_list_to_empty_list);
TEST(test_list_append__shall_append_empty_list_to_filled_list);
TEST(test_list_append__shall_append_filled_list_to_filled_list);
TEST(test_list_append__shall_ignore_invalid_lists);
TEST(test_list_it_obtain__shall_allocate_and_release_a_list_iterator_for_a_list);
TEST(test_list_it_obtain__shall_allocate_and_point_to_list_head);
TEST(test_list_it_obtain__shall_not_allocate_a_list_iterator_for_an_invalid_list);
TEST(test_list_it_is_valid);
TEST(test_list_it_is_valid__shall_be_invalid_for_0_iterator);
TEST(test_list_it_is_valid__shall_be_invalid_for_empty_list);
TEST(test_list_it_next__shall_move_to_next);
TEST(test_list_it_next__shall_return_false_for_invalid_it);
TEST(test_list_it_next__shall_move_to_previous);
TEST(test_list_it_previous_shall_return_false_for_invalid_it);
TEST(test_list_it_set_get__shall_modify_value);
TEST(test_list_it_get__shall_return_0_for_invalid_iterator);
TEST(test_list_it_set__shall_ignore_call_for_invalid_iterator);
#endif
/*----------------------------------------------------------
* HTBLA-Leonding / Klasse: n/a
* ---------------------------------------------------------
* Title: Unit Tests for a List implementation
* Author: S. Schraml
* ----------------------------------------------------------
* Description:
* Tests functions of a list.
* ----------------------------------------------------------
*/
#ifndef ___TEST_LIST_H
#define ___TEST_LIST_H
#include "shortcut.h"
TEST(test_list_obtain__shall_allocate_a_list);
TEST(test_list_obtain__shall_allocate_a_fresh_list);
TEST(test_list_obtain__shall_allocate_a_different_list);
TEST(test_list_obtain_failed__shall_not_allocate_a_list);
TEST(test_list_release__shall_release_a_valid_empty_list);
TEST(test_list_release__shall_release_a_valid_filled_list);
TEST(test_list_release__shall_ignore_release_of_an_invalid_list);
TEST(test_list_is_valid__shall_be_true_for_valid_list);
TEST(test_list_is_valid__shall_be_false_for_invalid_list);
TEST(test_list_insert__shall_add_one_value_to_empty_list);
TEST(test_list_insert__shall_add_multiple_values);
TEST(test_list_insert__shall_ignore_invalid_list);
TEST(test_list_remove__shall_not_remove_from_empty_list);
TEST(test_list_remove__shall_remove_only_value);
TEST(test_list_remove__shall_remove_one_value);
TEST(test_list_remove__shall_remove_first_value);
TEST(test_list_remove__shall_remove_value_in_the_middle);
TEST(test_list_remove__shall_remove_value_at_the_end);
TEST(test_list_remove__shall_not_remove_missing_value);
TEST(test_list_remove_all__shall_not_remove_from_empty_list);
TEST(test_list_remove_all__shall_remove_only_value);
TEST(test_list_remove_all__shall_remove_all_values);
TEST(test_list_remove_all__shall_remove_one_value);
TEST(test_list_remove_all__shall_remove_all_values_in_a_row);
TEST(test_list_remove_all__shall_remove_all_distributed_values);
TEST(test_list_remove_all__shall_not_remove_missing_value);
TEST(test_list_remove_all__shall_ignore_invalid_list);
TEST(test_list_insert_at__shall_insert_single_value_in_empty_list);
TEST(test_list_insert_at__shall_insert_value_at_the_beginning);
TEST(test_list_insert_at__shall_insert_value_in_the_middle);
TEST(test_list_insert_at__shall_insert_value_at_the_end);
TEST(test_list_insert_at__shall_insert_value_after_the_end);
TEST(test_list_insert_at__shall_ignore_invalid_list);
TEST(test_list_remove_at__shall_not_remove_from_empty_list);
TEST(test_list_remove_at__shall_remove_value_at_the_beginning);
TEST(test_list_remove_at__shall_remove_value_in_the_middle);
TEST(test_list_remove_at__shall_not_remove_from_empty_list);
TEST(test_list_remove_at__shall_remove_value_at_the_end);
TEST(test_list_remove_at__shall_not_remove_value_after_the_end);
TEST(test_list_remove_at__shall_ignore_invalid_list);
TEST(test_list_clear__shall_clear_empty_list);
TEST(test_list_clear__shall_clear_list_with_one_value);
TEST(test_list_clear__shall_clear_list_with_multiple_values);
TEST(test_list_clear__shall_ingore_invalid_list);
TEST(test_list_is_empty__shall_be_true__for_newly_obtained_list);
TEST(test_list_is_empty__shall_be_false__after_adding_values);
TEST(test_list_is_empty__shall_be_true_for_invalid_list);
TEST(test_list_get_size__shall_be_0_for_newly_obtained_list);
TEST(test_list_get_size__shall_reflect_number_of_values_after_adding_values);
TEST(test_list_get_size__shall_reflect_number_of_values_after_removing_values);
TEST(test_list_get_size__shall_be_0_after_clear);
TEST(test_list_get_size__shall_be_0_for_invalid_list);
TEST(test_list_contains__shall_be_false_for_empty_list);
TEST(test_list_contains__shall_be_true_for_one_value);
TEST(test_list_contains__shall_be_true_for_multiple_values);
TEST(test_list_contains__shall_be_false_form_missing_value);
TEST(test_list_contains__shall_be_false_for_invalid_list);
TEST(test_list_get_at__shall_return_0_for_empty_list);
TEST(test_list_get_at__shall_return_single_value);
TEST(test_list_get_at__shall_return_first_value);
TEST(test_list_get_at__shall_return_values_in_added_order);
TEST(test_list_get_at__shall_return_0_for_invalid_list);
TEST(test_list_append__shall_append_empty_list_to_empty_list);
TEST(test_list_append__shall_append_filled_list_to_empty_list);
TEST(test_list_append__shall_append_empty_list_to_filled_list);
TEST(test_list_append__shall_append_filled_list_to_filled_list);
TEST(test_list_append__shall_ignore_invalid_lists);
TEST(test_list_it_obtain__shall_allocate_and_release_a_list_iterator_for_a_list);
TEST(test_list_it_obtain__shall_allocate_and_point_to_list_head);
TEST(test_list_it_obtain__shall_not_allocate_a_list_iterator_for_an_invalid_list);
TEST(test_list_it_is_valid);
TEST(test_list_it_is_valid__shall_be_invalid_for_0_iterator);
TEST(test_list_it_is_valid__shall_be_invalid_for_empty_list);
TEST(test_list_it_next__shall_move_to_next);
TEST(test_list_it_next__shall_return_false_for_invalid_it);
TEST(test_list_it_next__shall_move_to_previous);
TEST(test_list_it_previous_shall_return_false_for_invalid_it);
TEST(test_list_it_set_get__shall_modify_value);
TEST(test_list_it_get__shall_return_0_for_invalid_iterator);
TEST(test_list_it_set__shall_ignore_call_for_invalid_iterator);
#endif