12 typedef unsigned char uint8;
14 static int readRecord(int fd, int max, char *text)
21 memset(text + len, 0, max - len);
25 static void printRecord(const char *text, int len)
32 printf("%.*s", WIDTH, text);
34 for(p = text + WIDTH; p < text + len; p += WIDTH)
35 printf("\t%.*s", WIDTH, p);
38 static int decode(const char *file1, const char *file2)
40 int fd1 = -1, fd2 = -1, len;
43 if((fd1 = open(file1, O_RDONLY | O_BINARY)) < 0) {
44 fprintf(stderr, "CANNOT OPEN %s\n", file1);
48 if(file2 == NULL) { /* LINE */
50 len = readRecord(fd1, 80, text);
51 printRecord(text, len);
54 } else { /* ROOMS, SPECIAL */
55 if((fd2 = open(file2, O_RDONLY | O_BINARY)) < 0) {
56 fprintf(stderr, "CANNOT OPEN %s\n", file2);
60 while(!eof(fd1) && !eof(fd2)) {
61 len = readRecord(fd1, 240, text);
62 printRecord(text, len);
63 if((len = readRecord(fd2, 240, text)) > 0) {
65 printRecord(text, len);
78 static int removeTab(char *text)
80 int len = strlen(text);
83 if(text[len - 1] == '\r' || text[len - 1] == '\n') {
88 for(p = text + WIDTH; p < text + strlen(text); p += WIDTH) {
90 fprintf(stderr, "WRONG FORMAT\n");
93 memmove(p, p + 1, strlen(p) + 1);
98 void writeRecord(int fd1, int fd2, const char *text)
100 int len = strlen(text);
101 const char *p = text;
105 memset(buf, ' ', sizeof(buf));
106 memcpy(buf, text, len);
113 write(fd1, &len8, 1);
114 write(fd1, buf, 240);
121 write(fd2, &len8, 1);
122 write(fd2, buf + 240, 240);
127 write(fd1, &len8, 1);
132 static int encode(const char *file1, const char *file2)
134 int fd1 = -1, fd2 = -1;
137 if((fd1 = open(file1, O_CREAT | O_RDWR | O_TRUNC | O_BINARY, S_IREAD | S_IWRITE)) < 0) {
138 fprintf(stderr, "CANNOT OPEN %s\n", file1);
142 if((fd2 = open(file2, O_CREAT | O_RDWR | O_TRUNC | O_BINARY, S_IREAD | S_IWRITE)) < 0) {
143 fprintf(stderr, "CANNOT OPEN %s\n", file2);
148 while(fgets(text, sizeof(text), stdin) != NULL) {
151 writeRecord(fd1, fd2, text);
161 int main(int argc, char *argv[])
164 fprintf(stderr, "usage:\ntxtwrite -d ROOMS1 ROOMS2 > rooms.txt\n");
165 fprintf(stderr, "txtwrite -d SPECIAL1 SPECIAL2 > special.txt\n");
166 fprintf(stderr, "txtwrite -d LINE > line.txt\n");
167 fprintf(stderr, "txtwrite -e ROOMS1 ROOMS2 < rooms.txt\n");
168 fprintf(stderr, "txtwrite -e SPECIAL1 SPECIAL2 < special.txt\n");
169 fprintf(stderr, "txtwrite -e LINE < line.txt\n");
173 if(stricmp(argv[1], "-d") == 0) {
175 return decode(argv[2], NULL);
177 return decode(argv[2], argv[3]);
178 } else if(stricmp(argv[1], "-e") == 0) {
180 return encode(argv[2], NULL);
182 return encode(argv[2], argv[3]);
185 fprintf(stderr, "ERROR\n");