/* Implement runtime actions for CHILL. Copyright (C) 1992,1993 Free Software Foundation, Inc. Author: Wilfried Moser This file is part of GNU CC. GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include "iomodes.h" /* predefined associations, accesses, and text for stdin, stdout, stderr */ /* stdin */ #define STDIO_TEXT_LENGTH 1024 #define STDIN_TEXT_LENGTH STDIO_TEXT_LENGTH static Access_Mode stdin_access; #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif static Association_Mode stdin_association = { IO_EXISTING | IO_READABLE | IO_SEQUENCIBLE | IO_ISASSOCIATED, NULL, &stdin_access, STDIN_FILENO, NULL, 0, ReadOnly }; static Access_Mode stdin_access = { IO_TEXTIO, STDIN_TEXT_LENGTH + 2, 0, 0, &stdin_association, 0, NULL, VaryingChars }; static VARYING_STRING(STDIN_TEXT_LENGTH) stdin_text_record; Text_Mode chill_stdin = { IO_TEXTLOCATION, (VarString *)&stdin_text_record, &stdin_access, 0 }; /* stdout */ #define STDOUT_TEXT_LENGTH STDIO_TEXT_LENGTH #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif static Access_Mode stdout_access; static Association_Mode stdout_association = { IO_EXISTING | IO_WRITEABLE | IO_SEQUENCIBLE | IO_ISASSOCIATED, NULL, &stdout_access, STDOUT_FILENO, NULL, 0, WriteOnly }; static Access_Mode stdout_access = { IO_TEXTIO, STDOUT_TEXT_LENGTH + 2, 0, 0, &stdout_association, 0, NULL, VaryingChars }; static VARYING_STRING(STDOUT_TEXT_LENGTH) stdout_text_record; Text_Mode chill_stdout = { IO_TEXTLOCATION, (VarString *)&stdout_text_record, &stdout_access, 0 }; /* stderr */ #define STDERR_TEXT_LENGTH STDIO_TEXT_LENGTH #ifndef STDERR_FILENO #define STDERR_FILENO 2 #endif static Access_Mode stderr_access; static Association_Mode stderr_association = { IO_EXISTING | IO_WRITEABLE | IO_SEQUENCIBLE | IO_ISASSOCIATED, NULL, &stderr_access, STDERR_FILENO, NULL, 0, WriteOnly }; static Access_Mode stderr_access = { IO_TEXTIO, STDERR_TEXT_LENGTH + 2, 0, 0, &stderr_association, 0, NULL, VaryingChars }; static VARYING_STRING(STDIN_TEXT_LENGTH) stderr_text_record; Text_Mode chill_stderr = { IO_TEXTLOCATION, (VarString *)&stderr_text_record, &stderr_access, 0 }; /* * function __xmalloc_ * * parameter: * size number of bytes to allocate * * returns: * void* * * abstract: * This is the general allocation routine for libchill * */ void * __xmalloc_ (size) int size; { void *tmp = malloc (size); if (!tmp) { fprintf (stderr, "ChillLib: Out of heap space.\n"); fflush (stderr); exit (ENOMEM); } return (tmp); } /* __xmalloc_ */ static char * newstring (char *str) { char *tmp = __xmalloc_ (strlen (str) + 1); strcpy (tmp, str); return tmp; } static void setup_stdinout (void) __attribute__((constructor)); static void setup_stdinout () { /* allocate the names */ stdin_association.pathname = newstring ("stdin"); stdout_association.pathname = newstring ("stdout"); stderr_association.pathname = newstring ("stderr"); /* stdin needs a readbuffer */ stdin_association.bufptr = __xmalloc_ (sizeof (readbuf_t)); memset (stdin_association.bufptr, 0, sizeof (readbuf_t)); }