[Python-checkins] CVS: python/dist/src/Lib aifc.py,1.38,1.39 anydbm.py,1.7,1.8 asynchat.py,1.7,1.8 asyncore.py,1.7,1.8 atexit.py,1.1,1.2 audiodev.py,1.9,1.10
Tim Peters
python-dev@python.org
Sun, 14 Jan 2001 10:09:26 -0800
Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv24429/python/dist/src/lib
Modified Files:
aifc.py anydbm.py asynchat.py asyncore.py atexit.py
audiodev.py
Log Message:
Whitespace standardization.
Index: aifc.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/aifc.py,v
retrieving revision 1.38
retrieving revision 1.39
diff -C2 -r1.38 -r1.39
*** aifc.py 2000/08/17 05:06:49 1.38
--- aifc.py 2001/01/14 18:09:23 1.39
***************
*** 703,707 ****
return None
return self._markers
!
def tell(self):
return self._nframeswritten
--- 703,707 ----
return None
return self._markers
!
def tell(self):
return self._nframeswritten
Index: anydbm.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/anydbm.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** anydbm.py 1998/04/28 15:23:09 1.7
--- anydbm.py 2001/01/14 18:09:23 1.8
***************
*** 3,13 ****
Instead of
! import dbm
! d = dbm.open(file, 'w', 0666)
use
! import anydbm
! d = anydbm.open(file, 'w')
The returned object is a dbhash, gdbm, dbm or dumbdbm object,
--- 3,13 ----
Instead of
! import dbm
! d = dbm.open(file, 'w', 0666)
use
! import anydbm
! d = anydbm.open(file, 'w')
The returned object is a dbhash, gdbm, dbm or dumbdbm object,
***************
*** 20,31 ****
It has the following interface (key and data are strings):
! d[key] = data # store data at key (may override data at
! # existing key)
! data = d[key] # retrieve data at key (raise KeyError if no
! # such key)
! del d[key] # delete data stored at key (raises KeyError
! # if no such key)
! flag = d.has_key(key) # true if the key exists
! list = d.keys() # return a list of all existing keys (slow!)
Future versions may change the order in which implementations are
--- 20,31 ----
It has the following interface (key and data are strings):
! d[key] = data # store data at key (may override data at
! # existing key)
! data = d[key] # retrieve data at key (raise KeyError if no
! # such key)
! del d[key] # delete data stored at key (raises KeyError
! # if no such key)
! flag = d.has_key(key) # true if the key exists
! list = d.keys() # return a list of all existing keys (slow!)
Future versions may change the order in which implementations are
***************
*** 44,51 ****
try:
! class error(Exception):
! pass
except:
! error = "anydbm.error"
_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
--- 44,51 ----
try:
! class error(Exception):
! pass
except:
! error = "anydbm.error"
_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
***************
*** 54,86 ****
for _name in _names:
! try:
! _mod = __import__(_name)
! except ImportError:
! continue
! if not _defaultmod:
! _defaultmod = _mod
! _errors.append(_mod.error)
if not _defaultmod:
! raise ImportError, "no dbm clone found; tried %s" % _names
error = tuple(_errors)
def open(file, flag = 'r', mode = 0666):
! # guess the type of an existing database
! from whichdb import whichdb
! result=whichdb(file)
! if result is None:
! # db doesn't exist
! if 'c' in flag or 'n' in flag:
! # file doesn't exist and the new
! # flag was used so use default type
! mod = _defaultmod
! else:
! raise error, "need 'c' or 'n' flag to open new db"
! elif result == "":
! # db type cannot be determined
! raise error, "db type could not be determined"
! else:
! mod = __import__(result)
! return mod.open(file, flag, mode)
--- 54,86 ----
for _name in _names:
! try:
! _mod = __import__(_name)
! except ImportError:
! continue
! if not _defaultmod:
! _defaultmod = _mod
! _errors.append(_mod.error)
if not _defaultmod:
! raise ImportError, "no dbm clone found; tried %s" % _names
error = tuple(_errors)
def open(file, flag = 'r', mode = 0666):
! # guess the type of an existing database
! from whichdb import whichdb
! result=whichdb(file)
! if result is None:
! # db doesn't exist
! if 'c' in flag or 'n' in flag:
! # file doesn't exist and the new
! # flag was used so use default type
! mod = _defaultmod
! else:
! raise error, "need 'c' or 'n' flag to open new db"
! elif result == "":
! # db type cannot be determined
! raise error, "db type could not be determined"
! else:
! mod = __import__(result)
! return mod.open(file, flag, mode)
Index: asynchat.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/asynchat.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** asynchat.py 2000/09/08 20:30:39 1.7
--- asynchat.py 2001/01/14 18:09:23 1.8
***************
*** 1,11 ****
# -*- Mode: Python; tab-width: 4 -*-
! # Id: asynchat.py,v 2.25 1999/11/18 11:01:08 rushing Exp
! # Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# Copyright 1996 by Sam Rushing
! #
# All Rights Reserved
! #
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
--- 1,11 ----
# -*- Mode: Python; tab-width: 4 -*-
! # Id: asynchat.py,v 2.25 1999/11/18 11:01:08 rushing Exp
! # Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# Copyright 1996 by Sam Rushing
! #
# All Rights Reserved
! #
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
***************
*** 16,20 ****
# distribution of the software without specific, written prior
# permission.
! #
# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
--- 16,20 ----
# distribution of the software without specific, written prior
# permission.
! #
# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
***************
*** 52,273 ****
class async_chat (asyncore.dispatcher):
! """This is an abstract class. You must derive from this class, and add
! the two methods collect_incoming_data() and found_terminator()"""
! # these are overridable defaults
! ac_in_buffer_size = 4096
! ac_out_buffer_size = 4096
! def __init__ (self, conn=None):
! self.ac_in_buffer = ''
! self.ac_out_buffer = ''
! self.producer_fifo = fifo()
! asyncore.dispatcher.__init__ (self, conn)
!
! def set_terminator (self, term):
! "Set the input delimiter. Can be a fixed string of any length, an integer, or None"
! self.terminator = term
!
! def get_terminator (self):
! return self.terminator
!
! # grab some more data from the socket,
! # throw it to the collector method,
! # check for the terminator,
! # if found, transition to the next state.
!
! def handle_read (self):
!
! try:
! data = self.recv (self.ac_in_buffer_size)
! except socket.error, why:
! self.handle_error()
! return
!
! self.ac_in_buffer = self.ac_in_buffer + data
!
! # Continue to search for self.terminator in self.ac_in_buffer,
! # while calling self.collect_incoming_data. The while loop
! # is necessary because we might read several data+terminator
! # combos with a single recv(1024).
!
! while self.ac_in_buffer:
! lb = len(self.ac_in_buffer)
! terminator = self.get_terminator()
! if terminator is None:
! # no terminator, collect it all
! self.collect_incoming_data (self.ac_in_buffer)
! self.ac_in_buffer = ''
! elif type(terminator) == type(0):
! # numeric terminator
! n = terminator
! if lb < n:
! self.collect_incoming_data (self.ac_in_buffer)
! self.ac_in_buffer = ''
! self.terminator = self.terminator - lb
! else:
! self.collect_incoming_data (self.ac_in_buffer[:n])
! self.ac_in_buffer = self.ac_in_buffer[n:]
! self.terminator = 0
! self.found_terminator()
! else:
! # 3 cases:
! # 1) end of buffer matches terminator exactly:
! # collect data, transition
! # 2) end of buffer matches some prefix:
! # collect data to the prefix
! # 3) end of buffer does not match any prefix:
! # collect data
! terminator_len = len(terminator)
! index = string.find (self.ac_in_buffer, terminator)
! if index != -1:
! # we found the terminator
! if index > 0:
! # don't bother reporting the empty string (source of subtle bugs)
! self.collect_incoming_data (self.ac_in_buffer[:index])
! self.ac_in_buffer = self.ac_in_buffer[index+terminator_len:]
! # This does the Right Thing if the terminator is changed here.
! self.found_terminator()
! else:
! # check for a prefix of the terminator
! index = find_prefix_at_end (self.ac_in_buffer, terminator)
! if index:
! if index != lb:
! # we found a prefix, collect up to the prefix
! self.collect_incoming_data (self.ac_in_buffer[:-index])
! self.ac_in_buffer = self.ac_in_buffer[-index:]
! break
! else:
! # no prefix, collect it all
! self.collect_incoming_data (self.ac_in_buffer)
! self.ac_in_buffer = ''
!
! def handle_write (self):
! self.initiate_send ()
!
! def handle_close (self):
! self.close()
!
! def push (self, data):
! self.producer_fifo.push (simple_producer (data))
! self.initiate_send()
!
! def push_with_producer (self, producer):
! self.producer_fifo.push (producer)
! self.initiate_send()
!
! def readable (self):
! "predicate for inclusion in the readable for select()"
! return (len(self.ac_in_buffer) <= self.ac_in_buffer_size)
!
! def writable (self):
! "predicate for inclusion in the writable for select()"
! # return len(self.ac_out_buffer) or len(self.producer_fifo) or (not self.connected)
! # this is about twice as fast, though not as clear.
! return not (
! (self.ac_out_buffer is '') and
! self.producer_fifo.is_empty() and
! self.connected
! )
!
! def close_when_done (self):
! "automatically close this channel once the outgoing queue is empty"
! self.producer_fifo.push (None)
!
! # refill the outgoing buffer by calling the more() method
! # of the first producer in the queue
! def refill_buffer (self):
! _string_type = type('')
! while 1:
! if len(self.producer_fifo):
! p = self.producer_fifo.first()
! # a 'None' in the producer fifo is a sentinel,
! # telling us to close the channel.
! if p is None:
! if not self.ac_out_buffer:
! self.producer_fifo.pop()
! self.close()
! return
! elif type(p) is _string_type:
! self.producer_fifo.pop()
! self.ac_out_buffer = self.ac_out_buffer + p
! return
! data = p.more()
! if data:
! self.ac_out_buffer = self.ac_out_buffer + data
! return
! else:
! self.producer_fifo.pop()
! else:
! return
!
! def initiate_send (self):
! obs = self.ac_out_buffer_size
! # try to refill the buffer
! if (len (self.ac_out_buffer) < obs):
! self.refill_buffer()
!
! if self.ac_out_buffer and self.connected:
! # try to send the buffer
! try:
! num_sent = self.send (self.ac_out_buffer[:obs])
! if num_sent:
! self.ac_out_buffer = self.ac_out_buffer[num_sent:]
!
! except socket.error, why:
! self.handle_error()
! return
!
! def discard_buffers (self):
! # Emergencies only!
! self.ac_in_buffer = ''
! self.ac_out_buffer = ''
! while self.producer_fifo:
! self.producer_fifo.pop()
class simple_producer:
! def __init__ (self, data, buffer_size=512):
! self.data = data
! self.buffer_size = buffer_size
!
! def more (self):
! if len (self.data) > self.buffer_size:
! result = self.data[:self.buffer_size]
! self.data = self.data[self.buffer_size:]
! return result
! else:
! result = self.data
! self.data = ''
! return result
class fifo:
! def __init__ (self, list=None):
! if not list:
! self.list = []
! else:
! self.list = list
!
! def __len__ (self):
! return len(self.list)
!
! def is_empty (self):
! return self.list == []
!
! def first (self):
! return self.list[0]
!
! def push (self, data):
! self.list.append (data)
!
! def pop (self):
! if self.list:
! result = self.list[0]
! del self.list[0]
! return (1, result)
! else:
! return (0, None)
# Given 'haystack', see if any prefix of 'needle' is at its end. This
--- 52,273 ----
class async_chat (asyncore.dispatcher):
! """This is an abstract class. You must derive from this class, and add
! the two methods collect_incoming_data() and found_terminator()"""
! # these are overridable defaults
! ac_in_buffer_size = 4096
! ac_out_buffer_size = 4096
! def __init__ (self, conn=None):
! self.ac_in_buffer = ''
! self.ac_out_buffer = ''
! self.producer_fifo = fifo()
! asyncore.dispatcher.__init__ (self, conn)
!
! def set_terminator (self, term):
! "Set the input delimiter. Can be a fixed string of any length, an integer, or None"
! self.terminator = term
!
! def get_terminator (self):
! return self.terminator
!
! # grab some more data from the socket,
! # throw it to the collector method,
! # check for the terminator,
! # if found, transition to the next state.
!
! def handle_read (self):
!
! try:
! data = self.recv (self.ac_in_buffer_size)
! except socket.error, why:
! self.handle_error()
! return
!
! self.ac_in_buffer = self.ac_in_buffer + data
!
! # Continue to search for self.terminator in self.ac_in_buffer,
! # while calling self.collect_incoming_data. The while loop
! # is necessary because we might read several data+terminator
! # combos with a single recv(1024).
!
! while self.ac_in_buffer:
! lb = len(self.ac_in_buffer)
! terminator = self.get_terminator()
! if terminator is None:
! # no terminator, collect it all
! self.collect_incoming_data (self.ac_in_buffer)
! self.ac_in_buffer = ''
! elif type(terminator) == type(0):
! # numeric terminator
! n = terminator
! if lb < n:
! self.collect_incoming_data (self.ac_in_buffer)
! self.ac_in_buffer = ''
! self.terminator = self.terminator - lb
! else:
! self.collect_incoming_data (self.ac_in_buffer[:n])
! self.ac_in_buffer = self.ac_in_buffer[n:]
! self.terminator = 0
! self.found_terminator()
! else:
! # 3 cases:
! # 1) end of buffer matches terminator exactly:
! # collect data, transition
! # 2) end of buffer matches some prefix:
! # collect data to the prefix
! # 3) end of buffer does not match any prefix:
! # collect data
! terminator_len = len(terminator)
! index = string.find (self.ac_in_buffer, terminator)
! if index != -1:
! # we found the terminator
! if index > 0:
! # don't bother reporting the empty string (source of subtle bugs)
! self.collect_incoming_data (self.ac_in_buffer[:index])
! self.ac_in_buffer = self.ac_in_buffer[index+terminator_len:]
! # This does the Right Thing if the terminator is changed here.
! self.found_terminator()
! else:
! # check for a prefix of the terminator
! index = find_prefix_at_end (self.ac_in_buffer, terminator)
! if index:
! if index != lb:
! # we found a prefix, collect up to the prefix
! self.collect_incoming_data (self.ac_in_buffer[:-index])
! self.ac_in_buffer = self.ac_in_buffer[-index:]
! break
! else:
! # no prefix, collect it all
! self.collect_incoming_data (self.ac_in_buffer)
! self.ac_in_buffer = ''
!
! def handle_write (self):
! self.initiate_send ()
!
! def handle_close (self):
! self.close()
!
! def push (self, data):
! self.producer_fifo.push (simple_producer (data))
! self.initiate_send()
!
! def push_with_producer (self, producer):
! self.producer_fifo.push (producer)
! self.initiate_send()
!
! def readable (self):
! "predicate for inclusion in the readable for select()"
! return (len(self.ac_in_buffer) <= self.ac_in_buffer_size)
!
! def writable (self):
! "predicate for inclusion in the writable for select()"
! # return len(self.ac_out_buffer) or len(self.producer_fifo) or (not self.connected)
! # this is about twice as fast, though not as clear.
! return not (
! (self.ac_out_buffer is '') and
! self.producer_fifo.is_empty() and
! self.connected
! )
!
! def close_when_done (self):
! "automatically close this channel once the outgoing queue is empty"
! self.producer_fifo.push (None)
!
! # refill the outgoing buffer by calling the more() method
! # of the first producer in the queue
! def refill_buffer (self):
! _string_type = type('')
! while 1:
! if len(self.producer_fifo):
! p = self.producer_fifo.first()
! # a 'None' in the producer fifo is a sentinel,
! # telling us to close the channel.
! if p is None:
! if not self.ac_out_buffer:
! self.producer_fifo.pop()
! self.close()
! return
! elif type(p) is _string_type:
! self.producer_fifo.pop()
! self.ac_out_buffer = self.ac_out_buffer + p
! return
! data = p.more()
! if data:
! self.ac_out_buffer = self.ac_out_buffer + data
! return
! else:
! self.producer_fifo.pop()
! else:
! return
!
! def initiate_send (self):
! obs = self.ac_out_buffer_size
! # try to refill the buffer
! if (len (self.ac_out_buffer) < obs):
! self.refill_buffer()
!
! if self.ac_out_buffer and self.connected:
! # try to send the buffer
! try:
! num_sent = self.send (self.ac_out_buffer[:obs])
! if num_sent:
! self.ac_out_buffer = self.ac_out_buffer[num_sent:]
!
! except socket.error, why:
! self.handle_error()
! return
!
! def discard_buffers (self):
! # Emergencies only!
! self.ac_in_buffer = ''
! self.ac_out_buffer = ''
! while self.producer_fifo:
! self.producer_fifo.pop()
class simple_producer:
! def __init__ (self, data, buffer_size=512):
! self.data = data
! self.buffer_size = buffer_size
!
! def more (self):
! if len (self.data) > self.buffer_size:
! result = self.data[:self.buffer_size]
! self.data = self.data[self.buffer_size:]
! return result
! else:
! result = self.data
! self.data = ''
! return result
class fifo:
! def __init__ (self, list=None):
! if not list:
! self.list = []
! else:
! self.list = list
!
! def __len__ (self):
! return len(self.list)
!
! def is_empty (self):
! return self.list == []
!
! def first (self):
! return self.list[0]
!
! def push (self, data):
! self.list.append (data)
!
! def pop (self):
! if self.list:
! result = self.list[0]
! del self.list[0]
! return (1, result)
! else:
! return (0, None)
# Given 'haystack', see if any prefix of 'needle' is at its end. This
***************
*** 282,292 ****
##def find_prefix_at_end (haystack, needle):
! ## nl = len(needle)
! ## result = 0
! ## for i in range (1,nl):
! ## if haystack[-(nl-i):] == needle[:(nl-i)]:
! ## result = nl-i
! ## break
! ## return result
# yes, this is about twice as fast, but still seems
--- 282,292 ----
##def find_prefix_at_end (haystack, needle):
! ## nl = len(needle)
! ## result = 0
! ## for i in range (1,nl):
! ## if haystack[-(nl-i):] == needle[:(nl-i)]:
! ## result = nl-i
! ## break
! ## return result
# yes, this is about twice as fast, but still seems
***************
*** 299,318 ****
def prefix_regex (needle):
! if prefix_cache.has_key (needle):
! return prefix_cache[needle]
! else:
! reg = needle[-1]
! for i in range(1,len(needle)):
! reg = '%c\(%s\)?' % (needle[-(i+1)], reg)
! reg = regex.compile (reg+'$')
! prefix_cache[needle] = reg, len(needle)
! return reg, len(needle)
def find_prefix_at_end (haystack, needle):
! reg, length = prefix_regex (needle)
! lh = len(haystack)
! result = reg.search (haystack, max(0,lh-length))
! if result >= 0:
! return (lh - result)
! else:
! return 0
--- 299,318 ----
def prefix_regex (needle):
! if prefix_cache.has_key (needle):
! return prefix_cache[needle]
! else:
! reg = needle[-1]
! for i in range(1,len(needle)):
! reg = '%c\(%s\)?' % (needle[-(i+1)], reg)
! reg = regex.compile (reg+'$')
! prefix_cache[needle] = reg, len(needle)
! return reg, len(needle)
def find_prefix_at_end (haystack, needle):
! reg, length = prefix_regex (needle)
! lh = len(haystack)
! result = reg.search (haystack, max(0,lh-length))
! if result >= 0:
! return (lh - result)
! else:
! return 0
Index: asyncore.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/asyncore.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** asyncore.py 2000/09/11 04:00:46 1.7
--- asyncore.py 2001/01/14 18:09:23 1.8
***************
*** 1,11 ****
# -*- Mode: Python -*-
! # Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp
# Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# Copyright 1996 by Sam Rushing
! #
# All Rights Reserved
! #
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
--- 1,11 ----
# -*- Mode: Python -*-
! # Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp
# Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# Copyright 1996 by Sam Rushing
! #
# All Rights Reserved
! #
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
***************
*** 16,20 ****
# distribution of the software without specific, written prior
# permission.
! #
# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
--- 16,20 ----
# distribution of the software without specific, written prior
# permission.
! #
# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
***************
*** 29,33 ****
There are only two ways to have a program on a single processor do "more
! than one thing at a time". Multi-threaded programming is the simplest and
most popular way to do it, but there is another very different technique,
that lets you have nearly all the advantages of multi-threading, without
--- 29,33 ----
There are only two ways to have a program on a single processor do "more
! than one thing at a time". Multi-threaded programming is the simplest and
most popular way to do it, but there is another very different technique,
that lets you have nearly all the advantages of multi-threading, without
***************
*** 35,41 ****
is largely I/O bound. If your program is CPU bound, then pre-emptive
scheduled threads are probably what you really need. Network servers are
! rarely CPU-bound, however.
! If your operating system supports the select() system call in its I/O
library (and nearly all do), then you can use it to juggle multiple
communication channels at once; doing other work while your I/O is taking
--- 35,41 ----
is largely I/O bound. If your program is CPU bound, then pre-emptive
scheduled threads are probably what you really need. Network servers are
! rarely CPU-bound, however.
! If your operating system supports the select() system call in its I/O
library (and nearly all do), then you can use it to juggle multiple
communication channels at once; doing other work while your I/O is taking
***************
*** 44,48 ****
control than multi-threaded programming. The module documented here solves
many of the difficult problems for you, making the task of building
! sophisticated high-performance network servers and clients a snap.
"""
--- 44,48 ----
control than multi-threaded programming. The module documented here solves
many of the difficult problems for you, making the task of building
! sophisticated high-performance network servers and clients a snap.
"""
***************
*** 192,196 ****
except:
ar = 'no self.addr!'
!
return '<__repr__ (self) failed for object at %x (addr=%s)>' % (id(self),ar)
--- 192,196 ----
except:
ar = 'no self.addr!'
!
return '<__repr__ (self) failed for object at %x (addr=%s)>' % (id(self),ar)
***************
*** 325,329 ****
# log and log_info maybe overriden to provide more sophisitcated
# logging and warning methods. In general, log is for 'hit' logging
! # and 'log_info' is for informational, warning and error logging.
def log (self, message):
--- 325,329 ----
# log and log_info maybe overriden to provide more sophisitcated
# logging and warning methods. In general, log is for 'hit' logging
! # and 'log_info' is for informational, warning and error logging.
def log (self, message):
***************
*** 434,438 ****
tbinfo.append ((
tb.tb_frame.f_code.co_filename,
! tb.tb_frame.f_code.co_name,
str(tb.tb_lineno)
))
--- 434,438 ----
tbinfo.append ((
tb.tb_frame.f_code.co_filename,
! tb.tb_frame.f_code.co_name,
str(tb.tb_lineno)
))
Index: atexit.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/atexit.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** atexit.py 2000/06/28 15:07:31 1.1
--- atexit.py 2001/01/14 18:09:23 1.2
***************
*** 3,7 ****
upon normal program termination.
! One public function, register, is defined.
"""
--- 3,7 ----
upon normal program termination.
! One public function, register, is defined.
"""
***************
*** 13,17 ****
last in, first out.
"""
!
while _exithandlers:
func, targs, kargs = _exithandlers[-1]
--- 13,17 ----
last in, first out.
"""
!
while _exithandlers:
func, targs, kargs = _exithandlers[-1]
***************
*** 52,54 ****
register(x3, 5, "bar")
register(x3, "no kwd args")
-
--- 52,53 ----
Index: audiodev.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/audiodev.py,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -r1.9 -r1.10
*** audiodev.py 2000/08/17 05:06:49 1.9
--- audiodev.py 2001/01/14 18:09:23 1.10
***************
*** 2,254 ****
class error(Exception):
! pass
class Play_Audio_sgi:
! # Private instance variables
! ## if 0: access frameratelist, nchannelslist, sampwidthlist, oldparams, \
! ## params, config, inited_outrate, inited_width, \
! ## inited_nchannels, port, converter, classinited: private
!
! classinited = 0
! frameratelist = nchannelslist = sampwidthlist = None
!
! def initclass(self):
! import AL
! self.frameratelist = [
! (48000, AL.RATE_48000),
! (44100, AL.RATE_44100),
! (32000, AL.RATE_32000),
! (22050, AL.RATE_22050),
! (16000, AL.RATE_16000),
! (11025, AL.RATE_11025),
! ( 8000, AL.RATE_8000),
! ]
! self.nchannelslist = [
! (1, AL.MONO),
! (2, AL.STEREO),
! (4, AL.QUADRO),
! ]
! self.sampwidthlist = [
! (1, AL.SAMPLE_8),
! (2, AL.SAMPLE_16),
! (3, AL.SAMPLE_24),
! ]
! self.classinited = 1
!
! def __init__(self):
! import al, AL
! if not self.classinited:
! self.initclass()
! self.oldparams = []
! self.params = [AL.OUTPUT_RATE, 0]
! self.config = al.newconfig()
! self.inited_outrate = 0
! self.inited_width = 0
! self.inited_nchannels = 0
! self.converter = None
! self.port = None
! return
!
! def __del__(self):
! if self.port:
! self.stop()
! if self.oldparams:
! import al, AL
! al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
! self.oldparams = []
!
! def wait(self):
! if not self.port:
! return
! import time
! while self.port.getfilled() > 0:
! time.sleep(0.1)
! self.stop()
!
! def stop(self):
! if self.port:
! self.port.closeport()
! self.port = None
! if self.oldparams:
! import al, AL
! al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
! self.oldparams = []
!
! def setoutrate(self, rate):
! for (raw, cooked) in self.frameratelist:
! if rate == raw:
! self.params[1] = cooked
! self.inited_outrate = 1
! break
! else:
! raise error, 'bad output rate'
!
! def setsampwidth(self, width):
! for (raw, cooked) in self.sampwidthlist:
! if width == raw:
! self.config.setwidth(cooked)
! self.inited_width = 1
! break
! else:
! if width == 0:
! import AL
! self.inited_width = 0
! self.config.setwidth(AL.SAMPLE_16)
! self.converter = self.ulaw2lin
! else:
! raise error, 'bad sample width'
!
! def setnchannels(self, nchannels):
! for (raw, cooked) in self.nchannelslist:
! if nchannels == raw:
! self.config.setchannels(cooked)
! self.inited_nchannels = 1
! break
! else:
! raise error, 'bad # of channels'
!
! def writeframes(self, data):
! if not (self.inited_outrate and self.inited_nchannels):
! raise error, 'params not specified'
! if not self.port:
! import al, AL
! self.port = al.openport('Python', 'w', self.config)
! self.oldparams = self.params[:]
! al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
! al.setparams(AL.DEFAULT_DEVICE, self.params)
! if self.converter:
! data = self.converter(data)
! self.port.writesamps(data)
!
! def getfilled(self):
! if self.port:
! return self.port.getfilled()
! else:
! return 0
!
! def getfillable(self):
! if self.port:
! return self.port.getfillable()
! else:
! return self.config.getqueuesize()
!
! # private methods
! ## if 0: access *: private
!
! def ulaw2lin(self, data):
! import audioop
! return audioop.ulaw2lin(data, 2)
class Play_Audio_sun:
! ## if 0: access outrate, sampwidth, nchannels, inited_outrate, inited_width, \
! ## inited_nchannels, converter: private
! def __init__(self):
! self.outrate = 0
! self.sampwidth = 0
! self.nchannels = 0
! self.inited_outrate = 0
! self.inited_width = 0
! self.inited_nchannels = 0
! self.converter = None
! self.port = None
! return
!
! def __del__(self):
! self.stop()
!
! def setoutrate(self, rate):
! self.outrate = rate
! self.inited_outrate = 1
!
! def setsampwidth(self, width):
! self.sampwidth = width
! self.inited_width = 1
!
! def setnchannels(self, nchannels):
! self.nchannels = nchannels
! self.inited_nchannels = 1
!
! def writeframes(self, data):
! if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
! raise error, 'params not specified'
! if not self.port:
! import sunaudiodev, SUNAUDIODEV
! self.port = sunaudiodev.open('w')
! info = self.port.getinfo()
! info.o_sample_rate = self.outrate
! info.o_channels = self.nchannels
! if self.sampwidth == 0:
! info.o_precision = 8
! self.o_encoding = SUNAUDIODEV.ENCODING_ULAW
! # XXX Hack, hack -- leave defaults
! else:
! info.o_precision = 8 * self.sampwidth
! info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR
! self.port.setinfo(info)
! if self.converter:
! data = self.converter(data)
! self.port.write(data)
!
! def wait(self):
! if not self.port:
! return
! self.port.drain()
! self.stop()
!
! def stop(self):
! if self.port:
! self.port.flush()
! self.port.close()
! self.port = None
!
! def getfilled(self):
! if self.port:
! return self.port.obufcount()
! else:
! return 0
! def getfillable(self):
! return BUFFERSIZE - self.getfilled()
def AudioDev():
! # Dynamically try to import and use a platform specific module.
! try:
! import al
! except ImportError:
! try:
! import sunaudiodev
! return Play_Audio_sun()
! except ImportError:
! try:
! import Audio_mac
! except ImportError:
! raise error, 'no audio device'
! else:
! return Audio_mac.Play_Audio_mac()
! else:
! return Play_Audio_sgi()
def test(fn = None):
! import sys
! if sys.argv[1:]:
! fn = sys.argv[1]
! else:
! fn = 'f:just samples:just.aif'
! import aifc
! af = aifc.open(fn, 'r')
! print fn, af.getparams()
! p = AudioDev()
! p.setoutrate(af.getframerate())
! p.setsampwidth(af.getsampwidth())
! p.setnchannels(af.getnchannels())
! BUFSIZ = af.getframerate()/af.getsampwidth()/af.getnchannels()
! while 1:
! data = af.readframes(BUFSIZ)
! if not data: break
! print len(data)
! p.writeframes(data)
! p.wait()
if __name__ == '__main__':
! test()
--- 2,254 ----
class error(Exception):
! pass
class Play_Audio_sgi:
! # Private instance variables
! ## if 0: access frameratelist, nchannelslist, sampwidthlist, oldparams, \
! ## params, config, inited_outrate, inited_width, \
! ## inited_nchannels, port, converter, classinited: private
!
! classinited = 0
! frameratelist = nchannelslist = sampwidthlist = None
!
! def initclass(self):
! import AL
! self.frameratelist = [
! (48000, AL.RATE_48000),
! (44100, AL.RATE_44100),
! (32000, AL.RATE_32000),
! (22050, AL.RATE_22050),
! (16000, AL.RATE_16000),
! (11025, AL.RATE_11025),
! ( 8000, AL.RATE_8000),
! ]
! self.nchannelslist = [
! (1, AL.MONO),
! (2, AL.STEREO),
! (4, AL.QUADRO),
! ]
! self.sampwidthlist = [
! (1, AL.SAMPLE_8),
! (2, AL.SAMPLE_16),
! (3, AL.SAMPLE_24),
! ]
! self.classinited = 1
!
! def __init__(self):
! import al, AL
! if not self.classinited:
! self.initclass()
! self.oldparams = []
! self.params = [AL.OUTPUT_RATE, 0]
! self.config = al.newconfig()
! self.inited_outrate = 0
! self.inited_width = 0
! self.inited_nchannels = 0
! self.converter = None
! self.port = None
! return
!
! def __del__(self):
! if self.port:
! self.stop()
! if self.oldparams:
! import al, AL
! al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
! self.oldparams = []
!
! def wait(self):
! if not self.port:
! return
! import time
! while self.port.getfilled() > 0:
! time.sleep(0.1)
! self.stop()
!
! def stop(self):
! if self.port:
! self.port.closeport()
! self.port = None
! if self.oldparams:
! import al, AL
! al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
! self.oldparams = []
!
! def setoutrate(self, rate):
! for (raw, cooked) in self.frameratelist:
! if rate == raw:
! self.params[1] = cooked
! self.inited_outrate = 1
! break
! else:
! raise error, 'bad output rate'
!
! def setsampwidth(self, width):
! for (raw, cooked) in self.sampwidthlist:
! if width == raw:
! self.config.setwidth(cooked)
! self.inited_width = 1
! break
! else:
! if width == 0:
! import AL
! self.inited_width = 0
! self.config.setwidth(AL.SAMPLE_16)
! self.converter = self.ulaw2lin
! else:
! raise error, 'bad sample width'
!
! def setnchannels(self, nchannels):
! for (raw, cooked) in self.nchannelslist:
! if nchannels == raw:
! self.config.setchannels(cooked)
! self.inited_nchannels = 1
! break
! else:
! raise error, 'bad # of channels'
!
! def writeframes(self, data):
! if not (self.inited_outrate and self.inited_nchannels):
! raise error, 'params not specified'
! if not self.port:
! import al, AL
! self.port = al.openport('Python', 'w', self.config)
! self.oldparams = self.params[:]
! al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
! al.setparams(AL.DEFAULT_DEVICE, self.params)
! if self.converter:
! data = self.converter(data)
! self.port.writesamps(data)
!
! def getfilled(self):
! if self.port:
! return self.port.getfilled()
! else:
! return 0
!
! def getfillable(self):
! if self.port:
! return self.port.getfillable()
! else:
! return self.config.getqueuesize()
!
! # private methods
! ## if 0: access *: private
!
! def ulaw2lin(self, data):
! import audioop
! return audioop.ulaw2lin(data, 2)
class Play_Audio_sun:
! ## if 0: access outrate, sampwidth, nchannels, inited_outrate, inited_width, \
! ## inited_nchannels, converter: private
! def __init__(self):
! self.outrate = 0
! self.sampwidth = 0
! self.nchannels = 0
! self.inited_outrate = 0
! self.inited_width = 0
! self.inited_nchannels = 0
! self.converter = None
! self.port = None
! return
!
! def __del__(self):
! self.stop()
!
! def setoutrate(self, rate):
! self.outrate = rate
! self.inited_outrate = 1
!
! def setsampwidth(self, width):
! self.sampwidth = width
! self.inited_width = 1
!
! def setnchannels(self, nchannels):
! self.nchannels = nchannels
! self.inited_nchannels = 1
!
! def writeframes(self, data):
! if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
! raise error, 'params not specified'
! if not self.port:
! import sunaudiodev, SUNAUDIODEV
! self.port = sunaudiodev.open('w')
! info = self.port.getinfo()
! info.o_sample_rate = self.outrate
! info.o_channels = self.nchannels
! if self.sampwidth == 0:
! info.o_precision = 8
! self.o_encoding = SUNAUDIODEV.ENCODING_ULAW
! # XXX Hack, hack -- leave defaults
! else:
! info.o_precision = 8 * self.sampwidth
! info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR
! self.port.setinfo(info)
! if self.converter:
! data = self.converter(data)
! self.port.write(data)
!
! def wait(self):
! if not self.port:
! return
! self.port.drain()
! self.stop()
!
! def stop(self):
! if self.port:
! self.port.flush()
! self.port.close()
! self.port = None
!
! def getfilled(self):
! if self.port:
! return self.port.obufcount()
! else:
! return 0
! def getfillable(self):
! return BUFFERSIZE - self.getfilled()
def AudioDev():
! # Dynamically try to import and use a platform specific module.
! try:
! import al
! except ImportError:
! try:
! import sunaudiodev
! return Play_Audio_sun()
! except ImportError:
! try:
! import Audio_mac
! except ImportError:
! raise error, 'no audio device'
! else:
! return Audio_mac.Play_Audio_mac()
! else:
! return Play_Audio_sgi()
def test(fn = None):
! import sys
! if sys.argv[1:]:
! fn = sys.argv[1]
! else:
! fn = 'f:just samples:just.aif'
! import aifc
! af = aifc.open(fn, 'r')
! print fn, af.getparams()
! p = AudioDev()
! p.setoutrate(af.getframerate())
! p.setsampwidth(af.getsampwidth())
! p.setnchannels(af.getnchannels())
! BUFSIZ = af.getframerate()/af.getsampwidth()/af.getnchannels()
! while 1:
! data = af.readframes(BUFSIZ)
! if not data: break
! print len(data)
! p.writeframes(data)
! p.wait()
if __name__ == '__main__':
! test()