"""
############################################
extract palm memos from a .pdb database
file, to simple text files, one per memo,
using filenames derived from part of the
first line of memo; run in .pdb file's dir;
memo files appear in ./dbname/00n-line1.txt,
example: ./MemoDB/255-hardware_notes_4.txt;
dbase fmt = hdr + rec info array + memos\0;
############################################
"""
import glob # glob not in /usr
import struct, os
#flist = glob.glob('*.pdb') # skip others for now
flist = ['MemoDB.pdb'] # addresses beamed over
for fname in flist:
file = open(fname, 'rb') # open in binary mode
bytes = file.read()
print fname, len(bytes)
# dbname in hdr
eos = bytes.find(chr(0)) # null term, upto 32 chars
dbname = bytes[:min(32,eos)]
print dbname
if not os.path.exists(dbname):
os.mkdir(dbname)
else:
os.system('rm %s/*' % dbname) # make or clear output dir
# number records in hdr
frec = 77
(nrec,) = struct.unpack('>H',bytes[frec-1:frec+1]) # short, big-endian
print nrec
# scan rec info array after hdr
flst = 70
for rec in range(1, nrec+1):
# rec start offset
floc = flst + (rec * 8)
(rloc,) = struct.unpack('>I', bytes[floc:floc+4]) # int, or just << bytes
# rec end offset
fend = flst + ((rec+1) * 8)
(rend,) = struct.unpack('>I', bytes[fend:fend+4])
print rec, floc, rloc, rend
try: # memos past info array
memo = bytes[rloc:rend] # entire memo text
if memo[-1] == '\x00': memo = memo[:-1] # drop null at end
# makeup file name from 1st line
eolnpos = memo.find('\n')
if eolnpos == -1: eolnpos = len(memo) # -1 if no eoln
linelen = min(40, eolnpos) # up to 40 chars
line0 = memo[:linelen]
if line0[-1] == '\r': line0 = line0[:-1] # drop dos crg ret?
line1 = ''
for c in line0: # strip invalid chars
if (not c.isalnum()) and (c not in ['-']): # allow dash, not colon
line1 += '_'
else:
line1 += c
print repr(line1)
# output in text mode for eolns
xname = '%s/%03d-%s.txt' % (dbname, rec, line1)
xtract = open(xname, 'w')
xtract.write(memo)
xtract.close()
except:
import sys
print sys.exc_type, sys.exc_value
print 'BAD'
print 'Done'