esrf

Beamline Instrument Software Support
SPEC Macro documentation: [ Macro Index | BCU Home ]

#--------------------------------------------------------------
# $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)
}'