diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fns.c | 62 | ||||
-rw-r--r-- | src/print.c | 19 |
2 files changed, 81 insertions, 0 deletions
diff --git a/src/fns.c b/src/fns.c index c318608e4ce..72a7e3ab820 100644 --- a/src/fns.c +++ b/src/fns.c @@ -5082,6 +5082,65 @@ If nil, use the current buffer." */ ) return make_digest_string (digest, SHA1_DIGEST_SIZE); } +DEFUN ("external-standard-input-read-char",Fexternal_standard_input_read_char, Sexternal_standard_input_read_char, 0, 0, 0, + doc: /* Read a single character from the system standard input. + +Returns -1 if standard input is at the end.*/) + (void) +{ + int c; + Lisp_Object val; + + c = getchar(); + XSETINT(val,c); + + return val; +} + +DEFUN ("external-standard-input-read-line", Fexternal_standard_input_read_line, Sexternal_standard_input_read_line, 0, 0, 0, + doc: /* Read a line from the system standard input.*/) + (void) +{ + ptrdiff_t size, len; + char *line; + Lisp_Object val; + int c; + + val = Qnil; + size = 100; + len = 0; + line = xmalloc (size); + + while ((c = getchar ()) != '\n' && c != '\r') + { + if (c == EOF) + { + if (errno != 0) + break; + } + else + { + if (len == size) + line = xpalloc (line, &size, 1, -1, sizeof *line); + line[len++] = c; + } + } + + if (len || c == '\n' || c == '\r') + { + val = make_string (line, len); + xfree (line); + } + else + { + xfree (line); + error ("Error reading from stdin"); + } + + return val; +} + + void syms_of_fns (void) @@ -5249,4 +5308,7 @@ this variable. */); defsubr (&Ssecure_hash); defsubr (&Sbuffer_hash); defsubr (&Slocale_info); + defsubr (&Sexternal_standard_input_read_char); + defsubr (&Sexternal_standard_input_read_line); + } diff --git a/src/print.c b/src/print.c index 5531210e1b8..25f0afbf972 100644 --- a/src/print.c +++ b/src/print.c @@ -769,6 +769,22 @@ to make it write to the debugging output. */) return character; } +DEFUN ("external-standard-output", Fexternal_standard_output, Sexternal_standard_output, 1, 1, 0, + doc: /* Output character CHARACTER to system standard output. */) + (Lisp_Object character) +{ + CHECK_NUMBER (character); + printchar_to_stream (XINT(character), stdout); + return character; +} + +DEFUN ("external-standard-error", Fexternal_standard_error, Sexternal_standard_error, 1, 1, 0, + doc: /* Output character CHARACTER to system standard error. */) + (Lisp_Object character) +{ + return Fexternal_debugging_output (character); +} + /* This function is never called. Its purpose is to prevent print_output_debug_flag from being optimized away. */ @@ -2307,7 +2323,10 @@ priorities. */); defsubr (&Sprinc); defsubr (&Sprint); defsubr (&Sterpri); + defsubr (&Sexternal_standard_output); + defsubr (&Sexternal_standard_error); defsubr (&Swrite_char); + defsubr (&Sredirect_debugging_output); DEFSYM (Qprint_escape_newlines, "print-escape-newlines"); |