-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathilist.c
95 lines (86 loc) · 1.94 KB
/
ilist.c
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
/***************************
* PROJECT:
* IFJ20 - Compiler for imperative programming language IFJ20
*
* UNIVERSITY:
* Faculty of Information Technology, Brno University of Technology
*
* FILE:
* list.c
*
* DESCRIPTION:
* List functions
*
* AUTHORS:
* Hrúz Tomáš <xhruzt00@stud.fit.vutbr.cz>
* Taken from reference compiler by VUT FIT in Brno
*
*/
#include "ilist.h"
void listInit(tListOfInstr *L)
// funkce inicializuje seznam instrukci
{
L->first = NULL;
L->last = NULL;
L->active = NULL;
}
void listFree(tListOfInstr *L)
// funkce dealokuje seznam instrukci
{
tListItem *ptr;
while (L->first != NULL)
{
ptr = L->first;
L->first = L->first->nextItem;
// uvolnime celou polozku
free(ptr);
}
}
void listInsertLast(tListOfInstr *L, tInstr I)
// vlozi novou instruci na konec seznamu
{
tListItem *newItem;
newItem = malloc(sizeof (tListItem));
newItem->Instruction = I;
newItem->nextItem = NULL;
if (L->first == NULL)
L->first = newItem;
else
L->last->nextItem=newItem;
L->last=newItem;
}
void listFirst(tListOfInstr *L)
// zaktivuje prvni instrukci
{
L->active = L->first;
}
void listNext(tListOfInstr *L)
// aktivni instrukci se stane nasledujici instrukce
{
if (L->active != NULL)
L->active = L->active->nextItem;
}
void listGoto(tListOfInstr *L, void *gotoInstr)
// nastavime aktivni instrukci podle zadaneho ukazatele
// POZOR, z hlediska predmetu IAL tato funkce narusuje strukturu
// abstraktniho datoveho typu
{
L->active = (tListItem*) gotoInstr;
}
void *listGetPointerLast(tListOfInstr *L)
// vrati ukazatel na posledni instrukci
// POZOR, z hlediska predmetu IAL tato funkce narusuje strukturu
// abstraktniho datoveho typu
{
return (void*) L->last;
}
tInstr *listGetData(tListOfInstr *L)
// vrati aktivni instrukci
{
if (L->active == NULL)
{
printf("Chyba, zadna instrukce neni aktivni");
return NULL;
}
else return &(L->active->Instruction);
}