-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathvariable.c
139 lines (130 loc) · 3.96 KB
/
variable.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "variable.h"
#include "loop.h"
/**
* @brief Değişkenlere ait verileri bağlı listede boş olduğu kabul edilen yere yazar.
* @param data Verilerin kapsüllendiği veri paketinin adresi
* @param variable_p İçi boş kabul edilen bağlı liste üyesinin adresi.
*/
int write_variable_data(variable_s *data, variable_s *variable_p)
{
variable_p->id = data->id;
strcpy(variable_p->kind, data->kind);
variable_p->line = data->line;
strcpy(variable_p->name, data->name);
variable_p->increase_rate = NULL;
variable_p->next = NULL;
}
/**
* @brief Tespit edilen değişkeni değişkenlerin toplandığı bağlı listeye ekler.
* @param data Verilerin kapsüllendiği veri paketinin adresi.
* @param variable_p Verileri işaret eden kök işaretçisi.
*
*/
int add_variable_data(variable_s *data, variable_s *variable_p)
{
if (variable_p->line == NULL)
{
data->id = 0;
write_variable_data(data, variable_p);
return 0;
}
while (variable_p->next != NULL)
variable_p = variable_p->next;
data->id = variable_p->id + 1;
variable_s *variable_p_new = malloc(sizeof(variable_s));
variable_p->next = variable_p_new;
write_variable_data(data, variable_p->next);
}
/**
* @brief Değişkenler bağlı listesine kayıtlı olan bir değişkeni
* bağlı listede arar ve adresini gönderir.
*
* @param variable Değişkenin ismi.
* @param variable_line Değişkenin bulunduğu satırç
* @param root Değişkenleri tutan bağlı listenin kök adresi.
*
* @return variable_s türünden adres.
*/
variable_s *search_variable(char *variable, int varibale_line, variable_s *root)
{
while (1)
{
if (0 == strcmp(variable, root->name) && varibale_line >= root->line)
{
// printf("%d\n",root->line);
return root;
}
if (root->next != NULL)
root = root->next;
else
break;
}
return NULL;
}
/**
*@brief Variable struct'ında türlere bakıp boyutunu ekler
*@param v_root variable struct'ın root'unu alır
*/
void find_size(variable_s *v_root, int start_line, int end_line)
{
char variables[c_Size_s][c_Size_s] = {"pointer", "int", "double", "char", "float", "long", "short", "matrix", "dizi"}; // türler
char sizes[c_Size_s][c_Size_s] = {"8", "4", "8", "1", "4", "4", "2", "nn", "n"};
// memset(v_root->size, NULL, c_Size_l);
if ((v_root != NULL) && ((start_line > v_root->line) || (end_line < v_root->line)))
{
for (int i = 0; i < 9; i++)
{
if (i == 2)
{
continue;
}
if (NULL != strstr(v_root->kind, variables[2])) // pointer
{
strcpy(v_root->size, sizes[2]);
}
else if (NULL != strstr(v_root->kind, variables[i]))
{
strcat(v_root->size, sizes[i]);
}
}
}
// printf("%s --%s\n", v_root->size, v_root->kind);
if (v_root->next != NULL)
{
find_size(v_root->next, start_line, end_line);
}
}
/**
* @brief Aynı satırdaki değişkenleri bulur ve ekler.
*
* @param name_var değişken isimlerini alır.
*
* @param var_line satırlarını alır.
*
* @param var_kind türlerini alır.
*
* @param root rootu alır.
*/
int find_same_line_var(char name_var[50], int var_line, char var_kind[c_Size_s], variable_s *root)
{
char *token = strtok(name_var, ",");
while (token != NULL)
{
variable_s data;
// printf(" %s %s %d\n", token, var_kind, var_line);
memset(data.kind, NULL, strlen(data.kind));
strcat(data.kind, var_kind);
data.line = var_line;
// data.id = 0;
memset(data.size, NULL, 20);
memset(data.name, NULL, strlen(data.name));
strcat(data.name, token);
add_variable_data(&data, root);
data.line = NULL;
token = strtok(NULL, ",");
}
return 0;
}