Last active
March 16, 2020 10:07
-
-
Save frank-e/cc8ec5a6a49afdfcd3740a29ee971d6a to your computer and use it in GitHub Desktop.
Convert constant or space separated integer sequence to the comma-space separated OEIS data submission format
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Classic REXX 5.00 (Regina) or 6.03+ (ooRexx) with RexxUtil */ | |
/* Separate integer sequence by comma+space for https://oeis.org/ */ | |
/* or format constant as integer sequence for an OEIS submission. */ | |
signal on novalue name ERROR ; parse version UTIL REXX . | |
if ( 0 <> x2c( 30 )) | ( REXX <> 5 & REXX < 6.03 ) | |
then exit ERROR( 'untested' UTIL REXX ) | |
if 6 <= REXX then interpret 'signal on nostring name ERROR' | |
if 5 <= REXX then interpret 'signal on lostdigits name ERROR' | |
signal on halt name ERROR ; signal on failure name ERROR | |
signal on notready name ERROR ; signal on error name ERROR | |
numeric digits 20 ; UTIL = REGUTIL() | |
/* -------------------------------------------------------------- */ | |
parse arg S ; S = strip( S ) | |
W = words( S ) ; if W = 0 then exit USAGE() | |
if W = 1 then do | |
D = pos( . , S ) ; E = lastpos( . , S ) | |
if D = 0 | D < E then exit USAGE( 'no const. or seq.' ) | |
D = left( S, 1 ) ; L = length( S ) | |
do N = 2 to L while length( D ) < 258 | |
E = substr( S, N, 1 ) ; if E = . then iterate N | |
if pos( E, 0123456789 ) = 0 then exit USAGE( E ) | |
D = D || ',' E | |
end N | |
end | |
else do | |
D = word( S, 1 ) | |
do N = 2 to W while length( D ) < 255 | |
D = D || ',' word( S, N ) | |
end N | |
end | |
say D ; '@echo' D || '|clip' | |
return rc | |
/* ----------------------------- (REXX USAGE template 2016-03-06) */ | |
USAGE: procedure /* show (error +) usage message: */ | |
parse source . . USE ; USE = filespec( 'name', USE ) | |
say x2c( right( 7, arg())) /* terminate line (BEL if error) */ | |
if arg() then say 'Error:' arg( 1 ) | |
say 'Usage:' USE 'constant|integers' | |
say /* suited for REXXC tokenization */ | |
say ' Put comma-separated digits or integers into the ClipBoard.' | |
return 1 /* exit code 1, nothing happened */ | |
/* ----------------------------- (Regina SysLoadFuncs 2015-12-06) */ | |
REGUTIL: procedure /* Not needed for ooRexx > 6.03 */ | |
if RxFuncQuery( 'SysLoadFuncs' ) then do | |
ERR = RxFuncAdd( 'SysLoadFuncs', 'RexxUtil' ) | |
if ERR <> 0 then exit ERROR( 'RexxUtil load error' ERR ) | |
end /* static Regina has no RexxUtil */ | |
ERR = SysLoadFuncs() ; return SysUtilVersion() | |
/* ----------------------------- (STDERR: unification 2020-03-14) */ | |
/* PERROR() emulates lineout( 'STDERR:', emsg ) with ERROUT(). */ | |
/* ERROUT() emulates charout( 'STDERR:', emsg ). */ | |
/* ERROR() shows an error message and the source line number sigl */ | |
/* on stderr. Examples: if 0 = 1 then exit ERROR( 'oops' ) */ | |
/* call ERROR 'interactive debug here' */ | |
/* ERROR() can also catch exceptions (REXX conditions), examples: */ | |
/* SIGNAL ON ERROR non-zero rc or unhandled FAILURE */ | |
/* SIGNAL ON NOVALUE NAME ERROR uninitialized variable */ | |
/* CALL ON NOTREADY NAME ERROR blocked I/O (incl. EOF on input) */ | |
/* ERROR() uses ERROR. in the context of its caller and returns 1 */ | |
/* for explicit calls or CALL ON conditions. For a SIGNAL ON ... */ | |
/* condition ERROR() ends with exit 1. */ | |
PERROR: return sign( ERROUT( arg( 1 ) || x2c( 0D0A ))) | |
ERROUT: procedure | |
parse version S V . ; signal off notready | |
select | |
when 6 <= V & V < 7 then S = 'STDERR:' /* (o)oRexx */ | |
when S == 'REXXSAA' then S = 'STDERR:' /* IBM Rexx */ | |
when V == 5.00 then S = '<STDERR>' /* Regina */ | |
otherwise S = '/dev/con' /* Quercus */ | |
end /* Kedit KEXX 5.xy not supported */ | |
return charout( S, arg( 1 )) | |
ERROR: /* trace off, save result + sigl */ | |
ERROR.3 = trace( 'o' ) ; ERROR.1 = value( 'result' ) | |
ERROR.2 = sigl ; call PERROR | |
ERROR.3 = right( ERROR.2 '*-*', 10 ) | |
if ERROR.2 <= sourceline() | |
then call PERROR ERROR.3 strip( sourceline( ERROR.2 )) | |
else call PERROR ERROR.3 '(source line unavailable)' | |
ERROR.3 = right( '+++', 10 ) condition( 'c' ) condition( 'd' ) | |
if condition() = '' then ERROR.3 = right( '>>>', 10 ) arg( 1 ) | |
call PERROR ERROR.3 | |
select | |
when sign( wordpos( condition( 'c' ), 'ERROR FAILURE' )) | |
then ERROR.3 = 'RC' rc | |
when condition( 'c' ) = 'SYNTAX' | |
then ERROR.3 = errortext( rc ) | |
when condition( 'c' ) = 'HALT' | |
then ERROR.3 = errortext( 4 ) | |
when condition( 'c' ) = 'NOTREADY' then do | |
ERROR.3 = condition( 'd' ) | |
if ERROR.3 <> '' then do | |
ERROR.3 = stream( ERROR.3, 'd' ) | |
end | |
end | |
otherwise ERROR.3 = '' | |
end | |
if ERROR.3 <> '' then call PERROR right( '>>>', 10 ) ERROR.3 | |
parse value ERROR.2 ERROR.1 with sigl result | |
if ERROR.1 == 'RESULT' then drop result | |
trace ?L /* -- interactive label trace -- */ | |
ERROR: if condition() = 'SIGNAL' then exit 1 | |
else return 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Purpose on top