1. stddeff.e

long ago and far away, David Cuny said:

>I offer the slice() function for that same hypothetical include file
>("goodies.e"), along with:

>   global constant      TRUE  = 1,      FALSE = 0

>I'd include the new DOS functions that were posted the other day, but
>I'm thinking that the routines should be usable by both Win32 and
>DOS32.

>Any more suggestions of things to include?

    This is what I have in my stddef.e.  For what it's worth.
Might also add types like word, dword, qword, etc for ease of
interacting with other languages...but I haven't needed to do
that yet.

(And yes I know 0 is easier to type than ZERO, but I think the
 word is good for readability at times, to show that you're
 intentionally zeroing something...in initializations and such)


------------- Warning: code follows --------------
--stddef.e
--standard constants, types, and routines

global constant FALSE = 0, TRUE = 1,
                NULL = {}, ZERO = 0,
                MININT = -1073741824,  --#C0 00 00 00
                MAXINT = 1073741823  --#3F FF FF FF

----   B U I L T   I N   T Y P E S   ----
----these three allow the built-in types to be called by routineID
type satom( object v )
   return( atom( v ))
end type

type sinteger( object v )
   return( integer( v ) )
end type

type ssequence( object v )
   return( sequence( v ) )
end type


----routineIDs
global constant ATOMS = routine_id( "satom" ),
                INTEGERS = routine_id( "sinteger" ),
                SEQUENCES = routine_id( "ssequence" )



----   I N T E G E R   T Y P E S   ----
global type validIndex( object v )
   --valid sequence index
   if integer(v) then
      return(v > 0)
   end if
   return( FALSE )
end type

global type posInt( object v )
   if integer( v ) then
      return( v > -1 )
   end if
   return( FALSE )
end type

global type booleanInt( object v )
   if integer( v ) then
      return( (v = TRUE) or (v = FALSE) )
   end if
   return( FALSE )
end type

global type char( object v )
   if posInt( v ) then
      return( v < 256 )
   end if
   return( FALSE )
end type


----routineIDs
global constant BOOLEANINTS = routine_id( "booleanInt" ),
                POSINTS = routine_id( "posInt" ),
                VALIDINDEXES = routine_id( "validIndex" ),
                CHARS = routine_id( "char" )



----   S E Q U E N C E   T Y P E S   ----

global function setOf( integer t, object v )
   --Boolean:  tests whether object v is a set of
   --objects of the type identified by routineID t
   --example:  if setOf( STRINGS, buffer ) then
   if sequence( v ) then
      for count = 1 to length( v ) do
         if not call_func( t, {v[count]} ) then
            return( FALSE )
         end if
      end for
      return( TRUE )
   end if
   return( FALSE )
end function


global type string( object v )
   return( setOf( CHARS, v ) )
end type


global type c_string( object v )
   --C compatible zero-terminated string
   if setOf( CHARS, v ) then
      if not find( 0, v[1..length(v)-1] ) then
         return( v[length(v)] = 0 )
      end if
   end if
   return( FALSE )
end type


global type p_string( object v )
   --Pascal compatible string: first byte = length in bytes
   if setOf( CHARS, v ) then
      return( v[1] = ( length( v ) - 1 ) )
   end if
   return( FALSE )
end type


----routineIDs
global constant STRINGS = routine_id( "string" ),
                C_STRINGS = routine_id( "c_string" ),
                P_STRINGS = routine_id( "p_string" )


----   C O M M O N   R O U T I N E S   ----


global function rfind( object v, sequence s )
   --Sequence: recurses down through subsequences until it finds an object
   --returns {0} if object not found
   --or a sequence of indices to the object if found
   --ex:
   --s = rfind( 'C', {{{1, 2, 3}, {4, 5, 6}},{ 11, {"ABCD", "EFGH", "IJKL"},
22, 17},{}} )
   ----s = { 2, 2, 1, 3 }
   --s = rfind( "IJKL", {{{1, 2, 3}, {4, 5, 6}},{ 11, {"ABCD", "EFGH",
"IJKL"}, 22, 17},{}} )
   ----s = { 2, 2, 3 }
   --s = rfind( 'V', {{{1, 2, 3}, {4, 5, 6}},{ 11, {"ABCD", "EFGH", "IJKL"},
22, 17},{}} )
   ----s = { 0 }
   sequence loc
   loc = {}
   for count = 1 to length( s ) do
      if compare( v, s[count] ) = 0 then
         return( {count} )
      elsif sequence( s[count] ) then
         loc = rfind( v, s[count] )
         if loc[1] then
            return( count & loc )
         end if
      end if
   end for
   return( {0} )
end function


global function divm( object v1, object v2 )
   --Object: divide two objects and return
   --{ integer_part(s)_of_answer, remainder(s) }
   --or atom -1 if attempting to div by zero
   --ex:
   --x = divm( 27, {3, 5} )
   ----x = { {9, 5}, {0, 2} }
   --x = divm( {20, {35, 42}, 27}, {7, {5, 9}, 3}  )
   ----x =    { {2, { 7,  4},  9}, {6, {0, 6}, 0} }
   --x = divm( {20, {35, 42}, 27}, {7, {5, 0}, 3}  )
   ----x = -1
   sequence lz
   if atom(v2) then
      if v2 = 0 then
         return( -1 )
      end if
   else
      lz = rfind( 0, v2 )
      if lz[1] then
         return( -1 )
      end if
   end if
   return( { floor(v1/v2), remainder( v1, v2 ) } )
end function


global function getf( sequence filename )
   --Object: read a whole file and return a sequence of characters
   --or the atom -1 if unable to open
   integer fn, ch
   sequence ts

   fn = open( filename, "rb" )
   if (fn = -1) then
      printf( 1, "\n\nUnable to open %s\n", {filename} )
      return( -1 )
   end if

   ts = {}
   while 1 do
      ch = getc( fn )
      if ch = -1 then
         exit
      end if
      ts = ts & ch
   end while
   close( fn )
   return( ts )
end function


global function putf( sequence filename, sequence contents )
   --Integer: write a sequence of characters to binary file
   --return 0 if successful, -1 if unable to open, -2 if
   --given invalid sequence
   integer fn

   if not setOf( CHAR, contents ) then
      return( -2 )
   end if

   fn = open( filename, "wb" )
   if (fn = -1) then
      printf( 1, "\n\nUnable to open %s\n", {filename} )
      return( -1 )
   end if

   puts( fn, contents )
   close( fn )
   return( 0 )
end function

------------- Warning: end of code --------------

new topic     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu