04 November 2021, 21:50 | #1 |
Ex nihilo nihil
Join Date: Oct 2017
Location: CH
Posts: 5,130
|
AmigaOS 1.3 'ccase' command
Have you ever been in the need to change the case of a string ?
You know, you display things on the screen and you want that the input of the user to be correctly formatted... (users may be distracted ...) This is exactly what the 'ccase' (Change Case) command does. Three case choices are available : - " L " switch forces lowercase - " U " switch forces uppercase - no switch simply invert the letters case A QUIET switch is also available for the command to be silent Of course, strings with space have to be surrounded by quotation marks. Please mind that only a-z letters are processed. Others characters, like characters with accents, are left untouched. As usual the result is available in a variable (cCASE<shell_number>) and, cherry on the cake, the string length is also available (cLNGR<shell_number> - not that it is useful here, but the value was available and it costed nothing to make it available through a variable). NEW VERSION OF THE SCRIPT AVAILABLE BELOW. SEE POST #2 Code:
.key STRING/A,U/S,L/S,QUIET/S .bra { .ket } ;--------------------- ;initialisation ;- setenv cccptA{$$} 1 setenv cccptB{$$} 0 setenv ccstr0{$$} "{STRING}" echo >env:ccstr9{$$}t "" NOLINE echo >t:rmcr{$$} "1CL//;w" echo >t:rmet{$$} "pa l//;<;sa//;p;d;w" echo >t:rmhx{$$} "pa/0A/;2<;sa//;d;p;pa l//;2<;sa//;p;d;A//0x/;w" ;--------------------- ;début de boucle : preparation de l'extraction ;- lab mlk01 setenv <env:cccptA{$$} >NIL: echop{$$}t ? echo >>env:echop{$$}t " LEN 1 *"{STRING}*"" NOLINE echo >env:echop{$$} "FIRST " NOLINE type >>env:echop{$$} env:echop{$$}t ;--------------------- ;extraction par caractère & nettoyage ;- echo <env:echop{$$} >env:exstr1{$$}t ? edit >NIL: FROM env:exstr1{$$}t TO env:exstr1{$$} WITH t:rmet{$$} ;--------------------- ;valeur hexadécimale du caractère extrait & nettoyage ; miniscules: a=0x61=97 ; z=0x7A=122 ; majuscules: A=0x41=65 ; Z=0x5A=90 ;- type >env:vhstr1{$$}t env:exstr1{$$} OPT h edit >NIL: FROM env:vhstr1{$$}t TO env:vhstr1{$$} WITH t:rmhx{$$} ;--------------------- ;valeur décimale du caractère extrait ;- eval <env:vhstr1{$$} >NIL: TO env:vdstr1{$$} lformat %N ? ;--------------------- ;test de case ;- if VAL $vdstr1{$$} GE 97 if VAL $vdstr1{$$} NOT GT 122 if "{L}" NOT EQ "L" skip min2maj endif endif endif if VAL $vdstr1{$$} GE 65 if VAL $vdstr1{$$} NOT GT 90 if "{U}" NOT EQ "U" skip maj2min endif endif endif ;--------------------- ;on garde tel quel ;- if VAL $vdstr1{$$} EQ 0 setenv vhstr1{$$} "0x00" setenv <env:vhstr1{$$} >NIL: evalp{$$} ? echo >>env:evalp{$$} " + 0x20" NOLINE else setenv <env:vhstr1{$$} >NIL: evalp{$$} ? echo >>env:evalp{$$} " + 0x00" NOLINE endif skip mlk02 quit lab min2maj ;--------------------- ;préparation du changement de case (minuscule à majuscule) ;- setenv <env:vhstr1{$$} >NIL: evalp{$$} ? echo >>env:evalp{$$} " - 0x20" NOLINE skip mlk02 lab maj2min ;--------------------- ;préparation du changement de case (majuscule à minuscule) ;- setenv <env:vhstr1{$$} >NIL: evalp{$$} ? echo >>env:evalp{$$} " + 0x20" NOLINE skip mlk02 lab mlk02 ;--------------------- ;conversion de case (minuscule <-> majuscule) ;- eval <env:evalp{$$} >NIL: TO env:cvstr1{$$} lformat "%C" ? ;--------------------- ;concaténation de la chaîne convertie ;- join env:ccstr9{$$}t "env:cvstr1{$$}" AS env:ccstr9{$$} copy env:ccstr9{$$} env:ccstr9{$$}t CLONE lab mlk03 ;--------------------- ;la chaîne originale et celle recréée sont-elles identiques ? ;- if $ccstr9{$$} NOT EQ $ccstr0{$$} ;--------------------- ;incrémentation du compteur ;- eval <env:cccptA{$$} >NIL: TO VALUE2 1 OP + TO env:cccptB{$$} ? setenv <env:cccptB{$$} >NIL: cccptA{$$} ? skip mlk01 BACK endif ;--------------------- ;fin ;- copy env:ccstr9{$$} TO env:cCASE{$$} CLONE QUIET setenv <env:cccptA{$$} >NIL: cLNGR{$$} ? if "{QUIET}" NOT EQ "QUIET" echo " *e[32m$cCASE{$$} : " NOLINE getenv cCASE{$$} echo "*e[0m" NOLINE echo " *e[32m$cLNGR{$$} : " NOLINE getenv cLNGR{$$} echo "*e[0m" endif run >NIL: delete t:rm(cr|et|hx){$$} env:cccpt(A|B){$$} env:(cc|cv|ex|vd|vh)str(0|1|9){$$}#? env:echop{$$}#? env:evalp{$$}#? QUIET quit 0 Last edited by malko; 10 November 2021 at 23:25. Reason: typo |
10 November 2021, 23:24 | #2 |
Ex nihilo nihil
Join Date: Oct 2017
Location: CH
Posts: 5,130
|
Taking advantage of some edit commands, the upper (U switch) and lower (L switch) case change is now much faster (4 seconds).
The length is now available as a switch (LNG). If you have any tip to improve it, you are welcome Code:
ccase_v2 : .key CHAINE/A,L/S,U/S,LNG/S,QUIET/S .bra { .ket } ;--------------------- ;initialisation et contrôle des interrupteurs ;- setenv ccchn0{$$} "{CHAINE}" run >NIL: delete env:ccLNG{$$} QUIET if "{LNG}" EQ "LNG" echo >t:ccrmlt{$$} "27#;5>;sa//;d;w" endif if "{L}" EQ "L" ;tout en minuscules echo >t:ccmamip{$$} "254$;w" skip mlk05 endif if "{U}" EQ "U" ;tout en majuscules echo >t:ccmamip{$$} "254%;w" skip mlk05 endif ;--------------------- ;pas d'interrupteur de case spécifié ;- setenv cccptA{$$} 1 setenv cccptB{$$} 0 echo >env:ccchn7{$$} "" NOLINE echo >t:ccrmcr{$$} "1CL//;w" echo >t:ccrmet{$$} "pa l//;<;sa//;p;d;w" echo >t:ccrmhx{$$} "pa/0A/;2<;sa//;d;p;pa l//;2<;sa//;p;d;A//0x/;w" lab mlk07 ;--------------------- ;début de boucle : preparation de l'extraction ;- setenv <env:cccptA{$$} >NIL: ccechot{$$} ? echo >>env:ccechot{$$} " LEN 1 *"{CHAINE}*"" NOLINE echo >env:ccechop{$$} "FIRST " NOLINE type >>env:ccechop{$$} env:ccechot{$$} ;--------------------- ;extraction par caractère & nettoyage ;- echo <env:ccechop{$$} >env:ccext0{$$} ? edit >NIL: FROM env:ccext0{$$} TO env:ccext1{$$} WITH t:ccrmet{$$} ;--------------------- ;valeur hexadécimale du caractère extrait & nettoyage ; miniscules: a=0x61=97 ; z=0x7A=122 ; majuscules: A=0x41=65 ; Z=0x5A=90 ;- type >env:ccvhe0{$$} env:ccext1{$$} OPT h edit >NIL: FROM env:ccvhe0{$$} TO env:ccvhe1{$$} WITH t:ccrmhx{$$} ;--------------------- ;valeur décimale du caractère extrait ;- eval <env:ccvhe1{$$} >NIL: TO env:ccvde1{$$} lformat %N ? ;--------------------- ;test de case ;- if VAL $ccvde1{$$} GE 97 if VAL $ccvde1{$$} NOT GT 122 if "{L}" NOT EQ "L" skip min2maj endif endif endif if VAL $ccvde1{$$} GE 65 if VAL $ccvde1{$$} NOT GT 90 if "{U}" NOT EQ "U" skip maj2min endif endif endif ;--------------------- ;on garde tel quel car autre caractère que (a-z|A-Z) ;- if VAL $ccvde1{$$} EQ 0 setenv ccvhe1{$$} "0x00" setenv <env:ccvhe1{$$} >NIL: ccevlp{$$} ? echo >>env:ccevlp{$$} " + 0x20" NOLINE else setenv <env:ccvhe1{$$} >NIL: ccevlp{$$} ? echo >>env:ccevlp{$$} " + 0x00" NOLINE endif skip mlk08 lab min2maj ;--------------------- ;préparation du changement de case (minuscule à majuscule) ;- setenv <env:ccvhe1{$$} >NIL: ccevlp{$$} ? echo >>env:ccevlp{$$} " - 0x20" NOLINE skip mlk08 lab maj2min ;--------------------- ;préparation du changement de case (majuscule à minuscule) ;- setenv <env:ccvhe1{$$} >NIL: ccevlp{$$} ? echo >>env:ccevlp{$$} " + 0x20" NOLINE lab mlk08 ;--------------------- ;conversion de case (minuscule <-> majuscule) ;- eval <env:ccevlp{$$} >NIL: TO env:cccvt1{$$} lformat "%C" ? ;--------------------- ;concaténation de la chaîne convertie ;- join env:ccchn7{$$} env:cccvt1{$$} AS env:ccchn9{$$} copy env:ccchn9{$$} env:ccchn7{$$} CLONE QUIET lab mlk09 ;--------------------- ;la chaîne originale et recréée sont-elles identiques ? ;- if $ccchn7{$$} NOT EQ $ccchn0{$$} ;--------------------- ;incrémentation du compteur ;- eval <env:cccptA{$$} >NIL: TO VALUE2 1 OP + TO env:cccptB{$$} ? setenv <env:cccptB{$$} >NIL: cccptA{$$} ? echo "°" NOLINE skip mlk07 BACK endif echo "*e[1A*N*e[K" NOLINE skip mlk06 lab mlk05 ;--------------------- ;transformation en bloc : tout en majuscules ou tout en minuscules ;- edit >NIL: FROM env:ccchn0{$$} TO env:ccchn7{$$} with t:ccmamip{$$} if "{LNG}" EQ "LNG" list >NIL: env:ccchn0{$$} TO env:cccptA{$$} edit >NIL: FROM env:cccptA{$$} TO env:cccptB{$$} WITH t:ccrmlt{$$} if $cccptB{$$} EQ empty setenv cccptA{$$} 0 else eval <env:cccptB{$$} >NIL: TO env:cccptA{$$} ? endif endif lab mlk06 ;--------------------- ;fin ;- copy env:ccchn7{$$} TO env:cCASE{$$} CLONE QUIET if "{QUIET}" NOT EQ "QUIET" echo " *e[32m$cCASE{$$} : " NOLINE getenv cCASE{$$} echo "*e[0m" NOLINE if "{LNG}" EQ "LNG" setenv <env:cccptA{$$} >NIL: ccLNG{$$} ? echo " *e[32m$ccLNG{$$} : " NOLINE getenv ccLNG{$$} echo "*e[0m" NOLINE endif echo "" endif run >NIL: delete t:ccrm(lt|cr|et|hx){$$} t:cc(mamip|echot|echop){$$} env:cc(chn|ext|vhe|vde|cvt)(0|1|7|9){$$} env:cccpt(A|B){$$} env:cc(echot|echop|evlp){$$} QUIET quit 0 |
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
Thread Tools | |
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
AmigaOS 1.3 ' ls ' command | malko | Coders. Scripting | 10 | 19 November 2021 21:09 |
AmigaOS 1.3 ' strlng ' command | malko | Coders. Scripting | 12 | 08 November 2021 01:25 |
AmigaOS 1.3 'wmn' command | malko | Coders. Scripting | 0 | 01 November 2021 21:25 |
Is there a WB command at all that can... | MethodGit | request.Other | 43 | 10 October 2010 09:06 |
What is the WB command that..... | MethodGit | request.Other | 4 | 08 October 2010 04:21 |
|
|