# os.py -- either mac, dos or posix depending on what system we're on.

# This exports:
# - all functions from either posix or mac, e.g., os.unlink, os.stat, etc.
# - os.path is either module posixpath or macpath
# - os.name is either 'posix' or 'mac'
# - os.curdir is a string representing the current directory ('.' or ':')
# - os.pardir is a string representing the parent directory ('..' or '::')
# - os.sep is the (or a most common) pathname separator ('/' or ':')
# - os.pathsep is the component separator used in $PATH etc
# - os.defpath is the default search path for executables

# Programs that import and use 'os' stand a better chance of being
# portable between different platforms.  Of course, they must then
# only use functions that are defined by all platforms (e.g., unlink
# and opendir), and leave all pathname manipulation to os.path
# (e.g., split and join).

_osindex = {
	  'posix': ('.', '..', '/', ':', ':/bin:/usr/bin'),
	  'dos':   ('.', '..', '\\', ';', '.;C:\\bin'),
	  'nt':    ('.', '..', '\\', ';', '.;C:\\bin'),
	  'mac':   (':', '::', ':', '\n', ':'),
}

# For freeze.py script:
if 0:
	import posix
	import posixpath

import sys
for name in _osindex.keys():
	if name in sys.builtin_module_names:
		curdir, pardir, sep, pathsep, defpath = _osindex[name]
		exec 'from %s import *' % name
		exec 'import %spath' % name
		exec 'path = %spath' % name
		exec 'del %spath' % name
		try:
			exec 'from %s import _exit' % name
		except ImportError:
			pass
		break
else:
	del name
	raise ImportError, 'no os specific module found'

def execl(file, *args):
	execv(file, args)

def execle(file, *args):
	env = args[-1]
	execve(file, args[:-1], env)

def execlp(file, *args):
	execvp(file, args)

def execlpe(file, *args):
	env = args[-1]
	execvpe(file, args[:-1], env)

def execvp(file, args):
	_execvpe(file, args)

def execvpe(file, args, env):
	_execvpe(file, args, env)

_notfound = None
def _execvpe(file, args, env = None):
	if env:
		func = execve
		argrest = (args, env)
	else:
		func = execv
		argrest = (args,)
		env = environ
	global _notfound
	head, tail = path.split(file)
	if head:
		apply(func, (file,) + argrest)
		return
	if env.has_key('PATH'):
		envpath = env['PATH']
	else:
		envpath = defpath
	import string
	PATH = string.splitfields(envpath, pathsep)
	if not _notfound:
		import tempfile
		# Exec a file that is guaranteed not to exist
		try: execv(tempfile.mktemp(), ())
		except error, _notfound: pass
	exc, arg = error, _notfound
	for dir in PATH:
		fullname = path.join(dir, file)
		try:
			apply(func, (fullname,) + argrest)
		except error, (errno, msg):
			if errno != arg[0]:
				exc, arg = error, (errno, msg)
	raise exc, arg

# Provide listdir for Windows NT that doesn't have it built in
if name == 'nt':
	try:
		_tmp = listdir
		del _tmp
	except NameError:
		def listdir(name):
			if path.ismount(name):
				list = ['.']
			else:
				list = ['.', '..']
			f = popen('dir/l/b ' + name, 'r')
			line = f.readline()
			while line:
				list.append(line[:-1])
				line = f.readline()
			return list
