-
Notifications
You must be signed in to change notification settings - Fork 0
/
xjot_to_xml.c
152 lines (128 loc) · 3.45 KB
/
xjot_to_xml.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define XJOT_TO_XML_BUFFER_SIZE_IN_BYTES 1024
// This code follows Nubaria's guidelines for working with UTF-8:
// http://www.nubaria.com/en/blog/?p=289
struct
{
} xjot_attr;
typedef enum xjot_node_type
{
XjotRootNode,
XjotElement,
XjotComment,
XjotProcessingInstruction,
XjotText,
XjotMaybeElementOrMaybeProcessingInstruction
} xjot_node_type;
typedef struct xjot_node
{
struct xjot_node* parent_node;
unsigned int node_depth;
enum xjot_node_type node_type;
char* node_name;
unsigned int start_line;
unsigned int start_column;
} xjot_node;
xjot_node* _xjot_new_child_node(
xjot_node* parent,
xjot_node_type node_type,
unsigned int start_line,
unsigned int start_column)
{
xjot_node* child_node = malloc(sizeof(xjot_node));
printf("Post-malloc\n");
(*child_node).parent_node = parent;
(*child_node).node_depth = (*parent).node_depth + 1;
(*child_node).node_type = node_type;
(*child_node).start_line = start_line;
(*child_node).start_column = start_column;
return child_node;
}
xjot_node* _xjot_exit_child_node(xjot_node* child)
{
xjot_node* parent = (*child).parent_node;
if ((*child).node_name != NULL)
{
free((*child).node_name);
}
free(child);
return parent;
}
void _xjot_to_xml_with_buf(int in_fd, int out_fd, void* buf, size_t buf_size)
{
int n;
int c;
int line_no = 1;
int col_no = 0;
char byte;
xjot_node root = {
.parent_node = NULL,
.node_depth = 0,
.node_type = XjotRootNode,
.node_name = NULL,
.start_line = 1,
.start_column = 1,
};
xjot_node* context = &root;
while ((n = read(in_fd, &buf, buf_size)) != 0)
{
if (n == -1)
{
if (errno == EINTR)
{
continue;
}
if (errno == EWOULDBLOCK || errno == EAGAIN)
{
}
fputs(strerror(errno), stderr);
break;
}
printf("a\n");
printf("b\n");
// Loop through characters within buffer:
for (c = 0; c < n; c++)
{
col_no++;
// FIXME: Why do I get a segmentation fault as soon as I try to access a single byte in `buf`?
byte = ((char*)buf)[0];
switch (byte)
{
// TODO: \n\r support
case '\n':
line_no++;
col_no = 1;
break;
case '<':
printf("Child\n");
context = _xjot_new_child_node(
context, XjotMaybeElementOrMaybeProcessingInstruction, line_no, col_no
);
break;
case '>':
context = _xjot_exit_child_node(context);
break;
}
}
}
}
/**
* Feed the xjot input found in `in_fd` as regular XML into `out_fd`.
*
* both `in_fd` and `out_fd` must be POSIX file descriptors.
*/
void xjot_to_xml(int in_fd, int out_fd)
{
char buffer[XJOT_TO_XML_BUFFER_SIZE_IN_BYTES] = {'\0'};
_xjot_to_xml_with_buf(in_fd, out_fd, &buffer, XJOT_TO_XML_BUFFER_SIZE_IN_BYTES);
}
int main(int argc, char** argv)
{
xjot_to_xml(STDIN_FILENO, STDOUT_FILENO);
return 0;
}
// vim: set expandtab tabstop=4 shiftwidth=4: