On Tue, Sep 19, 2000 at 10:04:55 -0700, Sigbjorn Finne wrote:

> POSIX.1 only defines #defined constants upto B38400, so anything
> beyond that is non-standard [...]

... which does not necessarily imply, that GHC is not going to 
support it ;-)

Marcus Shawcroft wrote:
>> Can these missing rates be added to hslib without breaking other
>> platforms?

patch attached...  the non-standard baud rates are added, and a
function ``isBaudRateSupported'' for testing, whether they are
supported...

NOTE:
For now, I'm not going to apply the patch to the CVS tree... There are
several reasons for it: 

 * at first, as Sigbjorn pointed out, they are not covered by POSIX.1
   and therefore this DOES become a policy issue... I'd like to hear
   the opinion of The GHC Team (which is at ICFP currently, AFAIK)...

 * The Posix* modules are said to be rewritten once the new FFI has
   settled enough, so I don't want to spent too much time on them
   now...

 * I added instances (Enum, Bounded, Eq) to BaudRate. Sure, I could do
   without them, but they're nevertheless useful... but this is an
   incompatible change, it *might* break existing code...

   BTW: Is there any particular reason, why the other Posix* data
   types lack these instances? At least Eq should be supported,
   IMHO...


Cheers,
Michael
-- 
() ASCII ribbon campaign |  Chair for Computer Science  II  | GPG: F65C68CD
/\ against HTML mail     |       RWTH Aachen, Germany       | PGP: 1D0DD0B9
                       "I WILL NOT BURY THE NEW KID"
                          -- Bart Simpson in 9F03
--- 
/home/michaelw/.backup/PosixTTY.lhs!!!mnt!sda5!src!devel!ghc4!ghc-current!hslibs!posix!.~1~
 Mon Apr 10 17:19:42 2000
+++ hslibs/posix/PosixTTY.lhs   Tue Sep 19 23:00:50 2000
@@ -35,12 +35,14 @@
     withOutputSpeed,
     withTime,
     withoutCC,
-    withoutMode
+    withoutMode,
+    isBaudRateSupported
     ) where
 
 import GlaExts
 import IOExts ( unsafePerformIO )
 
+import Maybe (fromMaybe)
 import IO
 
 import PosixUtil
@@ -284,6 +286,23 @@
               | B9600
               | B19200
               | B38400
+              | B57600
+              | B115200
+              | B230400
+              | B460800
+              | B500000
+              | B576000
+              | B921600
+              | B1000000
+              | B1152000
+              | B1500000
+              | B2000000
+              | B2500000
+              | B3000000
+              | B3500000
+              | B4000000
+    deriving (Enum,Bounded,Eq)
+
 
 inputSpeed :: TerminalAttributes -> BaudRate
 inputSpeed termios = unsafePerformIO $ do
@@ -406,45 +425,53 @@
 -- Convert Haskell BaudRate to unsigned integral type (Word)
 
 baud2Word :: BaudRate -> Word
-baud2Word B0 = ``B0''
-baud2Word B50 = ``B50''
-baud2Word B75 = ``B75''
-baud2Word B110 = ``B110''
-baud2Word B134 = ``B134''
-baud2Word B150 = ``B150''
-baud2Word B200 = ``B200''
-baud2Word B300 = ``B300''
-baud2Word B600 = ``B600''
-baud2Word B1200 = ``B1200''
-baud2Word B1800 = ``B1800''
-baud2Word B2400 = ``B2400''
-baud2Word B4800 = ``B4800''
-baud2Word B9600 = ``B9600''
-baud2Word B19200 = ``B19200''
-baud2Word B38400 = ``B38400''
+baud2Word B0       = ``B0''
+baud2Word B50      = ``B50''
+baud2Word B75      = ``B75''
+baud2Word B110     = ``B110''
+baud2Word B134     = ``B134''
+baud2Word B150     = ``B150''
+baud2Word B200     = ``B200''
+baud2Word B300     = ``B300''
+baud2Word B600     = ``B600''
+baud2Word B1200    = ``B1200''
+baud2Word B1800    = ``B1800''
+baud2Word B2400    = ``B2400''
+baud2Word B4800    = ``B4800''
+baud2Word B9600    = ``B9600''
+baud2Word B19200   = ``B19200''
+baud2Word B38400   = ``B38400''
+baud2Word B57600   = ``B57600''
+baud2Word B115200  = ``B115200''
+baud2Word B230400  = ``B230400''
+baud2Word B460800  = ``B460800''
+baud2Word B500000  = ``B500000''
+baud2Word B576000  = ``B576000''
+baud2Word B921600  = ``B921600''
+baud2Word B1000000 = ``B1000000''
+baud2Word B1152000 = ``B1152000''
+baud2Word B1500000 = ``B1500000''
+baud2Word B2000000 = ``B2000000''
+baud2Word B2500000 = ``B2500000''
+baud2Word B3000000 = ``B3000000''
+baud2Word B3500000 = ``B3500000''
+baud2Word B4000000 = ``B4000000''
 
 -- And convert a word back to a baud rate
--- We really need some cpp macros here.
 
 word2Baud :: Word -> BaudRate
-word2Baud x =
-    if x == ``B0'' then B0
-    else if x == ``B50'' then B50
-    else if x == ``B75'' then B75
-    else if x == ``B110'' then B110
-    else if x == ``B134'' then B134
-    else if x == ``B150'' then B150
-    else if x == ``B200'' then B200
-    else if x == ``B300'' then B300
-    else if x == ``B600'' then B600
-    else if x == ``B1200'' then B1200
-    else if x == ``B1800'' then B1800
-    else if x == ``B2400'' then B2400
-    else if x == ``B4800'' then B4800
-    else if x == ``B9600'' then B9600
-    else if x == ``B19200'' then B19200
-    else if x == ``B38400'' then B38400
-    else error "unknown baud rate"
+word2Baud x = fromMaybe (error "unknown baud rate")
+                        (lookup x baudRateMap)
+  where
+    baudRateMap :: [(Word,BaudRate)]
+    baudRateMap = map (\ x -> (baud2Word x,x)) [minBound .. maxBound]
+
+-- test, whether baud rate is supported
+-- (depends on setting unsupported baud rates to B0)
+
+isBaudRateSupported :: BaudRate -> Bool
+isBaudRateSupported B0 = True
+isBaudRateSupported x  = word2Baud (baud2Word x) == x
 
 -- Clear termios i_flag
 
--- 
/home/michaelw/.backup/HsPosix.h!!!mnt!sda5!src!devel!ghc4!ghc-current!hslibs!posix!cbits!.~1~
      Wed May 31 16:32:09 2000
+++ hslibs/posix/cbits/HsPosix.h        Tue Sep 19 22:48:49 2000
@@ -48,6 +48,58 @@
 #include <termios.h>
 #endif /* HAVE_TERMIOS_H */
 
+
+/* 
+ * the following baud rates are not POSIX.1 compliant,
+ * so if they are not defined, they are set to B0.
+ */
+#ifndef B57600
+#  define B57600   B0
+#endif
+#ifndef B115200
+#  define B115200  B0
+#endif
+#ifndef B230400
+#  define B230400  B0
+#endif
+#ifndef B460800
+#  define B460800  B0
+#endif
+#ifndef B500000
+#  define B500000  B0
+#endif
+#ifndef B576000
+#  define B576000  B0
+#endif
+#ifndef B921600
+#  define B921600  B0
+#endif
+#ifndef B1000000
+#  define B1000000 B0
+#endif
+#ifndef B1152000
+#  define B1152000 B0
+#endif
+#ifndef B1500000
+#  define B1500000 B0
+#endif
+#ifndef B2000000
+#  define B2000000 B0
+#endif
+#ifndef B2500000
+#  define B2500000 B0
+#endif
+#ifndef B3000000
+#  define B3000000 B0
+#endif
+#ifndef B3500000
+#  define B3500000 B0
+#endif
+#ifndef B4000000
+#  define B4000000 B0
+#endif
+
+
 #ifdef HAVE_GRP_H
 #include <grp.h>
 #endif /* HAVE_GRP_H */

Reply via email to