mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-12-22 18:52:45 +01:00
179 lines
5.0 KiB
Python
179 lines
5.0 KiB
Python
"""
|
|
################################################################################
|
|
# Copyright (c) 2003, Pfizer
|
|
# Copyright (c) 2001, Cayce Ullman.
|
|
# Copyright (c) 2001, Brian Matthews.
|
|
#
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
# Redistributions of source code must retain the above copyright notice, this
|
|
# list of conditions and the following disclaimer.
|
|
#
|
|
# Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions and the following disclaimer in the documentation
|
|
# and/or other materials provided with the distribution.
|
|
#
|
|
# Neither the name of actzero, inc. nor the names of its contributors may
|
|
# be used to endorse or promote products derived from this software without
|
|
# specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
|
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
################################################################################
|
|
"""
|
|
|
|
ident = '$Id$'
|
|
from version import __version__
|
|
|
|
import exceptions
|
|
import copy
|
|
import re
|
|
import string
|
|
import sys
|
|
from types import *
|
|
|
|
# SOAPpy modules
|
|
from Errors import *
|
|
|
|
################################################################################
|
|
# Utility infielders
|
|
################################################################################
|
|
def collapseWhiteSpace(s):
|
|
return re.sub('\s+', ' ', s).strip()
|
|
|
|
def decodeHexString(data):
|
|
conv = {
|
|
'0': 0x0, '1': 0x1, '2': 0x2, '3': 0x3, '4': 0x4,
|
|
'5': 0x5, '6': 0x6, '7': 0x7, '8': 0x8, '9': 0x9,
|
|
|
|
'a': 0xa, 'b': 0xb, 'c': 0xc, 'd': 0xd, 'e': 0xe,
|
|
'f': 0xf,
|
|
|
|
'A': 0xa, 'B': 0xb, 'C': 0xc, 'D': 0xd, 'E': 0xe,
|
|
'F': 0xf,
|
|
}
|
|
|
|
ws = string.whitespace
|
|
|
|
bin = ''
|
|
|
|
i = 0
|
|
|
|
while i < len(data):
|
|
if data[i] not in ws:
|
|
break
|
|
i += 1
|
|
|
|
low = 0
|
|
|
|
while i < len(data):
|
|
c = data[i]
|
|
|
|
if c in string.whitespace:
|
|
break
|
|
|
|
try:
|
|
c = conv[c]
|
|
except KeyError:
|
|
raise ValueError, \
|
|
"invalid hex string character `%s'" % c
|
|
|
|
if low:
|
|
bin += chr(high * 16 + c)
|
|
low = 0
|
|
else:
|
|
high = c
|
|
low = 1
|
|
|
|
i += 1
|
|
|
|
if low:
|
|
raise ValueError, "invalid hex string length"
|
|
|
|
while i < len(data):
|
|
if data[i] not in string.whitespace:
|
|
raise ValueError, \
|
|
"invalid hex string character `%s'" % c
|
|
|
|
i += 1
|
|
|
|
return bin
|
|
|
|
def encodeHexString(data):
|
|
h = ''
|
|
|
|
for i in data:
|
|
h += "%02X" % ord(i)
|
|
|
|
return h
|
|
|
|
def leapMonth(year, month):
|
|
return month == 2 and \
|
|
year % 4 == 0 and \
|
|
(year % 100 != 0 or year % 400 == 0)
|
|
|
|
def cleanDate(d, first = 0):
|
|
ranges = (None, (1, 12), (1, 31), (0, 23), (0, 59), (0, 61))
|
|
months = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
|
|
names = ('year', 'month', 'day', 'hours', 'minutes', 'seconds')
|
|
|
|
if len(d) != 6:
|
|
raise ValueError, "date must have 6 elements"
|
|
|
|
for i in range(first, 6):
|
|
s = d[i]
|
|
|
|
if type(s) == FloatType:
|
|
if i < 5:
|
|
try:
|
|
s = int(s)
|
|
except OverflowError:
|
|
if i > 0:
|
|
raise
|
|
s = long(s)
|
|
|
|
if s != d[i]:
|
|
raise ValueError, "%s must be integral" % names[i]
|
|
|
|
d[i] = s
|
|
elif type(s) == LongType:
|
|
try: s = int(s)
|
|
except: pass
|
|
elif type(s) != IntType:
|
|
raise TypeError, "%s isn't a valid type" % names[i]
|
|
|
|
if i == first and s < 0:
|
|
continue
|
|
|
|
if ranges[i] != None and \
|
|
(s < ranges[i][0] or ranges[i][1] < s):
|
|
raise ValueError, "%s out of range" % names[i]
|
|
|
|
if first < 6 and d[5] >= 61:
|
|
raise ValueError, "seconds out of range"
|
|
|
|
if first < 2:
|
|
leap = first < 1 and leapMonth(d[0], d[1])
|
|
|
|
if d[2] > months[d[1]] + leap:
|
|
raise ValueError, "day out of range"
|
|
|
|
def debugHeader(title):
|
|
s = '*** ' + title + ' '
|
|
print s + ('*' * (72 - len(s)))
|
|
|
|
def debugFooter(title):
|
|
print '*' * 72
|
|
sys.stdout.flush()
|