Groups | Search | Server Info | Login | Register


Groups > comp.lang.awk > #9925

Re: getchar implementation without GNUishms

From Janis Papanagnou <janis_papanagnou+ng@hotmail.com>
Newsgroups comp.lang.awk
Subject Re: getchar implementation without GNUishms
Date 2025-03-26 06:27 +0100
Organization A noiseless patient Spider
Message-ID <vs038p$12n0d$1@dont-email.me> (permalink)
References <slrnvu4v4s.1su2.anthk@openbsd.home> <vrua0r$3d1du$1@dont-email.me> <vrvv30$spj$1@nnrp.usenet.blueworldhosting.com>

Show all headers | View raw


On 26.03.2025 05:16, Arti F. Idiot wrote:
> On 3/25/25 7:10 AM, Janis Papanagnou wrote:
>> On 25.03.2025 10:51, anthk wrote:
>>> Hello the guy from https://luxferre.top and gopher://hoi.st
>>> has pretty interesting stuff, such as
>>>
>>> [ shell specific or other tries to emulate some getchar function ]
>>>
>>> Could it be possible to implement a true portable getchar?
>>
>> Those who think that getchar is a useful function may implement that
>> natively in Awk. (It avoids external dependencies and all the issues
>> that the posted/quoted code has made obvious.)
> 
> I know you can iterate over input strings a character at a time in AWK
> but I don't think you can read a single character from stdin without
> also providing a newline via ENTER, which is perhaps what the OP was
> actually wanting to do?

I don't know. - When I read 'getchar' I associated a character oriented
function like awk's 'getline'. That would mean not reading from stdin
with some I/O buffered return-terminated input but just processing the
data as Awk would read its input from stdin or using 'getline' would.
You need to maintain some state, though; here the actual read in line
which acts like a buffer in buffered OS reads.

What I associated was actually something like

    function getchar ()
    {
        if (_pos >= _len) {
            do {
                if ((getline _line) <=0)
                    return  ""
            }
            while (!(_len = length (_line)))
            _pos = 0
        }
        return  substr (_line, ++_pos, 1)
    }

used in contexts like

    BEGIN {
        # RS = "$^"
        while (c = getchar())
            print ">" c "<"
    }

where the commented RS assignment could be activated in case you wanted
to also read the newline characters, or, without it, to just read in
the payload data of a line (or record). The necessary state information
is stored in those variables that are named with a leading underscore.

As said it's native Awk code without those dependencies on OS, on tools,
or on specific non-standard flags of tools.

(But as indicated in my previous response, I don't have any need for a
function like that. Maybe others do, don't know.)

Janis

> [...]

Back to comp.lang.awk | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

getchar implementation without GNUishms anthk <anthk@openbsd.home> - 2025-03-25 09:51 +0000
  Re: getchar implementation without GNUishms Janis Papanagnou <janis_papanagnou+ng@hotmail.com> - 2025-03-25 14:10 +0100
    Re: getchar implementation without GNUishms "Arti F. Idiot" <addr@is.invalid> - 2025-03-25 22:16 -0600
      Re: getchar implementation without GNUishms gazelle@shell.xmission.com (Kenny McCormack) - 2025-03-26 05:08 +0000
        Re: getchar implementation without GNUishms gazelle@shell.xmission.com (Kenny McCormack) - 2025-03-26 05:48 +0000
      Re: getchar implementation without GNUishms Janis Papanagnou <janis_papanagnou+ng@hotmail.com> - 2025-03-26 06:27 +0100
        What is getchar? (Was: getchar implementation without GNUishms) gazelle@shell.xmission.com (Kenny McCormack) - 2025-03-26 06:07 +0000
          Re: What is getchar? (Was: getchar implementation without GNUishms) Kaz Kylheku <643-408-1753@kylheku.com> - 2025-03-26 06:10 +0000

csiph-web