Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
3.5 KiB

/*
* Copyright(C) 1999-2020 National Technology & Engineering Solutions
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
* NTESS, the U.S. Government retains certain rights in this software.
*
* See packages/seacas/LICENSE for details
*/
/*
*/
#include "fortranc.h"
#include "getline_int.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
static int my_getline(char *s, int len);
static char *copy_string(char *dest, char const *source, long int elements)
{
char *d;
for (d = dest; d + 1 < dest + elements && *source; d++, source++) {
*d = *source;
}
*d = '\0';
return d;
}
#if defined(ADDC_)
void exread_(char *prompt, char *input, FTNINT *iostat, long int PromptLength, long int InputLength)
#else
void exread(char *prompt, char *input, FTNINT *iostat, long int PromptLength, long int InputLength)
#endif
/*
************************************************************************
C DESCRIPTION:
C This routine prompts, reads, and echos from the standard input
C device. For an interactive job, this would prompt for input from
C the terminal and read (with echo) from the keyboard. For a batch
C job, this would read from the main input file and echo to the
C log file with the prompt string as a prefix. This routine should
C assume the burden of assuring that the standard input and output
C devices are properly opened.
C FORMAL PARAMETERS:
C PROMPT CHARACTER Prompt String
C INPUT CHARACTER Input String
C IOSTAT INTEGER I/O Status ( -1 = EOF, 0 = normal )
************************************************************************
*/
{
static int debug = 0;
if (debug == 1 || isatty(0) == 0 || isatty(1) == 0) {
int icnt;
(void)write(1, prompt, PromptLength);
icnt = my_getline(input, InputLength);
/* Next evaluate the error status. */
/* For icnt < 0 indicate an error condition. */
*iostat = (icnt >= 0) ? 0 : -1;
}
else {
static char internal_prompt[128];
char * p = NULL;
/* Fill line with blanks... */
int dlen = InputLength;
char *ds = input;
while (dlen-- > 0) /* Blank out the entire string. */
*ds++ = ' ';
copy_string(internal_prompt, prompt, 128);
internal_prompt[PromptLength - 1] = ' ';
internal_prompt[PromptLength] = '\0';
p = getline_int(internal_prompt);
if (p) {
gl_histadd(p);
int i = 0;
/* Strip the trailing \n */
p[strlen(p) - 1] = '\0';
while (i < strlen(p) && i < InputLength) {
input[i] = p[i];
++i;
}
*iostat = 0;
}
else {
*iostat = -1;
}
}
}
static int my_getline(char *s, int len)
{
char c;
int dlen;
char nl = '\n';
char *ds; /* A dummy argument used in nulling out s. */
dlen = len;
ds = s;
while (dlen-- > 0) /* Blank out the entire string. */
*ds++ = ' ';
dlen = len; /* Now take care of business. */
for (; dlen > 0; dlen--) {
if (read(0, &c, 1) != 1) {
if (dlen == len) {
(void)write(1, &nl, 1); /* We've encountered the End of File */
return (-1);
}
else
return (len - dlen + 1);
}
else if (c == '\n' || c == '\r')
return (len - dlen + 1);
*s++ = c;
}
/* If we get this far, we've read 'len' characters without hitting the
end of the line. Read until get end-of-line or end-of-file
*/
while (read(0, &c, 1) == 1 && c != '\n' && c != '\r')
;
return (len - dlen + 1);
}