/* getline.c version 1.0 PA0GRI */
#include <stdio.h>
#include <ctype.h>
#include "global.h"

/*
 *	getline() 
 *	to read a line from a domain file and return a usefull line
 *	completely assembled (if multy line)
 *	It skips any connent lines. It follows rfc 1133 , 1134 , 1135 , 1136.
 */
char *
getline(fp)
FILE *fp;
{
	char *line;
	char *contline;
	char *chrptr1;
	char *chrptr2;
	int s1,s2;
	int loop = 1;

	if(fp == NULLFILE)
		return NULLCHAR;	/* just in case */
	line = mallocw(256);		/* get buffer space */
	while(loop){
		if(fgets(line,256,fp) == NULL){
			free(line);
			return NULLCHAR;
		}
		if(line[0] == '#' || line[0] == ';')
			continue;	/* skip comment lines */
		if((s1 = strlen(line)) < 2)
			continue;	/* empty line */
		loop = 0;		/* none of above */
	}
	line[s1-1] = '\0';		/* kill nl */
	if((chrptr1 = strchr(line,';')) != NULLCHAR){
		*chrptr1 = '\0';	/* eliminate comment */
		s1 = strlen(line);	/* recompute line size */
	}
	if((chrptr1 = strchr(line,'(')) != NULLCHAR){ /* continuation */
		*chrptr1 = ' ';			/* replace with space */
		if((chrptr2 = strchr(line,')')) != NULLCHAR){ /* continuation */
			*chrptr2 = ' ';		/* replace with space */
			return line;		/* complete line */
		}
		loop = 1;
	}
	contline = mallocw(256);	/* get buffer space */
	while(loop){
		if(fgets(contline,256,fp) == NULL){
			free(line);
			free(contline);
			return NULLCHAR;
		}
		s2 = strlen(contline);
		contline[s2-1] = '\0';	/* kill nl */
		if(line[0] == '#' || line[0] == ';')
			continue;	/* skip comment lines */
		if((s1 = strlen(line)) < 2)
			continue;	/* empty line */
		if((chrptr1 = strchr(contline,';')) != NULLCHAR){
			*chrptr1 = '\0';	/* eliminate comment */
			s2 = strlen(contline);	/* recompute line size */
		}
		chrptr1 = mallocw(s1+s2+2);
		sprintf(chrptr1,"%s %s",line,contline);
		free(line);
		line = chrptr1;
		if((chrptr2 = strchr(line,')')) != NULLCHAR){ /* continuation */
			*chrptr2 = ' ';		/* replace with space */
			loop = 0;
		}

	}
	free(contline);
	return line;
}
