-
Notifications
You must be signed in to change notification settings - Fork 0
/
push.c
114 lines (100 loc) · 1.85 KB
/
push.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
#include "monty.h"
#include <stdlib.h>
#include <stdio.h>
/**
* add_node_stack - adds element at top of stack
* @head: pointer to first node of the list
* @n: the number inside the new added node
* Return: pointer to the new node if added
*/
int add_node_stack(stack_t **head, int n)
{
stack_t *new = NULL;
if (head)
new = malloc(sizeof(stack_t));
if (new)
{
new->n = n;
new->prev = NULL;
if (*head)
{
new->prev = (*head)->prev;
(*head)->prev = new;
}
new->next = *head;
*head = new;
return (0);
}
return (1);
}
/**
* add_node_queue - adds element at tip of queue
* @head: pointer to first node of the list
* @n: the number inside the new added node
* Return: pointer to the new node if added
*/
int add_node_queue(stack_t **head, int n)
{
stack_t *move, *new = NULL;
if (head)
new = malloc(sizeof(stack_t));
if (new)
{
move = *head;
while (move && move->next)
move = move->next;
new->n = n;
new->prev = move;
new->next = NULL;
if (move)
move->next = new;
else
*head = new;
return (0);
}
return (1);
}
/**
* not_number - checks if atoi failed
* @str: string of numbers 0 -> 9
* Return: 1 if str not in 0 -> 9
*/
int not_number(char *str)
{
if (str == NULL)
return (1);
if (*str == '-' || *str == '+')
str++;
do {
if (*str < '0' || *str > '9')
return (1);
str++;
} while (*str);
return (0);
}
/**
* push_op - pushes new element to stack or queue
* @list: doubly linked list with the data
* @line_num: the current line in the .m file
*/
void push_op(stack_t **list, unsigned int line_num)
{
char *word = get_word(2);
int err, n;
if (not_number(word))
{
free(word);
syntax_error(1, list, line_num);
}
n = atoi(word);
if (G.is_stack)
err = add_node_stack(list, n);
else
err = add_node_queue(list, n);
free(word);
if (err)
{
free_list(list);
malloc_error();
}
}