#--------------------------------------------------------------
# $Source: /segfs/bliss/source/spec/macros/RCS/strlib.mac,v $
# $Revision: 1.1 $ $Date: 2014/12/15 17:03:34 $
#--------------------------------------------------------------
#-------------------------------------------------------------------------
# 2007/01/23 rh
# utility functions
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#%UU%
#%MDESC% %B%returns%B% RCS version of .mac file%BR%
#%END%
def strlibver '{
local s, tok
s= "$Header: /segfs/bliss/source/spec/macros/RCS/strlib.mac,v 1.1 2014/12/15 17:03:34 guilloud Exp $"
split(s, tok)
printf("%s v%s (%s %s)\n", str_rcs_filename(tok[1]), \
tok[2], tok[3], tok[4])
}'
# removes "\n" if any at end of <str> string ---> strip
def str_trim(s) '{
local l
l = length(s)
if(substr(s,l,1) == "\n") return substr(s, 1, l-1)
return s
}'
#
def str_only_let_dig(s_in) '{
local l, i , bla , s
s = s_in
s = str_trim_both(s)
l = length(s)
bla = ""
for(i = 1; i <= l; i++) {
c = asc(substr(s, i, 1))
if( (c <= 0x20) || (c >= 0x7f)) c = 0x5F
bla = sprintf("%s%c", bla, c)
}
return bla
}'
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# removes leading spaces and tabulations
# 50.CYRIL> TTT[0] = str_trim_left (" \t \t eee\n") ; p TTT
# TTT["0"] = "eee\n"
def str_trim_left(s) '{
local l, i
l = length(s)
for(i = 1; i <= l; i++) {
c = asc(substr(s, i, 1))
# space \t
if( ! ((c == 0x20) || (c == 0x09))) {
return substr(s, i)
}
}
return ""
}'
# removes leading "white" characters
def str_trim_white_left(s) '{
local l, i, c
l = length(s)
for(i = 1; i <= l; i++) {
c = asc(substr(s, i, 1))
# space DEL ??
if(( c > 0x20)&&( c < 0x7f)) {
return substr(s, i)
}
}
return ""
}'
# removes trailling spaces \r \n
def str_trim_right(s) '{
local l, i
l = length(s)
for(i = l; i > 0 ; i--) {
c = asc(substr(s, i, 1))
if( ! ((c == 0x20) || (c == 0x0d)|| (c == 0x0a))){
return substr(s, 1, i)
}
}
return ""
}'
# removes trailling "white" characters
def str_trim_white_right(s) '{
local l, i
l = length(s)
for(i = l; i > 0 ; i--) {
c = asc(substr(s, i, 1))
if(( c > 0x20)&&( c < 0x7f)){
return substr(s, 1, i)
}
}
return ""
}'
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
def str_trim_both(s) '{
return str_trim_left(str_trim_right(s))
}'
def str_trim_white_both(s) '{
return str_trim_white_left(str_trim_white_right(s))
}'
def str_trim_white(s) '{
return str_trim_white_left(str_trim_white_right(s))
}'
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
def str_xtrim_left(s) '{
local l, i, c
l = length(s)
for(i = 1; i <= l; i++) {
c = asc(substr(s,i,1))
if ((c > 0x20) && (c < 0x7f)) return substr(s,i)
}
return ""
}'
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
def str_xtrim_right(s) '{
local l, i, c
l = length(s)
for(i = l; i >= 1; i--) {
c = asc(substr(s,i,1))
if ((c > 0x20) && (c < 0x7f)) return substr(s, 1, i)
}
return ""
}'
def str_xtrim(s) '{
return str_xtrim_left(str_xtrim_right(s))
}'
def str_xtrim_all(s) '{
local sx, l, i, c, buff, doit
sx = str_xtrim_left(str_xtrim_right(s))
l = length(sx)
for(i = 1; i <= l; i++) {
c = asc(substr(sx,i,1))
if ((c <= 0x20) || (c >= 0x7f)){
buff = sprintf("%s_%s", substr(sx, 1, i-1), substr(sx, i+1))
sx = buff
}
}
return sx
#-------- TODO is interesting????
i = index(sx, "__")
while(i) {
buff = sprintf("%s%s", substr(sx, 1, i-1), substr(sx, i+1))
sx = buff
i = index(sx, "__")
}
return sx
}'
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
def str_rcs_filename(s) '{
local l, i, n
l = length(s)
for(i=l; i >0; i--) {
if(substr(s,i,1) == "/") {
s = substr(s, i+1)
break;
}
}
n = index(s, ",v")
if(n > 0) {
s = substr(s, 1, n-1)
}
return s
}'
# ----- >see toupper and tolower from spec_utils.mac
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
def str_iseq(s1, s2, ignore_case) '{
local l, l2, c1, c2, i, n
l1 = length(s1)
l2 = length(s2)
if(l1 != l2) return 0
for(i=1; i <=l1 ; i++) {
c1 = asc(substr(s1,i,1))
c2 = asc(substr(s2,i,1))
if(ignore_case) {
c1 = str_toupper_char(c1)
c2 = str_toupper_char(c2)
}
if(c1 != c2) return 0
}
return 1
}'
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
def str_toupper_char(c) '{
return ((c <= 0x7a ) && (c >= 0x61 )) ? c - 0x20 : c
}'
#-------------------------------------------------------
#-------------------------------------------------------
def str_tolower(s) '{
local l, i, c
local sUpper, sLower
sUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
sLower = "abcdefghijklmnopqrstuvwxyz"
l = length(s)
if(l == 0) {return ""}
for(i = 1; i <= l ; i++) {
c = substr(s, i, 1)
n = index(sUpper, c)
if( n > 0) {
s= sprintf("%s%s%s", \
substr(s, 1, i-1), substr(sLower, n, 1), substr(s, i+1))
}
}
return s
}'
#-------------------------------------------------------
#-------------------------------------------------------
def str_toupper(s) '{
local l, i, c
local sUpper, sLower
sUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
sLower = "abcdefghijklmnopqrstuvwxyz"
l = length(s)
if(l == 0) {return ""}
for(i = 1; i <= l ; i++) {
c = substr(s, i, 1)
n = index(sLower, c)
if( n > 0) {
s= sprintf("%s%s%s", \
substr(s, 1, i-1), substr(sUpper, n, 1), substr(s, i+1))
}
}
return s
}'
#-------------------------------------------------------
#-------------------------------------------------------
# Replaces any occurence of <sOld> by <sNew> in <s>
# 71.CYRIL> p str_xlat( "abcdabcdab", "ab", "555")
# 555cd555cd555
def str_xlat(s, sOld, sNew) '{
local l, i, c
local sUpper, sLower
l = length(s)
lOld = length(sOld)
if((l == 0) || (lOld == 0)) {
return s
}
while( (n = index(s, sOld)) != 0) {
s = sprintf("%s%s%s", \
substr(s, 1, n-1), sNew, substr(s, n + lOld))
}
return s
}'
#-------------------------------------------------------
#-------------------------------------------------------
def str_atof(s) '{
local xfloat, nr
local fnId ; fnId = "str_atof"
nr = sscanf(s, "%f", xfloat)
if(nr !=1) {
printf("%s --- WARNING invalid input (%s) returned 0.0\n", fnId, s)
xfloat = 0.0
}
return xfloat
}'
#-------------------------------------------------------
#-------------------------------------------------------
# ---> is_number()
def str_is_float(s) '{
local xfloat
local nr i c idx ret
local fnId ; fnId = "str_is_float"
nr = length(s)
if(nr == 0) return 0
for(i = 1; i <= nr; i++) {
c = substr(s, i, 1)
idx = index(" \t", c)
if(idx == 0) break;
}
if(i > nr) return 0
idx = index("+-", c)
if(idx) i++
ret= 0
for(; i <= nr; i++) {
c = substr(s, i, 1)
idx = index("0123456789", c)
if(idx == 0) break;
ret = 1
}
if(i > nr) return ret
if(c == ".") {
i++
for(; i <= nr; i++) {
c = substr(s, i, 1)
idx = index("0123456789", c)
if(idx == 0) break;
ret = 1
}
if(i > nr) return ret
}
for(; i <= nr; i++) {
c = substr(s, i, 1)
idx = index(" \t\r\n", c)
if(idx == 0) return 0
}
return 1
}'
#-------------------------------------------------------
#-------------------------------------------------------
# removes control characters ?
def str_no_cntl(str) '{
local i ch buff
buff=""
if ( (str == "") )
return ("<Empty>")
for (i=1; i<=length(str); i++) {
ch = substr(str,i,1)
ach = asc(ch)
if (ch == "\r")
buff=sprintf("%s\\r", buff)
else if (ch == "\n")
buff=sprintf("%s\\n", buff)
else if ( (ach < 32) || (ach >= 127))
buff=sprintf("%s\\%03d", buff, ach)
else
buff=sprintf("%s%s", buff, ch)
}
return (buff)
}'
#-------------------------------------------------------
#-------------------------------------------------------
# replaces control characters by space ?
# 88.CYRIL> TTT[0]=str_cntl2spc("d \td\ra\na ") ; p TTT
# TTT["0"] = "d d a a "
def str_cntl2spc(str) '{
local i ch buff
buff=""
nrspc = 1
if ( (str == "") )
return ("")
for (i=1; i<=length(str); i++) {
ch = substr(str,i,1)
ach = asc(ch)
if ( (ach < 32) || (ach >= 127)) {
nrspc ++ ; ch = " "
} else {
nrspc = 0
}
if(nrspc <= 1) buff=sprintf("%s%s", buff, ch)
}
return (buff)
}'
#-------------------------------------------------------
#-------------------------------------------------------
# replace char <32 or >127 by hexa representation ?
# except \r \n
# 101.CYRIL> p str_hexdump("abcd\r\t\n ")
# abcd\r<09>\n
def str_hexdump(str) '{
local i ch buff
buff=""
if ( (str == "") )
return ("<Empty>")
for (i=1; i<=length(str); i++) {
ch = substr(str,i,1)
ach = asc(ch)
if (ch == "\r")
buff=sprintf("%s\\r", buff)
else if (ch == "\n")
buff=sprintf("%s\\n", buff)
else if ( (ach < 32) || (ach >= 127))
buff=sprintf("%s<%02x>", buff, ach)
else
buff=sprintf("%s%s", buff, ch)
}
return (buff)
}'
|