source: proto/u8check/u8check_template.cpp @ 5706

Last change on this file since 5706 was 4918, checked in by cameron, 4 years ago

u8check demo

File size: 4.2 KB
Line 
1// Stream struct and function headers and definitions
2
3#include <simd-lib/bitblock.hpp>
4#include <simd-lib/carryQ.hpp>
5#include <simd-lib/pabloSupport.hpp>
6
7#define LocalCarryDeclare(name, count)\
8CarryArray<count, 0> name;\
9
10BitBlock EOF_mask = simd<1>::constant<1>();
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <errno.h>
15#include <sys/types.h>
16#include <sys/stat.h>
17
18#include <simd-lib/s2p.hpp>
19#include <simd-lib/buffer.hpp>
20
21#define SEGMENT_BLOCKS  12
22#define SEGMENT_SIZE (BLOCK_SIZE * SEGMENT_BLOCKS)
23
24typedef char * Bytedata;
25
26@global
27
28#include <simd-lib/transpose.hpp>
29
30static void do_process(FILE *infile);
31
32int main(int argc, char * argv[]) {
33
34        char * infilename;
35        FILE *infile;
36        struct stat fileinfo;
37
38        if (argc != 2) {
39                printf("Usage: %s <filename>\n", argv[0]);
40                exit(-1);
41        }
42
43        infilename = argv[1];
44        stat(infilename, &fileinfo);
45        infile = fopen(infilename, "rb");
46        if (!infile) {
47                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
48                exit(-1);
49        }
50
51        do_process(infile);
52
53        fclose(infile);
54
55        return(0);
56}
57
58
59void do_process(FILE *infile) {
60
61        @decl
62
63        int block_base  = 0;
64        int buffer_base = 0;
65        int chars_avail = 0;
66        int chars_read  = 0;
67        char * bytedata;
68
69        char * src_buffer;
70        ALLOC_STATIC_ALIGNED_BYTE_BUFFER(src_buffer, SEGMENT_SIZE);
71       
72        chars_read = fread((void *) src_buffer, 1, SEGMENT_SIZE, infile);
73        chars_avail = chars_read;
74
75
76        Transpose transpose;
77       
78        @stream_stmts
79
80        //////////////////////////////////////////////////////////////////////////////////////////
81        // Full Segments
82        //////////////////////////////////////////////////////////////////////////////////////////
83        while (chars_avail >= SEGMENT_SIZE) {
84                for (int blk = 0; blk < SEGMENT_BLOCKS; blk++) {
85                        block_base = blk*BLOCK_SIZE;
86                        bytedata = &src_buffer[block_base];
87                       
88                        @block_stmts
89                       
90                        if (bitblock::any(error.mask)) {
91                                int errpos = count_forward_zeroes(error.mask);
92                                fprintf(stderr, "Invalid UTF-8 sequence at position %i\n", buffer_base + block_base + errpos);
93                                exit(-1);
94                        }
95                }
96                buffer_base += SEGMENT_SIZE;
97                chars_read = fread((void *) src_buffer, 1, SEGMENT_SIZE, infile);
98                chars_avail = chars_read;
99        }
100
101        //////////////////////////////////////////////////////////////////////////////////////////
102        // Final Partial Segment
103        //////////////////////////////////////////////////////////////////////////////////////////
104
105        block_base = 0;
106        int remaining = chars_avail;
107
108        /* Full Blocks */
109        while (remaining >= BLOCK_SIZE) {
110                bytedata = &src_buffer[block_base];
111               
112                @block_stmts
113               
114                if (bitblock::any(error.mask)) {
115                        int errpos = count_forward_zeroes(error.mask);
116                        fprintf(stderr, "Invalid UTF-8 sequence at position %i\n", buffer_base + block_base + errpos);
117                        exit(-1);
118                }
119                block_base += BLOCK_SIZE;
120                remaining -= BLOCK_SIZE;
121        }
122
123        //    Final partial Block  (required even if empty, for possible errors at EOF).
124        EOF_mask = bitblock::srl(simd<1>::constant<1>(), convert(BLOCK_SIZE-remaining));
125        bytedata = &src_buffer[block_base];
126       
127        @final_block_stmts
128       
129        if (bitblock::any(error.mask)) {
130                int errpos = count_forward_zeroes(error.mask);
131                if (errpos < remaining) {
132                        fprintf(stderr, "Invalid UTF-8 sequence at position %i\n", buffer_base + block_base + errpos);
133                        exit(-1);
134                }
135                else {
136                        fprintf(stderr, "Incomplete UTF-8 sequence at end of file\n");
137                        exit(-1);
138                }
139        }
140}
141
Note: See TracBrowser for help on using the repository browser.