/*
 * Refer to file UPDNODES.H for copyright and version information
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "updnodes.h"
#ifdef	oldcc
#include <memory.h>
#endif	/* oldcc */

#ifndef	oldcc
void write_node(NODE_ENTRY * maj)
#else
void write_node(maj)
NODE_ENTRY * maj;
#endif	/* oldcc */
{
    TAG_ENTRY * min;
    static char line[255];
    static char temp[255];
    int checksum_needed;

    checksum_needed = TRUE;
    if (!maj)				return;

    validate_checksum(maj, "for output information", &new_checksum);

    sprintf(line, ":%s.%s", major_tag, maj->name);

    for (min = maj->tags; min->name[0]; min++) {
	if (!min->value[0])		continue;
	if (!strcmp(min->name, "cks")) {
	    sprintf(temp, " :cks.%u", maj->checksum);
	    checksum_needed = FALSE;
	} else {
	    sprintf(temp, " :%s.%s", min->name, min->value);
	}

	if (strlen(temp) + strlen(line) >= (unsigned int) linemax) {
	    fputs(line, out);
	    fputc('\n', out);
	    strcpy(line, "    ");
	}
	strcat(line, temp);
    }

    if (checksum_needed) {
	if (sprintf(temp, " :cks.%u", maj->checksum) + strlen(line) >= linemax) {
	    fputs(line, out);
	    fputc('\n', out);
	    strcpy(line, "    ");
	}
	strcat(line, temp);
    }

    fputs(line, out);
    fputc('\n', out);
    log_line(LOG_MUNDANE, "Entry %s done.\n", maj->name);
}

#ifndef	oldcc
void read_delta_line(void)
#else
void read_delta_line()
#endif	/* oldcc */
{
    if (!feof(delta)) {
	fgets(deltaline, 255, delta);
    }
    trim(deltaline);
}

#ifndef	oldcc
void read_base_line(void)
#else
void read_base_line()
#endif	/* oldcc */
{
    if (!feof(base)) {
	fgets(baseline, 255, base);
    }
    trim(baseline);
}

#ifndef	oldcc
int get_delta_tag(NODE_ENTRY * major)
#else
int get_delta_tag(major)
NODE_ENTRY * major;
#endif	/* oldcc */
{
    char * p;
    char * q;
    static int last_read_eof = FALSE;

    memset((char *) major, 0, sizeof(NODE_ENTRY));

    if (last_read_eof) {
	return(FALSE);
    }

    strncpy(major->action, deltaline, 3);

    p = deltaline + 4;
    q = strchr(p, ' ');
    if (!q) {
	q = deltaline + strlen(deltaline);
	*(q+1) = '\0';
    }
    strncpy(major->name, p, q - p);

    p = q + 1;

    do {
	parse_line(major, p);
	read_delta_line();
	p = deltaline;
	if (feof(delta)) {
	    last_read_eof = TRUE;
	    return(TRUE);
	}
    } while (isspace(*deltaline));

    return (TRUE);
}

#ifndef	oldcc
int get_base_tag(NODE_ENTRY * major)
#else
int get_base_tag(major)
NODE_ENTRY * major;
#endif	/* oldcc */
{
    char * p;
    char * q;
    static int last_read_eof = FALSE;

    if (!major_tag_length) {
	major_tag_length = strlen(major_tag);
    }

    memset((char *) major, 0, sizeof(NODE_ENTRY));

    if (last_read_eof) {
	return (FALSE);
    }

    if (strlen(baseline) <= (unsigned) major_tag_length) {
	error("get_base_tag: Ooops! Base line shorter than major tag name.\n");
	exit(SYSERROR);
    }

    p = baseline + major_tag_length + 2;
    q = strchr(p, ' ');                 /* Find end of major tag */
    if (!q) {
	q = baseline + strlen(baseline);
	*(q+1) = '\0';
    }
    strncpy(major->name, p, q - p);

    p = q + 1;				/* Point to beginning of next tag */

    do {
	parse_line(major, p);
	read_base_line();
	p = baseline;
	if (feof(base)) {
	    last_read_eof = TRUE;
	    break;
	}
    } while (strncmp(baseline, ":node.", 6) != 0);

    validate_checksum(major, "for original base", &old_checksum);

    return (TRUE);
}

/*
 *  Remove trailing whitespace
 */

#ifndef	oldcc
char * trim(char * s)
#else
char * trim(s)
char * s;
#endif	/* oldcc */
{
    int t;

    for (t = strlen(s) - 1; t && isspace(s[t]); t--);
    if (!t && isspace(s[t])) {
	*s = '\0';
    } else {
	s[++t] = '\0';
    }

    return(s);
}
