The previous version of the userParam_ macro only allows
single strings (without whitespace) to be entered as input.

3c. So, use this version of the userParam_ macro to match
any number of whitespace separated strings as valid input:
Code:
pushdef(userParam_,`translit(userParam,userParam,regexp(userParam,`^\(.*\).\(.*\)*$',`\0
\1'))')
userParam_

Discussion:
..This method is better than the previous userParam_, since
it allows you to enter input like:
"abracadabra w00w b1b2 dcd3"

Daniel.
On Thu, Jul 21, 2011 at 7:22 AM, daniel daniel <[email protected]>wrote:

> ..to get the newline out of the input
> here's a trick I brewed using regexp and translit:
>
> 3a. Say the user enters their input, and you capture/store input
> using the said method (so a macro `userParam' gets defined with
> the input -- but, as of yet, it contains the newline):
> define(askUser,enter pattern: [pushdef(userParam,esyscmd({ read a;echo
> $a;}))dnl
> askUser()
>
> 3b. So, use the following code to strip the newline, and store
> the value without the newline in a macro `userParam_':
> define(userParam_,[translit(userParam,userParam,regexp(userParam,[[^]\(\w\)\n[$]],[\0
> ]))])
>
>
> This method also allows you to get around the single-line nature of
> regexp().
> Daniel.
>
>
> On Thu, Jul 21, 2011 at 3:54 AM, daniel daniel <[email protected]>wrote:
>
>> Here is a neat m4 hack I've come up with to capture user input from within
>> m4.
>>
>> There are two variations I propose to capture user input:
>>
>> 1. The first method captures user input from the shell, exploiting
>> pipelines
>> from the shell and how this relates to /dev/fd/0:
>> Code:
>> dnl call this file m4stdin.m4
>> pushdef(userParam,`include(/dev/fd/0)')
>> eval(userParam+1)
>>
>> Discussion:
>> Given the shell command: { echo 1|m4 m4stdin.m4;}
>> the output will be: 2
>>
>> 2. The second method exploits the `read' shell builtin command:
>> Code:
>> changequote([,])
>> define(askUser,enter A or B: [pushdef(userParam,esyscmd({ read a;echo
>> $a;}))dnl
>> ifelse(userParam,[A
>> ],[include(110721m4a.m4)],dnl
>> ifelse(userParam,[B
>> ],[include(110721m4b.m4)]))][popdef([userParam])])dnl
>> askUser()
>>
>> Discussion:
>> on running this code, the user will be prompted with the text: "enter A or
>> B: "
>> the user will then type either an A or a B; then, in this example, i've
>> implemented
>> conditional file inclusion (i.e., if the user inputs A, then 110721m4a.m4
>> will be
>> evaluated; if the user inputs B, then 110721m4b.m4 will be included and
>> evaluated.)
>>
>>
>>
>> ;P
>> Daniel.
>>
>
>

Reply via email to