mirror of
https://github.com/ascii-boxes/boxes.git
synced 2025-06-19 17:28:26 +02:00
... still programming ...
Added infile/outfile parameter code (pasted from tal, more or less) Added code to remove trailing spaces from output lines
This commit is contained in:
parent
32e1584b43
commit
3271315a45
156
src/boxes.c
156
src/boxes.c
@ -3,7 +3,7 @@
|
|||||||
* Date created: March 18, 1999 (Thursday, 15:09h)
|
* Date created: March 18, 1999 (Thursday, 15:09h)
|
||||||
* Author: Thomas Jensen
|
* Author: Thomas Jensen
|
||||||
* tsjensen@stud.informatik.uni-erlangen.de
|
* tsjensen@stud.informatik.uni-erlangen.de
|
||||||
* Version: $Id: boxes.c,v 1.5 1999/03/31 17:34:21 tsjensen Exp tsjensen $
|
* Version: $Id: boxes.c,v 1.6 1999/04/01 17:26:18 tsjensen Exp tsjensen $
|
||||||
* Language: ANSI C
|
* Language: ANSI C
|
||||||
* Platforms: sunos5/sparc, for now
|
* Platforms: sunos5/sparc, for now
|
||||||
* World Wide Web: http://home.pages.de/~jensen/boxes/
|
* World Wide Web: http://home.pages.de/~jensen/boxes/
|
||||||
@ -14,6 +14,13 @@
|
|||||||
* Revision History:
|
* Revision History:
|
||||||
*
|
*
|
||||||
* $Log: boxes.c,v $
|
* $Log: boxes.c,v $
|
||||||
|
* Revision 1.6 1999/04/01 17:26:18 tsjensen
|
||||||
|
* ... still programming ...
|
||||||
|
* Some bug fixes
|
||||||
|
* Added size option (-s)
|
||||||
|
* Added Alignment Option (-a)
|
||||||
|
* It seems actually usable for drawing boxes :-)
|
||||||
|
*
|
||||||
* Revision 1.5 1999/03/31 17:34:21 tsjensen
|
* Revision 1.5 1999/03/31 17:34:21 tsjensen
|
||||||
* ... still programming ...
|
* ... still programming ...
|
||||||
* (some bug fixes and restructuring)
|
* (some bug fixes and restructuring)
|
||||||
@ -43,6 +50,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "boxes.h"
|
#include "boxes.h"
|
||||||
|
|
||||||
extern int snprintf (char *, size_t, const char *, ...); /* stdio.h */
|
extern int snprintf (char *, size_t, const char *, ...); /* stdio.h */
|
||||||
@ -51,7 +59,7 @@ extern char *optarg; /* for getopt() */
|
|||||||
extern int optind, opterr, optopt; /* for getopt() */
|
extern int optind, opterr, optopt; /* for getopt() */
|
||||||
|
|
||||||
|
|
||||||
#ident "$Id: boxes.c,v 1.5 1999/03/31 17:34:21 tsjensen Exp tsjensen $"
|
#ident "$Id: boxes.c,v 1.6 1999/04/01 17:26:18 tsjensen Exp tsjensen $"
|
||||||
|
|
||||||
extern FILE *yyin; /* lex input file */
|
extern FILE *yyin; /* lex input file */
|
||||||
|
|
||||||
@ -116,6 +124,8 @@ struct { /* Command line options: */
|
|||||||
long reqheight; /* requested box height (-s) */
|
long reqheight; /* requested box height (-s) */
|
||||||
char valign; /* text position inside box */
|
char valign; /* text position inside box */
|
||||||
char halign; /* ('c', 'l', or 'r') */
|
char halign; /* ('c', 'l', or 'r') */
|
||||||
|
FILE *infile;
|
||||||
|
FILE *outfile;
|
||||||
} opt;
|
} opt;
|
||||||
|
|
||||||
|
|
||||||
@ -373,6 +383,7 @@ static int process_commandline (int argc, char *argv[])
|
|||||||
int idummy;
|
int idummy;
|
||||||
char *pdummy;
|
char *pdummy;
|
||||||
int errfl = 0; /* true on error */
|
int errfl = 0; /* true on error */
|
||||||
|
int outfile_existed; /* true if we overwrite a file */
|
||||||
|
|
||||||
memset (&opt, 0, sizeof(opt));
|
memset (&opt, 0, sizeof(opt));
|
||||||
opt.tabstop = DEF_TABSTOP;
|
opt.tabstop = DEF_TABSTOP;
|
||||||
@ -568,7 +579,7 @@ static int process_commandline (int argc, char *argv[])
|
|||||||
s = getenv ("HOME");
|
s = getenv ("HOME");
|
||||||
if (s) {
|
if (s) {
|
||||||
strncpy (buf, s, PATH_MAX);
|
strncpy (buf, s, PATH_MAX);
|
||||||
buf[PATH_MAX-1-7] = '\0'; /* ensure space for /.boxes */
|
buf[PATH_MAX-1-7] = '\0'; /* ensure space for "/.boxes" */
|
||||||
strcat (buf, "/.boxes");
|
strcat (buf, "/.boxes");
|
||||||
f = fopen (buf, "r");
|
f = fopen (buf, "r");
|
||||||
if (f) {
|
if (f) {
|
||||||
@ -589,6 +600,72 @@ static int process_commandline (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Input and Output Files
|
||||||
|
*
|
||||||
|
* After any command line options, an input file and an output file may
|
||||||
|
* be specified (in that order). "-" may be substituted for standard
|
||||||
|
* input or output. A third file name would be invalid.
|
||||||
|
* The alogrithm is as follows:
|
||||||
|
*
|
||||||
|
* If no files are given, use stdin and stdout.
|
||||||
|
* Else If infile is "-", use stdin for input
|
||||||
|
* Else open specified file (die if it doesn't work)
|
||||||
|
* If no output file is given, use stdout for output
|
||||||
|
* Else If outfile is "-", use stdout for output
|
||||||
|
* Else open specified file for writing (die if it doesn't work)
|
||||||
|
* If a third file is given, die.
|
||||||
|
*/
|
||||||
|
if (argv[optind] == NULL) { /* neither infile nor outfile given */
|
||||||
|
opt.infile = stdin;
|
||||||
|
opt.outfile = stdout;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
if (strcmp (argv[optind], "-") == 0) {
|
||||||
|
opt.infile = stdin; /* use stdin for input */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opt.infile = fopen (argv[optind], "r");
|
||||||
|
if (opt.infile == NULL) {
|
||||||
|
fprintf (stderr, "%s: Can\'t open input file -- %s\n", PROJECT,
|
||||||
|
argv[optind]);
|
||||||
|
return 9; /* can't read infile */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv[optind+1] == NULL) {
|
||||||
|
opt.outfile = stdout; /* no outfile given */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (strcmp (argv[optind+1], "-") == 0) {
|
||||||
|
opt.outfile = stdout; /* use stdout for output */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outfile_existed = !access (argv[optind+1], F_OK);
|
||||||
|
opt.outfile = fopen (argv[optind+1], "w");
|
||||||
|
if (opt.outfile == NULL) {
|
||||||
|
perror (PROJECT);
|
||||||
|
if (opt.infile != stdin)
|
||||||
|
fclose (opt.infile);
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (argv[optind+2]) { /* illegal third file */
|
||||||
|
fprintf (stderr, "%s: illegal parameter -- %s\n",
|
||||||
|
PROJECT, argv[optind+2]);
|
||||||
|
usage (stderr);
|
||||||
|
if (opt.infile != stdin)
|
||||||
|
fclose (opt.infile);
|
||||||
|
if (opt.outfile != stdout) {
|
||||||
|
fclose (opt.outfile);
|
||||||
|
if (!outfile_existed) unlink (argv[optind+1]);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -621,10 +698,10 @@ int list_styles()
|
|||||||
list[i] = &(designs[i]);
|
list[i] = &(designs[i]);
|
||||||
qsort (list, design_idx+1, sizeof(design_t *), style_sort);
|
qsort (list, design_idx+1, sizeof(design_t *), style_sort);
|
||||||
|
|
||||||
printf ("Available Styles:\n");
|
fprintf (opt.outfile, "Available Styles:\n");
|
||||||
printf ("-----------------\n\n");
|
fprintf (opt.outfile, "-----------------\n\n");
|
||||||
for (i=0; i<=design_idx; ++i)
|
for (i=0; i<=design_idx; ++i)
|
||||||
printf ("%s (%s):\n\n%s\n\n", list[i]->name,
|
fprintf (opt.outfile, "%s (%s):\n\n%s\n\n", list[i]->name,
|
||||||
list[i]->author? list[i]->author: "unknown artist",
|
list[i]->author? list[i]->author: "unknown artist",
|
||||||
list[i]->sample);
|
list[i]->sample);
|
||||||
|
|
||||||
@ -681,6 +758,26 @@ static size_t expand_tabs_into (const char *input_buffer, const int in_len,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void btrim (char *text, size_t *len)
|
||||||
|
/*
|
||||||
|
* Remove trailing whitespace from line.
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
long idx = (long) (*len) - 1;
|
||||||
|
|
||||||
|
while (idx >= 0 && (text[idx] == '\n' || text[idx] == '\r'
|
||||||
|
|| text[idx] == '\t' || text[idx] == ' '))
|
||||||
|
{
|
||||||
|
text[idx--] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
*len = idx + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int read_all_input()
|
int read_all_input()
|
||||||
/*
|
/*
|
||||||
* Read entire input from stdin and store it in 'input' array.
|
* Read entire input from stdin and store it in 'input' array.
|
||||||
@ -705,7 +802,7 @@ int read_all_input()
|
|||||||
input.indent = LINE_MAX;
|
input.indent = LINE_MAX;
|
||||||
input.maxline = 0;
|
input.maxline = 0;
|
||||||
|
|
||||||
while (fgets (buf, LINE_MAX+1, stdin))
|
while (fgets (buf, LINE_MAX+1, opt.infile))
|
||||||
{
|
{
|
||||||
if (input_size % 100 == 0) {
|
if (input_size % 100 == 0) {
|
||||||
input_size += 100;
|
input_size += 100;
|
||||||
@ -720,15 +817,7 @@ int read_all_input()
|
|||||||
|
|
||||||
input.lines[input.anz_lines].len = strlen (buf);
|
input.lines[input.anz_lines].len = strlen (buf);
|
||||||
|
|
||||||
while (input.lines[input.anz_lines].len > 0 &&
|
btrim (buf, &(input.lines[input.anz_lines].len));
|
||||||
(buf[input.lines[input.anz_lines].len-1] == '\n'
|
|
||||||
|| buf[input.lines[input.anz_lines].len-1] == '\r'
|
|
||||||
|| buf[input.lines[input.anz_lines].len-1] == ' '
|
|
||||||
|| buf[input.lines[input.anz_lines].len-1] == '\t'))
|
|
||||||
{
|
|
||||||
buf[input.lines[input.anz_lines].len-1] = '\0';
|
|
||||||
input.lines[input.anz_lines].len -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (input.lines[input.anz_lines].len > 0) {
|
if (input.lines[input.anz_lines].len > 0) {
|
||||||
newlen = expand_tabs_into (buf,
|
newlen = expand_tabs_into (buf,
|
||||||
@ -1576,6 +1665,8 @@ static int output_box (const sentry_t *thebox)
|
|||||||
size_t hfill;
|
size_t hfill;
|
||||||
char *hfill1, *hfill2; /* space before/after text */
|
char *hfill1, *hfill2; /* space before/after text */
|
||||||
size_t r;
|
size_t r;
|
||||||
|
char obuf[LINE_MAX+1]; /* final output buffer */
|
||||||
|
size_t obuf_len; /* length of content of obuf */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create string of spaces for indentation
|
* Create string of spaces for indentation
|
||||||
@ -1668,15 +1759,16 @@ static int output_box (const sentry_t *thebox)
|
|||||||
for (j=0; j<nol; ++j) {
|
for (j=0; j<nol; ++j) {
|
||||||
|
|
||||||
if (j < thebox[BTOP].height) {
|
if (j < thebox[BTOP].height) {
|
||||||
printf ("%s%s%s%s\n", indentspc, thebox[BLEF].chars[j],
|
snprintf (obuf, LINE_MAX+1, "%s%s%s%s", indentspc,
|
||||||
thebox[BTOP].chars[j], thebox[BRIG].chars[j]);
|
thebox[BLEF].chars[j], thebox[BTOP].chars[j],
|
||||||
|
thebox[BRIG].chars[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (vfill1) {
|
else if (vfill1) {
|
||||||
r = thebox[BTOP].width;
|
r = thebox[BTOP].width;
|
||||||
trailspc[r] = '\0';
|
trailspc[r] = '\0';
|
||||||
printf ("%s%s%s%s\n", indentspc, thebox[BLEF].chars[j],
|
snprintf (obuf, LINE_MAX+1, "%s%s%s%s", indentspc,
|
||||||
trailspc, thebox[BRIG].chars[j]);
|
thebox[BLEF].chars[j], trailspc, thebox[BRIG].chars[j]);
|
||||||
trailspc[r] = ' ';
|
trailspc[r] = ' ';
|
||||||
--vfill1;
|
--vfill1;
|
||||||
}
|
}
|
||||||
@ -1686,24 +1778,38 @@ static int output_box (const sentry_t *thebox)
|
|||||||
if (ti < (long) input.anz_lines) {
|
if (ti < (long) input.anz_lines) {
|
||||||
r = input.maxline - input.lines[ti].len;
|
r = input.maxline - input.lines[ti].len;
|
||||||
trailspc[r] = '\0';
|
trailspc[r] = '\0';
|
||||||
printf ("%s%s%s%s%s%s%s\n", indentspc, thebox[BLEF].chars[j],
|
snprintf (obuf, LINE_MAX+1, "%s%s%s%s%s%s%s", indentspc,
|
||||||
hfill1, ti >= 0? input.lines[ti].text : "", hfill2,
|
thebox[BLEF].chars[j], hfill1,
|
||||||
|
ti >= 0? input.lines[ti].text : "", hfill2,
|
||||||
trailspc, thebox[BRIG].chars[j]);
|
trailspc, thebox[BRIG].chars[j]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
r = thebox[BTOP].width;
|
r = thebox[BTOP].width;
|
||||||
trailspc[r] = '\0';
|
trailspc[r] = '\0';
|
||||||
printf ("%s%s%s%s\n", indentspc, thebox[BLEF].chars[j],
|
snprintf (obuf, LINE_MAX+1, "%s%s%s%s", indentspc,
|
||||||
trailspc, thebox[BRIG].chars[j]);
|
thebox[BLEF].chars[j], trailspc, thebox[BRIG].chars[j]);
|
||||||
}
|
}
|
||||||
trailspc[r] = ' ';
|
trailspc[r] = ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
printf ("%s%s%s%s\n", indentspc, thebox[BLEF].chars[j],
|
snprintf (obuf, LINE_MAX+1, "%s%s%s%s", indentspc,
|
||||||
|
thebox[BLEF].chars[j],
|
||||||
thebox[BBOT].chars[j-(nol-thebox[BBOT].height)],
|
thebox[BBOT].chars[j-(nol-thebox[BBOT].height)],
|
||||||
thebox[BRIG].chars[j]);
|
thebox[BRIG].chars[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obuf_len = strlen (obuf);
|
||||||
|
|
||||||
|
if (obuf_len > LINE_MAX) {
|
||||||
|
size_t newlen = LINE_MAX;
|
||||||
|
btrim (obuf, &newlen);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
btrim (obuf, &obuf_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf (opt.outfile, "%s\n", obuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
BFREE (indentspc);
|
BFREE (indentspc);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user