[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()