This commit is contained in:
MarcUs7i 2025-03-18 18:26:12 +01:00
parent 2c61e2daba
commit ae50527f75
38 changed files with 7018 additions and 7018 deletions

170
.gitignore vendored
View file

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

3130
Doxyfile

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/YyHKtxam) [![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/YyHKtxam)
### if.04.22 Procedural Programming ### if.04.22 Procedural Programming
# Assignment Lists # Assignment Lists
## Simple Singly Linked List ## Simple Singly Linked List
With this assignment you shall implement abstract data types for a list in C.\n With this assignment you shall implement abstract data types for a list in C.\n
Clone this assignment, open the index.html, read the assignment instructions and try to make all unit tests green. 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 * HTBLA-Leonding
* --------------------------------------------------------- * ---------------------------------------------------------
* Title: Allocator for lists and list elements. * Title: Allocator for lists and list elements.
* Author: S. Schraml * Author: S. Schraml
* ---------------------------------------------------------- * ----------------------------------------------------------
* Description: * Description:
* Implementation of memory allocation functions. * Implementation of memory allocation functions.
* ---------------------------------------------------------- * ----------------------------------------------------------
*/ */
#include "allocator.h" #include "allocator.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "shortcut.h" #include "shortcut.h"
/* ===================================================================== */ /* ===================================================================== */
/* Private memory allocation functions */ /* Private memory allocation functions */
#define MAX_BLOCK_CNT 64 #define MAX_BLOCK_CNT 64
struct MemAllocStat { struct MemAllocStat {
bool block_alloc_calls; bool block_alloc_calls;
int alloc_call_cnt; int alloc_call_cnt;
int free_call_cnt; int free_call_cnt;
int mem_block_cnt; int mem_block_cnt;
void* mem_blocks[MAX_BLOCK_CNT]; void* mem_blocks[MAX_BLOCK_CNT];
}; };
static struct MemAllocStat mem_stat = {false, 0, 0, 0, {0}}; static struct MemAllocStat mem_stat = {false, 0, 0, 0, {0}};
void mem_reset_calls() { void mem_reset_calls() {
mem_stat.block_alloc_calls = false; mem_stat.block_alloc_calls = false;
mem_stat.alloc_call_cnt = 0; mem_stat.alloc_call_cnt = 0;
mem_stat.free_call_cnt = 0; mem_stat.free_call_cnt = 0;
} }
void mem_reset_stat() { void mem_reset_stat() {
mem_reset_calls(); mem_reset_calls();
memset(mem_stat.mem_blocks, 0, MAX_BLOCK_CNT * sizeof(void*)); memset(mem_stat.mem_blocks, 0, MAX_BLOCK_CNT * sizeof(void*));
mem_stat.mem_block_cnt = 0; mem_stat.mem_block_cnt = 0;
} }
static int mem_get_alloc_idx(void* p) { static int mem_get_alloc_idx(void* p) {
if (p == 0) { if (p == 0) {
return MAX_BLOCK_CNT; return MAX_BLOCK_CNT;
} }
int idx = 0; int idx = 0;
for (; idx < MAX_BLOCK_CNT && p != mem_stat.mem_blocks[idx]; idx++); for (; idx < MAX_BLOCK_CNT && p != mem_stat.mem_blocks[idx]; idx++);
return idx; return idx;
} }
bool mem_is_allocated(void* p) { bool mem_is_allocated(void* p) {
return mem_get_alloc_idx(p) < MAX_BLOCK_CNT; return mem_get_alloc_idx(p) < MAX_BLOCK_CNT;
} }
void mem_block_allocs(bool block) { void mem_block_allocs(bool block) {
mem_stat.block_alloc_calls = block; mem_stat.block_alloc_calls = block;
} }
int mem_get_alloc_call_cnt() { int mem_get_alloc_call_cnt() {
return mem_stat.alloc_call_cnt; return mem_stat.alloc_call_cnt;
} }
int mem_get_free_call_cnt() { int mem_get_free_call_cnt() {
return mem_stat.free_call_cnt; return mem_stat.free_call_cnt;
} }
int mem_get_allocated_block_cnt() { int mem_get_allocated_block_cnt() {
return mem_stat.mem_block_cnt; return mem_stat.mem_block_cnt;
} }
/* ===================================================================== */ /* ===================================================================== */
void* alloc_mem(size_t size) { void* alloc_mem(size_t size) {
void* p = 0; void* p = 0;
mem_stat.alloc_call_cnt++; mem_stat.alloc_call_cnt++;
if (!mem_stat.block_alloc_calls) { if (!mem_stat.block_alloc_calls) {
p = malloc(size); p = malloc(size);
if (p != 0) { if (p != 0) {
int idx = 0; int idx = 0;
for (; idx < MAX_BLOCK_CNT && mem_stat.mem_blocks[idx] != 0; idx++); for (; idx < MAX_BLOCK_CNT && mem_stat.mem_blocks[idx] != 0; idx++);
if (idx < MAX_BLOCK_CNT) { if (idx < MAX_BLOCK_CNT) {
mem_stat.mem_blocks[idx] = p; mem_stat.mem_blocks[idx] = p;
mem_stat.mem_block_cnt++; mem_stat.mem_block_cnt++;
} else { } else {
free(p); free(p);
p = 0; p = 0;
} }
} }
} }
return p; return p;
} }
void free_mem(void* p_mem) { void free_mem(void* p_mem) {
mem_stat.free_call_cnt++; mem_stat.free_call_cnt++;
if(p_mem == 0) { if(p_mem == 0) {
printf("\tFailure: Freeing 0 (NULL)\n"); printf("\tFailure: Freeing 0 (NULL)\n");
} else { } else {
int mem_block_idx = mem_get_alloc_idx(p_mem); int mem_block_idx = mem_get_alloc_idx(p_mem);
if(mem_block_idx >= MAX_BLOCK_CNT) { if(mem_block_idx >= MAX_BLOCK_CNT) {
printf("\tFailure: Freeing memory that is not allocated [%p]\n", p_mem); printf("\tFailure: Freeing memory that is not allocated [%p]\n", p_mem);
} else { } else {
mem_stat.mem_blocks[mem_block_idx] = 0; mem_stat.mem_blocks[mem_block_idx] = 0;
mem_stat.mem_block_cnt--; mem_stat.mem_block_cnt--;
} }
} }
free(p_mem); free(p_mem);
} }

View file

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

View file

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

View file

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

View file

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

File diff suppressed because it is too large Load diff

View file

@ -1,14 +1,14 @@
code { code {
background: #eaeaea; background: #eaeaea;
padding: 0 0.3em; padding: 0 0.3em;
border-radius: 4px; border-radius: 4px;
} }
div.fragment { div.fragment {
padding: 0.5em; padding: 0.5em;
border-radius: 4px; border-radius: 4px;
margin: 1em 0; margin: 1em 0;
} }
div.line { div.line {
line-height: 1.4; 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. @licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT) The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software 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, 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, 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 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: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software. substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 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 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, 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, 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. 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 @licend The above is the entire license notice for the JavaScript code in this file
*/ */
function toggleVisibility(linkObj) function toggleVisibility(linkObj)
{ {
var base = $(linkObj).attr('id'); var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary'); var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content'); var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger'); var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src'); var src=$(trigger).attr('src');
if (content.is(':visible')===true) { if (content.is(':visible')===true) {
content.hide(); content.hide();
summary.show(); summary.show();
$(linkObj).addClass('closed').removeClass('opened'); $(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else { } else {
content.show(); content.show();
summary.hide(); summary.hide();
$(linkObj).removeClass('closed').addClass('opened'); $(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
} }
return false; return false;
} }
function updateStripes() function updateStripes()
{ {
$('table.directory tr'). $('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even'); removeClass('even').filter(':visible:even').addClass('even');
} }
function toggleLevel(level) function toggleLevel(level)
{ {
$('table.directory tr').each(function() { $('table.directory tr').each(function() {
var l = this.id.split('_').length-1; var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3)); var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3)); var a = $('#arr'+this.id.substring(3));
if (l<level+1) { if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen'); i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;'); a.html('&#9660;');
$(this).show(); $(this).show();
} else if (l==level+1) { } else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;'); a.html('&#9658;');
$(this).show(); $(this).show();
} else { } else {
$(this).hide(); $(this).hide();
} }
}); });
updateStripes(); updateStripes();
} }
function toggleFolder(id) function toggleFolder(id)
{ {
// the clicked row // the clicked row
var currentRow = $('#row_'+id); var currentRow = $('#row_'+id);
// all rows after the clicked row // all rows after the clicked row
var rows = currentRow.nextAll("tr"); var rows = currentRow.nextAll("tr");
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
// only match elements AFTER this one (can't hide elements before) // only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); }); var childRows = rows.filter(function() { return this.id.match(re); });
// first row is visible we are HIDING // first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) { if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row // replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span"); var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;'); currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING } else { // we are SHOWING
// replace right arrow by down arrow for current row // replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span"); var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen"); currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;'); currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows // replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span"); var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;'); childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children childRows.show(); //show all children
} }
updateStripes(); updateStripes();
} }
function toggleInherit(id) function toggleInherit(id)
{ {
var rows = $('tr.inherit.'+id); var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img'); var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src'); var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) { if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none'); rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png'); $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else { } else {
rows.css('display','table-row'); // using show() causes jump in firefox rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png'); $(img).attr('src',src.substring(0,src.length-10)+'open.png');
} }
} }
/* @license-end */ /* @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"> <!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"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/> <meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Simple Singly Linked List: File List</title> <title>Simple Singly Linked List: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script> <script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/> <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/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script> <script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/> <link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea"> <div id="titlearea">
<table cellspacing="0" cellpadding="0"> <table cellspacing="0" cellpadding="0">
<tbody> <tbody>
<tr style="height: 56px;"> <tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;"> <td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Simple Singly Linked List <div id="projectname">Simple Singly Linked List
</div> </div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- end header part --> <!-- end header part -->
<!-- Generated by Doxygen 1.8.18 --> <!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search'); var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */ /* @license-end */
</script> </script>
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() { $(function() {
initMenu('',true,false,'search.php','Search'); initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); }); $(document).ready(function() { init_search(); });
}); });
/* @license-end */</script> /* @license-end */</script>
<div id="main-nav"></div> <div id="main-nav"></div>
</div><!-- top --> </div><!-- top -->
<!-- window showing the filter options --> <!-- window showing the filter options -->
<div id="MSearchSelectWindow" <div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()" onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()" onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)"> onkeydown="return searchBox.OnSearchSelectKey(event)">
</div> </div>
<!-- iframe showing the search results (closed by default) --> <!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow"> <div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" <iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults"> name="MSearchResults" id="MSearchResults">
</iframe> </iframe>
</div> </div>
<div class="header"> <div class="header">
<div class="headertitle"> <div class="headertitle">
<div class="title">File List</div> </div> <div class="title">File List</div> </div>
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory"> <div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
<table 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> <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> </table>
</div><!-- directory --> </div><!-- directory -->
</div><!-- contents --> </div><!-- contents -->
<!-- start footer part --> <!-- start footer part -->
<hr class="footer"/><address class="footer"><small> <hr class="footer"/><address class="footer"><small>
Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html"> Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/> <img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18 </a> 1.8.18
</small></address> </small></address>
</body> </body>
</html> </html>

View file

@ -1,111 +1,111 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!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"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/> <meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Simple Singly Linked List: Main Page</title> <title>Simple Singly Linked List: Main Page</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script> <script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/> <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/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script> <script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/> <link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea"> <div id="titlearea">
<table cellspacing="0" cellpadding="0"> <table cellspacing="0" cellpadding="0">
<tbody> <tbody>
<tr style="height: 56px;"> <tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;"> <td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Simple Singly Linked List <div id="projectname">Simple Singly Linked List
</div> </div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- end header part --> <!-- end header part -->
<!-- Generated by Doxygen 1.8.18 --> <!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search'); var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */ /* @license-end */
</script> </script>
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() { $(function() {
initMenu('',true,false,'search.php','Search'); initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); }); $(document).ready(function() { init_search(); });
}); });
/* @license-end */</script> /* @license-end */</script>
<div id="main-nav"></div> <div id="main-nav"></div>
</div><!-- top --> </div><!-- top -->
<!-- window showing the filter options --> <!-- window showing the filter options -->
<div id="MSearchSelectWindow" <div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()" onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()" onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)"> onkeydown="return searchBox.OnSearchSelectKey(event)">
</div> </div>
<!-- iframe showing the search results (closed by default) --> <!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow"> <div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" <iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults"> name="MSearchResults" id="MSearchResults">
</iframe> </iframe>
</div> </div>
<div class="PageDoc"><div class="header"> <div class="PageDoc"><div class="header">
<div class="headertitle"> <div class="headertitle">
<div class="title">Simple Singly Linked List Documentation</div> </div> <div class="title">Simple Singly Linked List Documentation</div> </div>
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<div class="textblock"><h1><a class="anchor" id="intro"></a> <div class="textblock"><h1><a class="anchor" id="intro"></a>
Introduction</h1> Introduction</h1>
<p>The implementation of a "Simple Singly Linked List".</p> <p>The implementation of a "Simple Singly Linked List".</p>
<h1><a class="anchor" id="objective"></a> <h1><a class="anchor" id="objective"></a>
Assignment Objective</h1> Assignment Objective</h1>
<p>In this assignment an Abstract Data Type of a "Simple Singly Linked List" shall be implemented against the defined common interface of a list. This interface is declared within file 'list.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>In this assignment an Abstract Data Type of a "Simple Singly Linked List" shall be implemented against the defined common interface of a list. This interface is declared within file 'list.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 term 'simple' in 'Simple Singly Linked List' refers to the limited members of the list data: the pointer to the list head node is the only member of list data.</p> <p>The term 'simple' in 'Simple Singly Linked List' refers to the limited members of the list data: the pointer to the list head node is the only member of list data.</p>
<p><b>Configuration</b></p> <p><b>Configuration</b></p>
<p>There is no configuration required.</p> <p>There is no configuration required.</p>
<h1><a class="anchor" id="assignment"></a> <h1><a class="anchor" id="assignment"></a>
Assignment</h1> Assignment</h1>
<p>The 'Simple Singly Linked List' shall be implemented in file 'simple_singly_linked_list.c'. The corresponding header file includes the common interface 'list.h' but does not add functions by its own.</p> <p>The 'Simple Singly Linked List' shall be implemented in file 'simple_singly_linked_list.c'. The corresponding header file includes the common interface 'list.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> <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"> <ol type="1">
<li>Implement 'simple_singly_linked_list.c' against interface indirectly declared in 'list.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>Implement 'simple_singly_linked_list.c' against interface indirectly declared in 'list.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>All unit tests shall run but FAIL after this step</li>
<li><b>&ndash;COMMIT&ndash;</b></li> <li><b>&ndash;COMMIT&ndash;</b></li>
</ul> </ul>
</li> </li>
<li>Implement the empty functions one by one to make the unit tests pass one by one.<ul> <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>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>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> <li><b>&ndash;COMMIT&ndash; after each implemented function.</b></li>
</ul> </ul>
</li> </li>
</ol> </ol>
<p>Main driver is not required in this assignment.</p> <p>Main driver is not required in this assignment.</p>
<h1><a class="anchor" id="notes"></a> <h1><a class="anchor" id="notes"></a>
Notes</h1> Notes</h1>
<ol type="1"> <ol type="1">
<li>make cleantest: This new make target for clearing the console, building, and running unit test is available.</li> <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> <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> </ol>
</div></div><!-- PageDoc --> </div></div><!-- PageDoc -->
</div><!-- contents --> </div><!-- contents -->
<!-- start footer part --> <!-- start footer part -->
<hr class="footer"/><address class="footer"><small> <hr class="footer"/><address class="footer"><small>
Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html"> Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/> <img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18 </a> 1.8.18
</small></address> </small></address>
</body> </body>
</html> </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"> <!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"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/> <meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Simple Singly Linked List: mainpage.h File Reference</title> <title>Simple Singly Linked List: mainpage.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script> <script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/> <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/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script> <script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/> <link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea"> <div id="titlearea">
<table cellspacing="0" cellpadding="0"> <table cellspacing="0" cellpadding="0">
<tbody> <tbody>
<tr style="height: 56px;"> <tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;"> <td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Simple Singly Linked List <div id="projectname">Simple Singly Linked List
</div> </div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- end header part --> <!-- end header part -->
<!-- Generated by Doxygen 1.8.18 --> <!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search'); var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */ /* @license-end */
</script> </script>
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() { $(function() {
initMenu('',true,false,'search.php','Search'); initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); }); $(document).ready(function() { init_search(); });
}); });
/* @license-end */</script> /* @license-end */</script>
<div id="main-nav"></div> <div id="main-nav"></div>
<!-- window showing the filter options --> <!-- window showing the filter options -->
<div id="MSearchSelectWindow" <div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()" onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()" onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)"> onkeydown="return searchBox.OnSearchSelectKey(event)">
</div> </div>
<!-- iframe showing the search results (closed by default) --> <!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow"> <div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" <iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults"> name="MSearchResults" id="MSearchResults">
</iframe> </iframe>
</div> </div>
</div><!-- top --> </div><!-- top -->
<div class="header"> <div class="header">
<div class="headertitle"> <div class="headertitle">
<div class="title">mainpage.h File Reference</div> </div> <div class="title">mainpage.h File Reference</div> </div>
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<p><a href="mainpage_8h_source.html">Go to the source code of this file.</a></p> <p><a href="mainpage_8h_source.html">Go to the source code of this file.</a></p>
</div><!-- contents --> </div><!-- contents -->
<!-- start footer part --> <!-- start footer part -->
<hr class="footer"/><address class="footer"><small> <hr class="footer"/><address class="footer"><small>
Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html"> Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/> <img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18 </a> 1.8.18
</small></address> </small></address>
</body> </body>
</html> </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"> <!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"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/> <meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Simple Singly Linked List: mainpage.h Source File</title> <title>Simple Singly Linked List: mainpage.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script> <script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/> <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/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script> <script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/> <link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea"> <div id="titlearea">
<table cellspacing="0" cellpadding="0"> <table cellspacing="0" cellpadding="0">
<tbody> <tbody>
<tr style="height: 56px;"> <tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;"> <td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Simple Singly Linked List <div id="projectname">Simple Singly Linked List
</div> </div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- end header part --> <!-- end header part -->
<!-- Generated by Doxygen 1.8.18 --> <!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search'); var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */ /* @license-end */
</script> </script>
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() { $(function() {
initMenu('',true,false,'search.php','Search'); initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); }); $(document).ready(function() { init_search(); });
}); });
/* @license-end */</script> /* @license-end */</script>
<div id="main-nav"></div> <div id="main-nav"></div>
</div><!-- top --> </div><!-- top -->
<!-- window showing the filter options --> <!-- window showing the filter options -->
<div id="MSearchSelectWindow" <div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()" onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()" onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)"> onkeydown="return searchBox.OnSearchSelectKey(event)">
</div> </div>
<!-- iframe showing the search results (closed by default) --> <!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow"> <div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" <iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults"> name="MSearchResults" id="MSearchResults">
</iframe> </iframe>
</div> </div>
<div class="header"> <div class="header">
<div class="headertitle"> <div class="headertitle">
<div class="title">mainpage.h</div> </div> <div class="title">mainpage.h</div> </div>
</div><!--header--> </div><!--header-->
<div class="contents"> <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> <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 --> </div><!-- fragment --></div><!-- contents -->
<!-- start footer part --> <!-- start footer part -->
<hr class="footer"/><address class="footer"><small> <hr class="footer"/><address class="footer"><small>
Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html"> Generated on Mon Feb 15 2021 16:00:18 for Simple Singly Linked List by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/> <img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18 </a> 1.8.18
</small></address> </small></address>
</body> </body>
</html> </html>

View file

@ -1,51 +1,51 @@
/* /*
@licstart The following is the entire license notice for the JavaScript code in this file. @licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT) The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software 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, 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, 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 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: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software. substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 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 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, 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, 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. 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 @licend The above is the entire license notice for the JavaScript code in this file
*/ */
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) { function makeTree(data,relPath) {
var result=''; var result='';
if ('children' in data) { if ('children' in data) {
result+='<ul>'; result+='<ul>';
for (var i in data.children) { for (var i in data.children) {
result+='<li><a href="'+relPath+data.children[i].url+'">'+ result+='<li><a href="'+relPath+data.children[i].url+'">'+
data.children[i].text+'</a>'+ data.children[i].text+'</a>'+
makeTree(data.children[i],relPath)+'</li>'; makeTree(data.children[i],relPath)+'</li>';
} }
result+='</ul>'; result+='</ul>';
} }
return result; return result;
} }
$('#main-nav').append(makeTree(menudata,relPath)); $('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) { if (searchEnabled) {
if (serverSide) { 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>'); $('#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 { } 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').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(); $('#main-menu').smartmenus();
} }
/* @license-end */ /* @license-end */

View file

@ -1,28 +1,28 @@
/* /*
@licstart The following is the entire license notice for the JavaScript code in this file. @licstart The following is the entire license notice for the JavaScript code in this file.
The MIT License (MIT) The MIT License (MIT)
Copyright (C) 1997-2020 by Dimitri van Heesch Copyright (C) 1997-2020 by Dimitri van Heesch
Permission is hereby granted, free of charge, to any person obtaining a copy of this software 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, 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, 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 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: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software. substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 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 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, 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, 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. 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 @licend The above is the entire license notice for the JavaScript code in this file
*/ */
var menudata={children:[ var menudata={children:[
{text:"Main Page",url:"index.html"}, {text:"Main Page",url:"index.html"},
{text:"Files",url:"files.html",children:[ {text:"Files",url:"files.html",children:[
{text:"File List",url:"files.html"}]}]} {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"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title> <html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.18"/> <meta name="generator" content="Doxygen 1.8.18"/>
<link rel="stylesheet" type="text/css" href="search.css"/> <link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_0.js"></script> <script type="text/javascript" src="all_0.js"></script>
<script type="text/javascript" src="search.js"></script> <script type="text/javascript" src="search.js"></script>
</head> </head>
<body class="SRPage"> <body class="SRPage">
<div id="SRIndex"> <div id="SRIndex">
<div class="SRStatus" id="Loading">Loading...</div> <div class="SRStatus" id="Loading">Loading...</div>
<div id="SRResults"></div> <div id="SRResults"></div>
<script type="text/javascript"><!-- <script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults(); createResults();
/* @license-end */ /* @license-end */
--></script> --></script>
<div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div> <div class="SRStatus" id="NoMatches">No Matches</div>
<script type="text/javascript"><!-- <script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */ /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none"; document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none"; document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults"); var searchResults = new SearchResults("searchResults");
searchResults.Search(); searchResults.Search();
window.addEventListener("message", function(event) { window.addEventListener("message", function(event) {
if (event.data == "take_focus") { if (event.data == "take_focus") {
var elem = searchResults.NavNext(0); var elem = searchResults.NavNext(0);
if (elem) elem.focus(); if (elem) elem.focus();
} }
}); });
/* @license-end */ /* @license-end */
--></script> --></script>
</div> </div>
</body> </body>
</html> </html>

View file

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

View file

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

View file

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

File diff suppressed because it is too large Load diff

View file

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

File diff suppressed because one or more lines are too long

320
list.h
View file

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

View file

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

View file

@ -1,102 +1,102 @@
/*---------------------------------------------------------- /*----------------------------------------------------------
* HTBLA-Leonding * HTBLA-Leonding
* --------------------------------------------------------- * ---------------------------------------------------------
* Title: Tests implementation of a Liked List. * Title: Tests implementation of a Liked List.
* Author: S. Schraml * Author: S. Schraml
* ---------------------------------------------------------- * ----------------------------------------------------------
* Description: * Description:
* Unit tests for a linked list implemenation. * Unit tests for a linked list implemenation.
* ---------------------------------------------------------- * ----------------------------------------------------------
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "shortcut.h" #include "shortcut.h"
#include "test_list.h" #include "test_list.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
ADD_TEST(test_list_obtain__shall_allocate_a_list); 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_fresh_list);
ADD_TEST(test_list_obtain__shall_allocate_a_different_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_obtain_failed__shall_not_allocate_a_list);
ADD_TEST(test_list_release__shall_release_a_valid_empty_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_release_a_valid_filled_list);
ADD_TEST(test_list_release__shall_ignore_release_of_an_invalid_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_true_for_valid_list);
ADD_TEST(test_list_is_valid__shall_be_false_for_invalid_list); ADD_TEST(test_list_is_valid__shall_be_false_for_invalid_list);
ADD_TEST(test_list_insert__shall_add_one_value_to_empty_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_add_multiple_values);
ADD_TEST(test_list_insert__shall_ignore_invalid_list); 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_not_remove_from_empty_list);
ADD_TEST(test_list_remove__shall_remove_only_value); 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_one_value);
ADD_TEST(test_list_remove__shall_remove_first_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_in_the_middle);
ADD_TEST(test_list_remove__shall_remove_value_at_the_end); 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__shall_not_remove_missing_value);
ADD_TEST(test_list_remove_all__shall_not_remove_from_empty_list); 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_only_value);
ADD_TEST(test_list_remove_all__shall_remove_all_values); 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_one_value);
ADD_TEST(test_list_remove_all__shall_remove_all_values_in_a_row); 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_remove_all_distributed_values);
ADD_TEST(test_list_remove_all__shall_not_remove_missing_value); 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_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_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_at_the_beginning);
ADD_TEST(test_list_insert_at__shall_insert_value_in_the_middle); 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_at_the_end);
ADD_TEST(test_list_insert_at__shall_insert_value_after_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_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_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_at_the_beginning);
ADD_TEST(test_list_remove_at__shall_remove_value_in_the_middle); 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_not_remove_from_empty_list);
ADD_TEST(test_list_remove_at__shall_remove_value_at_the_end); 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_not_remove_value_after_the_end);
ADD_TEST(test_list_remove_at__shall_ignore_invalid_list); 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_empty_list);
ADD_TEST(test_list_clear__shall_clear_list_with_one_value); 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_clear_list_with_multiple_values);
ADD_TEST(test_list_clear__shall_ingore_invalid_list); ADD_TEST(test_list_clear__shall_ingore_invalid_list);
ADD_TEST(test_list_is_empty__shall_be_true__for_newly_obtained_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_false__after_adding_values);
ADD_TEST(test_list_is_empty__shall_be_true_for_invalid_list); ADD_TEST(test_list_is_empty__shall_be_true_for_invalid_list);
ADD_TEST(test_list_get_size__shall_be_0_for_newly_obtained_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_adding_values);
ADD_TEST(test_list_get_size__shall_reflect_number_of_values_after_removing_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_after_clear);
ADD_TEST(test_list_get_size__shall_be_0_for_invalid_list); ADD_TEST(test_list_get_size__shall_be_0_for_invalid_list);
ADD_TEST(test_list_contains__shall_be_false_for_empty_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_one_value);
ADD_TEST(test_list_contains__shall_be_true_for_multiple_values); 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_form_missing_value);
ADD_TEST(test_list_contains__shall_be_false_for_invalid_list); 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_0_for_empty_list);
ADD_TEST(test_list_get_at__shall_return_single_value); 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_first_value);
ADD_TEST(test_list_get_at__shall_return_values_in_added_order); 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_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_empty_list_to_empty_list);
ADD_TEST(test_list_append__shall_append_filled_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_empty_list_to_filled_list);
ADD_TEST(test_list_append__shall_append_filled_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_append__shall_ignore_invalid_lists);
run_tests(); run_tests();
return 0; return 0;
} }

View file

@ -1,46 +1,46 @@
/** /**
* @mainpage * @mainpage
* @section intro Introduction * @section intro Introduction
* *
* The implementation of a "Simple Singly Linked List". * The implementation of a "Simple Singly Linked List".
* *
* @section objective Assignment Objective * @section objective Assignment Objective
* In this assignment an Abstract Data Type of a "Simple Singly Linked List" shall be implemented against * In this assignment an Abstract Data Type of a "Simple Singly Linked List" shall be implemented against
* the defined common interface of a list. This interface is declared within file 'list.h'. It is intended * the defined common interface of a list. This interface is declared within file 'list.h'. It is intended
* to be used by applications or other libraries and aims to abstract the 'list' functionality as far as possible. * to be used by applications or other libraries and aims to abstract the 'list' functionality as far as possible.
* *
* The term 'simple' in 'Simple Singly Linked List' refers to the limited members of the list data: * The term 'simple' in 'Simple Singly Linked List' refers to the limited members of the list data:
* the pointer to the list head node is the only member of list data. * the pointer to the list head node is the only member of list data.
* *
* **Configuration** * **Configuration**
* *
* There is no configuration required. * There is no configuration required.
* *
* @section assignment Assignment * @section assignment Assignment
* The 'Simple Singly Linked List' shall be implemented in file 'simple_singly_linked_list.c'. The corresponding header file * The 'Simple Singly Linked List' shall be implemented in file 'simple_singly_linked_list.c'. The corresponding header file
* includes the common interface 'list.h' but does not add functions by its own. * includes the common interface 'list.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, * 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' * 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. * library must be used for memory alloction operations, otherwise unit tests will fail.
* *
* *
* -# Implement 'simple_singly_linked_list.c' against interface indirectly declared in 'list.h': * -# Implement 'simple_singly_linked_list.c' against interface indirectly declared in 'list.h':
* Make the program and tests compile: Implement all functions in all relevant files declared in the headers * Make the program and tests compile: Implement all functions in all relevant files declared in the headers
* EMTPY (return nothing, 0, false, ... as required). * EMTPY (return nothing, 0, false, ... as required).
* - All unit tests shall run but FAIL after this step * - All unit tests shall run but FAIL after this step
* - **--COMMIT--** * - **--COMMIT--**
* -# Implement the empty functions one by one to make the unit tests pass one by one. * -# 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. * - 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. * - Obey comments in source files. Run the unit tests frequently and fix failures.
* - **--COMMIT-- after each implemented function.** * - **--COMMIT-- after each implemented function.**
* *
* Main driver is not required in this assignment. * Main driver is not required in this assignment.
* *
* @section notes Notes * @section notes Notes
* -# make cleantest: This new make target for clearing the console, building, and running unit test is available. * -# 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 * -# 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. * 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 * This approach is also recommended after everthing is done, because some compiler warning appears
* only in clean builds. * only in clean builds.
*/ */

198
makefile
View file

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

View file

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

View file

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

View file

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

View file

@ -1,28 +1,28 @@
/*---------------------------------------------------------- /*----------------------------------------------------------
* HTBLA-Leonding / Class: 2IHIF * HTBLA-Leonding / Class: 2IHIF
* --------------------------------------------------------- * ---------------------------------------------------------
* Exercise Number: S01 * Exercise Number: S01
* Title: Simple Singly Linked List * Title: Simple Singly Linked List
* Author: Marc Tismonar * Author: Marc Tismonar
* ---------------------------------------------------------- * ----------------------------------------------------------
* Description: * Description:
* The declaration of a linked list abstract data type * The declaration of a linked list abstract data type
* based on an implementation of a simple singly linked list. * based on an implementation of a simple singly linked list.
* ---------------------------------------------------------- * ----------------------------------------------------------
*/ */
#ifndef ___SIMPLE_SINGLY_LINKED_LIST__H #ifndef ___SIMPLE_SINGLY_LINKED_LIST__H
#define ___SIMPLE_SINGLY_LINKED_LIST__H #define ___SIMPLE_SINGLY_LINKED_LIST__H
#include "list.h" #include "list.h"
/** /**
* This header file maps only the common 'list' interface * This header file maps only the common 'list' interface
* into naming conventions for simple singly linked list implementation. * into naming conventions for simple singly linked list implementation.
* *
* It does (for now) not extend or alter the function prototypes of the * It does (for now) not extend or alter the function prototypes of the
* common interface. * common interface.
* *
*/ */
#endif #endif

File diff suppressed because it is too large Load diff

View file

@ -1,97 +1,97 @@
/*---------------------------------------------------------- /*----------------------------------------------------------
* HTBLA-Leonding / Klasse: n/a * HTBLA-Leonding / Klasse: n/a
* --------------------------------------------------------- * ---------------------------------------------------------
* Title: Unit Tests for a List implementation * Title: Unit Tests for a List implementation
* Author: S. Schraml * Author: S. Schraml
* ---------------------------------------------------------- * ----------------------------------------------------------
* Description: * Description:
* Tests functions of a list. * Tests functions of a list.
* ---------------------------------------------------------- * ----------------------------------------------------------
*/ */
#ifndef ___TEST_LIST_H #ifndef ___TEST_LIST_H
#define ___TEST_LIST_H #define ___TEST_LIST_H
#include "shortcut.h" #include "shortcut.h"
TEST(test_list_obtain__shall_allocate_a_list); TEST(test_list_obtain__shall_allocate_a_list);
TEST(test_list_obtain__shall_allocate_a_fresh_list); TEST(test_list_obtain__shall_allocate_a_fresh_list);
TEST(test_list_obtain__shall_allocate_a_different_list); TEST(test_list_obtain__shall_allocate_a_different_list);
TEST(test_list_obtain_failed__shall_not_allocate_a_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_empty_list);
TEST(test_list_release__shall_release_a_valid_filled_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_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_true_for_valid_list);
TEST(test_list_is_valid__shall_be_false_for_invalid_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_one_value_to_empty_list);
TEST(test_list_insert__shall_add_multiple_values); TEST(test_list_insert__shall_add_multiple_values);
TEST(test_list_insert__shall_ignore_invalid_list); TEST(test_list_insert__shall_ignore_invalid_list);
TEST(test_list_remove__shall_not_remove_from_empty_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_only_value);
TEST(test_list_remove__shall_remove_one_value); TEST(test_list_remove__shall_remove_one_value);
TEST(test_list_remove__shall_remove_first_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_in_the_middle);
TEST(test_list_remove__shall_remove_value_at_the_end); TEST(test_list_remove__shall_remove_value_at_the_end);
TEST(test_list_remove__shall_not_remove_missing_value); 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_not_remove_from_empty_list);
TEST(test_list_remove_all__shall_remove_only_value); 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_all_values);
TEST(test_list_remove_all__shall_remove_one_value); 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_values_in_a_row);
TEST(test_list_remove_all__shall_remove_all_distributed_values); 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_not_remove_missing_value);
TEST(test_list_remove_all__shall_ignore_invalid_list); 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_single_value_in_empty_list);
TEST(test_list_insert_at__shall_insert_value_at_the_beginning); 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_in_the_middle);
TEST(test_list_insert_at__shall_insert_value_at_the_end); 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_insert_value_after_the_end);
TEST(test_list_insert_at__shall_ignore_invalid_list); 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_not_remove_from_empty_list);
TEST(test_list_remove_at__shall_remove_value_at_the_beginning); 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_remove_value_in_the_middle);
TEST(test_list_remove_at__shall_not_remove_from_empty_list); 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_remove_value_at_the_end);
TEST(test_list_remove_at__shall_not_remove_value_after_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_remove_at__shall_ignore_invalid_list);
TEST(test_list_clear__shall_clear_empty_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_one_value);
TEST(test_list_clear__shall_clear_list_with_multiple_values); TEST(test_list_clear__shall_clear_list_with_multiple_values);
TEST(test_list_clear__shall_ingore_invalid_list); 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_true__for_newly_obtained_list);
TEST(test_list_is_empty__shall_be_false__after_adding_values); 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_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_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_adding_values);
TEST(test_list_get_size__shall_reflect_number_of_values_after_removing_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_after_clear);
TEST(test_list_get_size__shall_be_0_for_invalid_list); 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_false_for_empty_list);
TEST(test_list_contains__shall_be_true_for_one_value); 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_true_for_multiple_values);
TEST(test_list_contains__shall_be_false_form_missing_value); TEST(test_list_contains__shall_be_false_form_missing_value);
TEST(test_list_contains__shall_be_false_for_invalid_list); 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_0_for_empty_list);
TEST(test_list_get_at__shall_return_single_value); 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_first_value);
TEST(test_list_get_at__shall_return_values_in_added_order); 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_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_empty_list_to_empty_list);
TEST(test_list_append__shall_append_filled_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_empty_list_to_filled_list);
TEST(test_list_append__shall_append_filled_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_append__shall_ignore_invalid_lists);
#endif #endif