source: proto/CSV/csv2xml/util/csv2xmlwriter.hpp @ 2663

Last change on this file since 2663 was 2663, checked in by linmengl, 6 years ago

use store_unaligned to for speed

File size: 3.2 KB
Line 
1#ifndef CSV2XMLWRITER
2#define CSV2XMLWRITER
3/*
4Helper class to write down xml file from csv input
5*/
6#include <cstdio>
7#include <cstdlib>
8#include <cstring>
9#include "../lib/bitblock.hpp"
10
11#define FILE_OUTPUT
12
13int8_t outBuf[SEGMENT_SIZE * 40];
14
15class Csv2XmlWriter
16{
17private:
18    FILE *_fout;
19    int _rowStarted;
20    int _colStarted;
21    int _needClose;
22    int _bufCount;
23
24public:
25    inline void flush()
26    {
27        #ifdef FILE_OUTPUT
28        fwrite((void *)outBuf, 1, _bufCount, _fout);
29        #endif
30        _bufCount = 0;
31    }
32
33    unsigned long long _outCount;
34
35    Csv2XmlWriter(FILE *fout)
36    {
37        _fout = fout;
38        init();
39        _needClose = 0;
40    }
41
42    Csv2XmlWriter(char* filename)
43    {
44        _fout = fopen(filename, "w");
45        init();
46        _needClose = 1;
47    }
48
49    ~Csv2XmlWriter()
50    {
51        writeRootEnd();
52        flush();
53        if (_needClose)
54            fclose( _fout );
55    }
56
57    void writeColumn(char* fullColumnContent, int len)
58    {
59        if (len == 0)
60            return;
61
62        if (!_colStarted)
63        {
64            writeColumnStart();
65        }
66
67        writeContent(fullColumnContent, len);
68    }
69
70    void nextCol()
71    {
72        if (!_colStarted)
73            writeColumnStart();
74
75        writeColumnEnd();
76    }
77
78    void nextRow()
79    {
80        if (!_rowStarted)
81            writeRowStart();
82
83        writeRowEnd();
84    }
85
86private:
87    union StringBitBlock
88    {
89        char col_string[12];
90        BitBlock col_block;
91    };
92
93    StringBitBlock rol_start;
94    StringBitBlock rol_end;
95    StringBitBlock col_start;
96    StringBitBlock col_end;
97
98    inline void init()
99    {
100        _rowStarted = 0;
101        _colStarted = 0;
102        _outCount = 0;
103        _bufCount = 0;
104        strcpy(rol_start.col_string, "   <row>\n");
105        strcpy(rol_end.col_string, "   </row>\n");
106        strcpy(col_start.col_string, "      <col>");
107        strcpy(col_end.col_string, "</col>\n");
108
109        writeRootStart();
110    }
111
112     //Profile result is oppsite this function.
113    inline void printString(const char *s, int len)
114    {
115        memcpy((char *)outBuf + _bufCount, s, len);
116        _bufCount += len;
117        _outCount += len;
118    }
119
120    inline void printConst(StringBitBlock &out, int len)
121    {
122        bitblock::store_unaligned(out.col_block, (BitBlock *) ((char *)outBuf + _bufCount));
123        _bufCount += len;
124        _outCount += len;
125    }
126
127    inline void writeContent(char* fullColumnContent, int len)
128    {
129        printString(fullColumnContent, len);
130    }
131
132    inline void writeRootStart()
133    {
134        printString("<root>\n", 7);
135    }
136
137    inline void writeRootEnd()
138    {
139        if (_colStarted)
140            writeColumnEnd();
141        if (_rowStarted)
142            writeRowEnd();
143
144        printString("</root>\n", 8);
145    }
146
147    inline void writeRowStart()
148    {
149        printConst(rol_start, 9);
150        _rowStarted = 1;
151    }
152
153    inline void writeRowEnd()
154    {
155        printConst(rol_end, 10);
156        _rowStarted = 0;
157    }
158
159    inline void writeColumnStart()
160    {
161        if (!_rowStarted)
162        {
163            writeRowStart();
164        }
165        printConst(col_start, 11);
166        _colStarted = 1;
167    }
168
169    inline void writeColumnEnd()
170    {
171        printConst(col_end, 7);
172        _colStarted = 0;
173    }
174};
175
176#endif //Csv2XmlWriter
Note: See TracBrowser for help on using the repository browser.