Some useful routines [LONG]

new topic     » goto parent     » topic index » view thread      » older message » newer message

Based on some of the remarks that were made in response to my
suggestion to extend the Euphoria slice mechanism, I got to
thinking about just how flexible Euphoria is.  To prove it to
myself, I came up with a whole bunch of useful routines.  I've
included them here.  Most of them have sufficient comments to
make any additional comments superfluous; those that aren't,
I've added comments as appropriate.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

-- stddefs.e

-- Standard definitions for general use

-- bool type - FALSE and TRUE

global constant bFALSE=0
global constant bTRUE=1

global type bool(integer b)
    return b=bFALSE or b=bTRUE
end type

-- standard file handles

global constant STD_IN=0
global constant STD_OUT=1
global constant STD_ERR=2

-- errorexit - prints message and exits, setting exit code.

global procedure errorexit(integer exitcode, sequence msg)
    puts(STD_ERR, msg)
    abort(exitcode)
end procedure

-- xslice - extended slices - allows discontinuous subscripts

global function xslice(sequence var, sequence subscripts)
    sequence result

    result = {}
    for i = 1 to length(subscripts) do
        if subscripts[i] > length(var) then
            errorexit(1,"Invalid subscript in extended slice.\n")
        end if
        result = append(result,var[subscripts[i]])
    end for
    return result
end function


-- trim function - returns string stripped of leading and trailing spaces

global function trim(sequence s)
    sequence t

    if length(s)=0 then
        return s
    end if
    t = s
    while (t[1]=' ') or (t[1]='\t') or (t[1]='\n') or (t[1]='\r') do
        t = t[2..length(t)]
        if length(t)=0 then
            return t
        end if
    end while
    while (t[length(t)]=' ') or (t[length(t)]='\t') or
          (t[length(t)]='\n') or (t[length(t)]='\r') do
        t = t[1..length(t)-1]
        if length(t)=0 then
            return t
        end if
    end while
    return t
end function

-- left - returns leftmost slice of length i of a string

global function left(sequence s, integer i)
    if i > length(s) then
        errorexit(1,"Can't slice more than the whole thing.\n")
    end if
    return s[1..i]
end function

-- right - returns rightmost slice of length i of a string

global function right(sequence s, integer i)
    if i > length(s) then
        errorexit(1,"Can't slice more than the whole thing.\n")
    end if
    return s[length(s)-i+1..length(s)]
end function

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-- cmdline.e - provides enhanced command line processing
-- Jeff Zeitlin (jeff.zeitlin at execnet.com)

-- switch processing - switches are case-sensitive; i.e., /s != /S

-- switch(object s)
--   Is there a switch s on the command line?
--   Accepts either /s or -s as valid switch.
--   Returns 0 for no switch, param # if exists

-- switchval(object s, integer valrequired)
--    returns sequence containing one of:
--      switch /s not present:  0 (atom)
--      switch /s present:      param # (atom)
--      valrequired = 1:
--        switch of form /sx:   x as sequence (text)
--        switch of form /s x:  x as sequence (text)
--        switch not present:   0 (atom)
--      valrequired = 0
--        switch of form /sx:   x as sequence (text)
--        switch of form /s x:  param # (x may != value) (atom)
--        switch not present:   0 (atom)
--    leading character of switch may be - or /

global function switch(object s)
    sequence cmdline
    sequence sw1, sw2
    integer found, i

    cmdline = command_line()
    sw1 = "/" & s
    sw2 = "-" & s
    found = 0
    i = 1
    while (not found) and (i <= length(cmdline)) do
        found = (match(sw1,cmdline[i]) = 1) or (match(sw2,cmdline[i]) = 1)
        if found then
            return i
        else
            i = i + 1
        end if
    end while
    return found
end function

global function switchval(object s, integer required)
    sequence cmdline
    sequence val
    integer i

    cmdline = command_line()
    i = switch(s)
    if i = 0 then
        return 0
    else
        val = cmdline[i][length(s)+2..length(cmdline[i])]
        if required then
            if compare(val,{}) = 0 then
                val = cmdline[i+1]
            end if
        else
            if compare(val,{}) = 0 then
                return i
            end if
        end if
    end if
    return val
end function

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-- extgraph.e   - extended graphics routines for Euphoria
-- Jeff Zeitlin (jeff.zeitlin at execnet.com)
-- builds on routines in graphics.e

include graphics.e

-- regular_polygon
-- draws an n-sided polygon with all sides and angles equal.
-- user specifies center location, radius, and rotation angle;
-- regular_polygon computes the points and calls polygon.
-- an angle of zero places a corner directly to the right on
-- a horizontal line with the center point (i.e., a square is
-- displayed as a diamond, rotated 45 degrees).

constant pi = 3.141592653585
constant X = 1
constant Y = 2

global procedure regular_polygon(sequence center,-- {x,y} center of polygon
                                 integer sides,  -- number of sides
                                 integer radius, -- size corner-to-center
                                 atom angle,     -- clockwise rotation (radians)
                                 integer colr,   -- color to draw/fill
                                 integer fill)   -- fill in with color?
    sequence circ_points
    atom int_angle
    atom angle_incr
    sequence newpoint

    circ_points = {}
    angle_incr = 2 * pi / sides
    for i = 0 to sides do
        int_angle = angle_incr * i + angle
        newpoint = {radius * cos(int_angle) + center[X],
(Continued to next message)

---
 ~ OLXWin 1.00b ~ I used to have a handle on life, then it broke.

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu