r2c.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder/***********************************************************************
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* This software is part of the ast package *
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski* Copyright (c) 1998-2011 AT&T Intellectual Property *
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian Maeder* and is licensed under the *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* Eclipse Public License, Version 1.0 *
b4fbc96e05117839ca409f5f20f97b3ac872d1edTill Mossakowski* by AT&T Intellectual Property *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* A copy of the License is available at *
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder* http://www.eclipse.org/org/documents/epl-v10.html *
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski* *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* Information and Software Systems Research *
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski* AT&T Research *
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski* Florham Park NJ *
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski* *
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski* Glenn Fowler <gsf@research.att.com> *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder* *
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder***********************************************************************/
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder#pragma prototyped
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder
f8b715ab2993083761c0aedb78f1819bcf67b6ccChristian Maeder/*
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder * Glenn Fowler
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder * AT&T Research
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder *
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder * convert delimited/terminated flat file from
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder * row major to col major order
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder */
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskistatic const char id[] = "\n@(#)$Id: r2c (AT&T Research) 1998-11-08 $\0\n";
0c2a90cbfb63865ff485c3fbe20a14589a5914beTill Mossakowski
9744c7d9fa61d255d5e73beec7edc3499522e9e2Till Mossakowski#include <ast.h>
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder#include <ctype.h>
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder#include <error.h>
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder#include <ls.h>
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski#include <sfdcgzip.h>
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maedertypedef struct Col_s
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder{
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder struct Col_s* next;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski Sfio_t* sp;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski} Col_t;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskistatic struct State_s
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski{
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski Col_t* cols;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski Col_t* last;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski size_t cache;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski size_t window;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski int delimiter;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski int level;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski int quote;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder int terminator;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder int test;
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder int verbose;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder} state;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder/*
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski * flush output to op
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder */
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederstatic int
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskiflush(Sfio_t* op)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder{
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski register Col_t* col;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder register size_t n;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder if ((col = state.cols) && sfstrtell(col->sp))
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder {
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder do
b10d6cef708b7a659f2d3b367e8e0db0d03ae3f5Till Mossakowski {
b10d6cef708b7a659f2d3b367e8e0db0d03ae3f5Till Mossakowski n = sfstrtell(col->sp);
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder if (sfwrite(op, sfstrseek(col->sp, 0, SEEK_SET), n) != n || sfsync(op))
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder {
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder error(ERROR_SYSTEM|2, "write error");
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder return -1;
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder }
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder } while (col = col->next);
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder }
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder state.cache = state.window;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder return 0;
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder}
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder/*
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder * convert one file from ip to op
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder */
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maederstatic int
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maederr2c(const char* file, Sfio_t* ip, Sfio_t* op)
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski{
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski register char* s;
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski register char* e;
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder register int d;
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder register int q;
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder register int t;
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder register Col_t* col;
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder register size_t w;
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder register size_t n;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder register size_t m;
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder char* b;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder w = state.cache;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski d = state.delimiter;
10a2cf8d9887524acde19d4ea59f8fea3a7f3258Till Mossakowski q = state.quote;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski t = state.terminator;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski while (s = sfgetr(ip, t, 0))
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski {
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder n = sfvalue(ip);
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder if (w < n)
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder {
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder if (n > state.window)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder {
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder error(2, "%s: input record larger than window size", file);
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder return -1;
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder }
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder if (flush(op))
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder return -1;
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder }
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder w -= n;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder col = state.cols;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder for (;;)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder {
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder if (!col)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder {
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder if (!(col = newof(0, Col_t, 1, 0)) || !(col->sp = sfstropen()))
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder error(ERROR_SYSTEM|3, "out of space [column]");
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder if (!state.cols)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder state.cols = col;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder else if (state.last)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder state.last->next = col;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder state.last = col;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder }
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder if (q && *s == q)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder {
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder b = s;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder e = s + n;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder while (++b < e)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder if (*b == q)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder {
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder b++;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder break;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder }
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder m = b - s;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski }
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder else if (e = memchr(s, d, n))
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder m = e - s + 1;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder else
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder m = n;
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder if (sfwrite(col->sp, s, m) != m)
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski {
612749008484b6773aedf4d6bbc85b8d074d15c6Christian Maeder error(ERROR_SYSTEM|2, "%s: column write error");
612749008484b6773aedf4d6bbc85b8d074d15c6Christian Maeder return -1;
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski }
1f086d5155f47fdad9a0de4e46bbebb2c4b33d30Christian Maeder if (!e)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder break;
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maeder s += m;
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder n -= m;
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder col = col->next;
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder }
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder }
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder if (sfgetr(ip, -1, 0))
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder {
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder error(2, "%s: last record incomplete", file);
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder return -1;
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder }
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder return 0;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski}
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskimain(int argc, char** argv)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski{
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder char* file;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski Sfio_t* ip;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski error_info.id = "r2c";
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.delimiter = ':';
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.terminator = '\n';
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.window = 4 * 1024 * 1024;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.level = 9;
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski for (;;)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski {
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski switch (optget(argv, "d:[delimiter]l#[compression-level]q:[quote]t:[terminator]vw#[window-size]T#[test-mask]"))
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski {
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski case 'd':
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.delimiter = *opt_info.arg;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski continue;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski case 'l':
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.level = opt_info.num;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski continue;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski case 'q':
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder state.quote = *opt_info.arg;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder continue;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder case 't':
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.delimiter = *opt_info.arg;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski continue;
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder case 'v':
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.verbose = 1;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder continue;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski case 'w':
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski state.window = opt_info.num;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder continue;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder case 'T':
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder state.test |= opt_info.num;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder continue;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder case '?':
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder error(ERROR_USAGE|4, opt_info.arg);
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder continue;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski case ':':
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski error(2, opt_info.arg);
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski continue;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder }
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder break;
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski }
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder argv += opt_info.index;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder if (error_info.errors)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder error(ERROR_USAGE|4, "%s", optusage(NiL));
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder state.cache = state.window;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder if (state.level > 0 && sfdcgzip(sfstdout, state.level) < 0)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder error(3, "output compress discipline error");
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder if (!*argv)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder r2c("/dev/stdin", sfstdin, sfstdout);
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder else
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder while (file = *argv++)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder {
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder if (streq(file, "-"))
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder {
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder file = "/dev/stdin";
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder ip = sfstdin;
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder }
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder else if (!(ip = sfopen(NiL, file, "r")))
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder {
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder error(ERROR_SYSTEM|2, "%s: cannot read", file);
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder continue;
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski }
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder r2c(file, ip, sfstdout);
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder if (ip != sfstdin)
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder sfclose(ip);
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder }
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder flush(sfstdout);
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder return error_info.errors != 0;
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder}
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder