--- /dev/null
+/*****************************************************************************\
+* *
+* Name : splitter *
+* Author : Chris Koeritz *
+* *
+* Purpose: *
+* *
+* Takes text as input and splits the lines so that they will fit on a *
+* standard 80 column terminal. *
+* *
+*******************************************************************************
+* Copyright (c) 1993-$now By Author. This program is free software; you can *
+* redistribute it and/or modify it under the terms of the GNU General Public *
+* License as published by the Free Software Foundation; either version 2 of *
+* the License or (at your option) any later version. This is online at: *
+* http://www.fsf.org/copyleft/gpl.html *
+* Please send any updates to: fred@gruntose.com *
+\*****************************************************************************/
+
+#include <application/hoople_main.h>
+#include <basis/astring.h>
+#include <filesystem/byte_filer.h>
+#include <filesystem/filename.h>
+#include <loggers/console_logger.h>
+#include <loggers/file_logger.h>
+#include <structures/static_memory_gremlin.h>
+#include <structures/set.h>
+#include <textual/string_manipulation.h>
+
+#include <stdio.h>
+
+using namespace application;
+using namespace basis;
+using namespace filesystem;
+using namespace loggers;
+using namespace structures;
+using namespace textual;
+
+const int MAX_BUFFER = 1024;
+
+class splitter_app : public application_shell
+{
+public:
+ splitter_app() : application_shell() {}
+
+ DEFINE_CLASS_NAME("splitter_app");
+
+ virtual int execute();
+
+ int print_instructions();
+
+private:
+};
+
+//////////////
+
+int splitter_app::print_instructions()
+{
+ astring name = filename(_global_argv[0]).basename().raw();
+ log(a_sprintf("%s usage:", name.s()));
+ log(astring::empty_string());
+ log(a_sprintf("\
+This program splits long lines in input files into a more reasonable size.\n\
+Any filenames on the command line are split and sent to standard output.\n\
+The following options change how the splitting is performed:\n\
+ --help or -?\tShow this help information.\n\
+ --mincol N\tMinimum column to use for output.\n\
+ --maxcol N\tMinimum column to use for output.\n\
+"));
+ return -3;
+}
+
+int splitter_app::execute()
+{
+ command_line cmds(_global_argc, _global_argv); // parse the command line up.
+
+ // retrieve any specific flags first.
+ astring temp;
+ int min_col = 0;
+ if (cmds.get_value("mincol", temp))
+ min_col = temp.convert(min_col);
+ int max_col = 77;
+ if (cmds.get_value("maxcol", temp))
+ max_col = temp.convert(max_col);
+ // look for help command.
+ int junk_index = 0;
+ if (cmds.find("help", junk_index, false)
+ || cmds.find('h', junk_index, false)
+ || cmds.find("?", junk_index, false)
+ || cmds.find('?', junk_index, false) ) {
+ print_instructions();
+ return 0;
+ }
+
+ // gather extra input files.
+ string_set input_files;
+ for (int i = 0; i < cmds.entries(); i++) {
+ const command_parameter &curr = cmds.get(i);
+ if (curr.type() == command_parameter::VALUE) {
+//log(astring("adding input file:") + curr.text());
+ input_files += curr.text();
+ }
+ }
+
+ astring accumulator;
+ for (int q = 0; q < input_files.length(); q++) {
+ byte_filer current(input_files[q], "r");
+ if (!current.good()) continue;
+ while (!current.eof()) {
+ astring line_read;
+ int num_chars = current.getline(line_read, MAX_BUFFER);
+ if (!num_chars) continue;
+//printf("line len=%d, cont=%s\n", line_read.length(), line_read.s());
+ accumulator += line_read;
+//// accumulator += '\n';
+ }
+ }
+
+ // now get from standard input if there weren't any files specified.
+ if (!input_files.length()) {
+ char input_line[MAX_BUFFER + 2];
+ while (!feof(stdin)) {
+ char *got = fgets(input_line, MAX_BUFFER, stdin);
+ if (!got) break;
+//printf("line=%s\n", got);
+ accumulator += got;
+//// accumulator += '\n';
+ }
+ }
+//printf("splitting accum with %d chars...\n", accumulator.length());
+ astring chewed;
+ string_manipulation::split_lines(accumulator, chewed, min_col, max_col);
+//printf("chewed string now has %d chars...\n", chewed.length());
+ printf("%s", chewed.s());
+ return 0;
+}
+
+//////////////
+
+HOOPLE_MAIN(splitter_app, )
+