-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlist.cc
113 lines (101 loc) · 1.61 KB
/
list.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <stdio.h>
#include <string.h>
#include "list.h"
list::list()
{
first = last = cursor = NULL;
}
void
list::add( char *str )
{
node *temp = new node;
temp->prev = NULL;
temp->next = NULL;
snprintf( temp->cmd, MAX_INPUT, "%s", str );
if ( this->last ) {
temp->prev = this->last;
this->last->next = temp;
this->last = temp;
// set cursor to last node
this->cursor = this->last;
}
else {
this->last = this->first = this->cursor = temp;
}
}
const char*
list::peek()
{
if ( this->cursor ) {
return( this->cursor->cmd );
}
else {
// return newline to indicate NULL cursor (i.e. end of list)
return( "\n" );
}
}
int
list::pop()
{
if ( this->last ) {
node *temp = this->last;
this->last = this->last->prev;
if ( this->last ) {
this->last->next = NULL;
}
else {
// empty list
this->first = NULL;
}
// set cursor to last node
this->cursor = this->last;
delete( temp );
return( 0 );
}
else {
return( 1 );
}
}
void
list::start()
{
this->cursor = this->first;
}
void
list::end()
{
this->cursor = this->last;
}
void
list::next()
{
if ( this->cursor ) {
this->cursor = this->cursor->next;
}
}
void
list::prev()
{
if ( this->cursor ) {
this->cursor = this->cursor->prev;
}
}
void
list::dump()
{
fprintf( stderr, "list:" );
this->start();
while ( this->cursor ) {
fprintf( stderr, " \'%s\'", this->peek() );
this->next();
}
fprintf( stderr, "\n" );
this->end();
}
list::~list()
{
int done = this->pop();
while ( done == 0 ) {
done = this->pop();
}
}