/** * @file readfile.c * * * @brief 様々な入力からテキストを行単位で読み込む関数群 * * 入力ストリームやファイルデスクプリタなど,様々なソースから * テキスト入力を行単位で読み込むための関数群です. * 読み込み時において,空行は無視されます.また行末の改行は削除されます. * * * * @brief Read strings per line from various input source * * This file provides functions to read text inputs from various * input source such as file pointer, file descpritor, socket descriptor. * The input will be read per line, and the newline characters are removed. * Also, blank lines will be ignored. * * * @author Akinobu LEE * @date Thu Feb 17 16:41:58 2005 * * $Revision: 1.6 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include #include #ifdef HAVE_ZLIB #include #endif /** * Read one line from file that has been opened by fopen_readfile(). * Blank line will be skipped. * * @param buf [out] data buffer * @param maxlen [in] maximum length of above * @param fp [in] file pointer or gzFile pointer * * @return the buffer @a buf, or NULL on EOF or error. */ char * getl(char *buf, int maxlen, FILE *fp) { int newline; while( #ifdef HAVE_ZLIB gzgets((gzFile)fp, buf, maxlen) != Z_NULL #else fgets(buf, maxlen, fp) != NULL #endif ) { newline = strlen(buf)-1; /* chop newline */ if (buf[newline] == '\n') { buf[newline] = '\0'; newline--; } if (newline >= 0 && buf[newline] == '\r') buf[newline] = '\0'; if (buf[0] == '\0') continue; /* if blank line, read next */ return buf; } return NULL; } /** * Read one line from file pointer. * Blank line will be skipped. * * @param buf [out] data buffer * @param maxlen [in] maximum length of above * @param fp [in] file pointer * * @return the buffer @a buf, or NULL on EOF or error. */ char * getl_fp(char *buf, int maxlen, FILE *fp) { int newline; while(fgets(buf, maxlen, fp) != NULL) { newline = strlen(buf)-1; /* chop newline */ if (buf[newline] == '\n') { buf[newline] = '\0'; newline--; } if (newline >= 0 && buf[newline] == '\r') buf[newline] = '\0'; if (buf[0] == '\0') continue; /* if blank line, read next */ return buf; } return NULL; } /* get 1 line input from stdin with prompt */ /* return value: newly allocated buffer */ /* repeat if no input, and */ /* returns NULL on EOF */ /** * Get one file name from stdin with a prompt . Blank line is omitted. * * @param buf [out] buffer to hold input text line * @param buflen [in] length of the buffer * @param prompt [in] prompt string * * @return pointer to @a buf, or NULL on EOF input. */ char * get_line_from_stdin(char *buf, int buflen, char *prompt) { char *p; do { fprintf(stderr, "%s",prompt); if (fgets(buf, buflen, stdin) == NULL) { return(NULL); } /* chop last newline */ p = buf + strlen(buf) - 1; if (p >= buf && *p == '\n') { *(p --) = '\0'; } if (p >= buf && *p == '\r') { *(p --) = '\0'; } /* chop last space */ while(p >= buf && *p == ' ') { *(p --) = '\0'; } } while (!buf[0]); /* loop till some input */ return(buf); }