dockapps/wmcalc/readln.c
Doug Torrance a50001bbe9 wmcalc: Add version 0.4 to repository.
Source obtained from:
ftp://ftp.afterstep.org/stable/rpms/misc-tarballs/wmcalc-0.4.tar.gz
2015-01-10 19:02:57 +00:00

60 lines
1.8 KiB
C

/* readln.c - Edward H. Flora - ehflora@ksu.edu */
/* Last Modified: 2/24/98 */
/*
* This function reads a string from a file pointed to by fp until a
* new line (EOLN) or an end of file is encountered. It returns a pointer
* to the string. The new line character is included in the string returned
* by the function.
*/
/* EXTERNALS:
******************
* Functions Called:
* Standard Libraries.
*
* Header Files Included:
* Standard Includes only.
*/
/* PORTABILITY:
******************
* Coded in ANSI C, using ANSI prototypes.
*/
/****** Include Files *************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EOLN '\n' /* Defines the new line character */
#define SIZE1 10 /* Defines the increment to increase the */
/* string by until a newline of EOF is found */
/****** Function to Read a Line from fp *******************************/
char *readln(FILE *fp){
char *tmp, *t1, *t2;
int count = 0, s1 = SIZE1;
if((tmp = malloc(SIZE1*sizeof(char))) == NULL)return NULL;
/* If cannot allocate memory */
if((t1 = fgets(tmp, SIZE1, fp)) == NULL){
free(tmp);
return NULL;
} /* If there is no string to be read */
while(strchr(t1,EOLN) == NULL){ /* Loop while EOLN is not in the string */
count += strlen(t1);
if((s1 - count) > 1)break;
s1 +=SIZE1;
if((t2 = realloc(tmp, s1*sizeof(char))) == NULL){
free(tmp);
return NULL;
} /* If cannot allocate more memory */
else tmp = t2;
if((t1 = fgets((tmp+count),((s1 - count)),fp)) == NULL)break;
} /* End of While Loop */
if((t2 = realloc(tmp,strlen(tmp)+1)) == NULL)free(tmp);
return (t2);
}
/****** End of Function readln ****************************************/