% % (c) The GRASP/AQUA Project, Glasgow University, 1994 % \subsection[readFile.lc]{hGetContents Runtime Support} \begin{code} #include "rtsdefs.h" #include "stgio.h" #define EOT 4 StgInt readBlock(buf, fp, size) StgAddr buf; StgAddr fp; StgInt size; { int count; if (feof((FILE *) fp)) { ghc_errtype = ERR_EOF; ghc_errstr = ""; return -1; } while ((count = fread(buf, 1, size, (FILE *) fp)) == 0) { if (feof((FILE *) fp)) { ghc_errtype = ERR_EOF; ghc_errstr = ""; return -1; } else if (errno != EINTR) { cvtErrno(); stdErrno(); return -1; } clearerr((FILE *) fp); } return count; } StgInt readLine(buf, fp, size) StgAddr buf; StgAddr fp; StgInt size; { if (feof((FILE *) fp)) { ghc_errtype = ERR_EOF; ghc_errstr = ""; return -1; } while (fgets(buf, size, (FILE *) fp) == NULL) { if (feof((FILE *) fp)) { ghc_errtype = ERR_EOF; ghc_errstr = ""; return -1; } else if (errno != EINTR) { cvtErrno(); stdErrno(); return -1; } clearerr((FILE *) fp); } return strlen(buf); } StgInt readChar(fp) StgAddr fp; { int c; if (feof((FILE *) fp)) { ghc_errtype = ERR_EOF; ghc_errstr = ""; return -1; } while ((c = getc((FILE *) fp)) == EOF) { if (feof((FILE *) fp)) { ghc_errtype = ERR_EOF; ghc_errstr = ""; return -1; } else if (errno != EINTR) { cvtErrno(); stdErrno(); return -1; } clearerr((FILE *) fp); } if (isatty(fileno((FILE *) fp)) && c == EOT) return EOF; else return c; } \end{code}