summaryrefslogtreecommitdiff
path: root/src/join.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1994-01-09 03:47:21 +0000
committerJim Meyering <jim@meyering.net>1994-01-09 03:47:21 +0000
commit07cd9a8d1563ddc8627f762e67fffae95fd6ab30 (patch)
tree3ea6f2c5b82f78d41db79729b21986848d6e4e3a /src/join.c
parent4f90578a4f0cdb2e9f708d924dd67e6a5b9cd289 (diff)
downloadcoreutils-07cd9a8d1563ddc8627f762e67fffae95fd6ab30.tar.xz
safe_read and full_write + join patch
Diffstat (limited to 'src/join.c')
-rw-r--r--src/join.c47
1 files changed, 41 insertions, 6 deletions
diff --git a/src/join.c b/src/join.c
index 21ed852a6..d07c0e820 100644
--- a/src/join.c
+++ b/src/join.c
@@ -44,6 +44,7 @@ void error ();
static void usage ();
#define min(A, B) ((A) < (B) ? (A) : (B))
+#define max(A, B) ((A) > (B) ? (A) : (B))
/* An element of the list describing the format of each
output line. */
@@ -115,6 +116,10 @@ static struct option const longopts[] =
{NULL, 0, NULL, 0}
};
+/* Used to print non-joining lines */
+static struct line blank1;
+static struct line blank2;
+
/* Fill in the `fields' structure in LINE. */
static void
@@ -404,7 +409,7 @@ join (fp1, fp2)
if (diff < 0)
{
if (print_unpairables_1)
- prline (&seq1.lines[0]);
+ prjoin (&seq1.lines[0], &blank2);
freeline (&seq1.lines[0]);
seq1.count = 0;
getseq (fp1, &seq1);
@@ -413,7 +418,7 @@ join (fp1, fp2)
if (diff > 0)
{
if (print_unpairables_2)
- prline (&seq2.lines[0]);
+ prjoin (&blank1, &seq2.lines[0]);
freeline (&seq2.lines[0]);
seq2.count = 0;
getseq (fp2, &seq2);
@@ -474,22 +479,22 @@ join (fp1, fp2)
if (print_unpairables_1 && seq1.count)
{
- prline (&seq1.lines[0]);
+ prjoin(&seq1.lines[0], &blank2);
freeline (&seq1.lines[0]);
while (get_line (fp1, &line))
{
- prline (&line);
+ prjoin(&line, &blank2);
freeline (&line);
}
}
if (print_unpairables_2 && seq2.count)
{
- prline (&seq2.lines[0]);
+ prjoin(&blank1, &seq2.lines[0]);
freeline (&seq2.lines[0]);
while (get_line (fp2, &line))
{
- prline (&line);
+ prjoin(&blank1, &line);
freeline (&line);
}
}
@@ -541,6 +546,10 @@ add_field_list (str)
if (*str == ',' || ISBLANK (*str))
{
added += add_field (file, field);
+ switch (file) {
+ case 1: blank1.nfields = max(blank1.nfields, field); break;
+ case 2: blank2.nfields = max(blank2.nfields, field); break;
+ }
file = field = -1;
dot_found = 0;
}
@@ -569,6 +578,24 @@ add_field_list (str)
return added;
}
+/* Create a blank line with COUNT fields separated by tabs. */
+
+void
+make_blank (blank, count)
+ struct line *blank;
+ int count;
+{
+ int i;
+ blank->beg = xmalloc(blank->nfields + 1);
+ blank->fields = (struct field *)xmalloc(sizeof(struct field) * count);
+ for (i = 0; i < blank->nfields; i++) {
+ blank->beg[i] = '\t';
+ blank->fields[i].lim = blank->fields[i].beg = &blank->beg[i];
+ }
+ blank->beg[i] = '\0';
+ blank->lim = &blank->beg[i];
+}
+
void
main (argc, argv)
int argc;
@@ -578,10 +605,18 @@ main (argc, argv)
FILE *fp1, *fp2;
int optc, prev_optc = 0, nfiles, val;
+ blank1.nfields = 1;
+ blank2.nfields = 1;
+
program_name = argv[0];
parse_long_options (argc, argv, usage);
+ /* Now that we've seen the options, we can construct the blank line
+ structures. */
+ make_blank(&blank1, blank1.nfields);
+ make_blank(&blank2, blank2.nfields);
+
nfiles = 0;
print_pairables = 1;