1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
# load the funtools routines
_libname = './libfuntools.so.1.0'
libfuntools=cdll.LoadLibrary(_libname)
libc=cdll.LoadLibrary(None)
# region definitions
imannulusi=libfuntools.imannulusi
imboxi=libfuntools.imboxi
imcirclei=libfuntools.imcirclei
imellipsei=libfuntools.imellipsei
imfieldi=libfuntools.imfieldi
imlinei=libfuntools.imlinei
impiei=libfuntools.impiei
imqtpiei=libfuntools.imqtpiei
impointi=libfuntools.impointi
impandai=libfuntools.impandai
imnannulusi=libfuntools.imnannulusi
imnboxi=libfuntools.imnboxi
imnellipsei=libfuntools.imnellipsei
imnpiei=libfuntools.imnpiei
impolygoni=libfuntools.impolygoni
imvannulusi=libfuntools.imvannulusi
imvboxi=libfuntools.imvboxi
imvellipsei=libfuntools.imvellipsei
imvpiei=libfuntools.imvpiei
imvpointi=libfuntools.imvpointi
imannulus=libfuntools.imannulus
imbox=libfuntools.imbox
imcircle=libfuntools.imcircle
imellipse=libfuntools.imellipse
imfield=libfuntools.imfield
imline=libfuntools.imline
impie=libfuntools.impie
imqtpie=libfuntools.imqtpie
impoint=libfuntools.impoint
impanda=libfuntools.impanda
imnannulus=libfuntools.imnannulus
imnbox=libfuntools.imnbox
imnellipse=libfuntools.imnellipse
imnpie=libfuntools.imnpie
impolygon=libfuntools.impolygon
imvannulus=libfuntools.imvannulus
imvbox=libfuntools.imvbox
imvellipse=libfuntools.imvellipse
imvpie=libfuntools.imvpie
imvpoint=libfuntools.imvpoint
evannulus=libfuntools.evannulus
evbox=libfuntools.evbox
evcircle=libfuntools.evcircle
evellipse=libfuntools.evellipse
evfield=libfuntools.evfield
evline=libfuntools.evline
evpie=libfuntools.evpie
evqtpie=libfuntools.evqtpie
evpoint=libfuntools.evpoint
evnannulus=libfuntools.evnannulus
evnbox=libfuntools.evnbox
evnellipse=libfuntools.evnellipse
evnpie=libfuntools.evnpie
evpanda=libfuntools.evpanda
evpolygon=libfuntools.evpolygon
evvannulus=libfuntools.evvannulus
evvbox=libfuntools.evvbox
evvellipse=libfuntools.evvellipse
evvpie=libfuntools.evvpie
evvpoint=libfuntools.evvpoint
evvcircle=libfuntools.evvannulus
evncircle=libfuntools.evnannulus
evcpanda=libfuntools.evpanda
imvcirclei=libfuntools.imvannulusi
imncirclei=libfuntools.imnannulusi
imvcircle=libfuntools.imvannulus
imncircle=libfuntools.imnannulus
imcpandai=libfuntools.impandai
imcpanda=libfuntools.impanda
# from regions.h -- no idea what it is ...
xsno=3
# ... but its important!
maxshapes=(nshape*(xsno+1))+1
# ctypes struct definitions (taken from filter.h)
class filtmask(Structure):
_fields_ = [('region', c_int), ('y', c_int), ('xstart', c_int), ('xstop', c_int)]
class scanrec(Structure):
pass
# this is how you add a forward pointer
scanrec._fields_ = [ ('next', POINTER(scanrec)), ('x', c_int) ]
class shaperec(Structure):
_fields_ = [ ('init', c_int), ('ystart', c_double), ('ystop', c_double), ('scanlist', c_void_p), ('nv', c_int), ('xv', c_void_p), ('r1sq', c_double), ('r2sq', c_double), ('angl', c_double), ('sinangl', c_double), ('cosangl', c_double), ('cossq', c_double), ('sinsq', c_double), ('xradsq', c_double), ('yradsq', c_double), ('a', c_double), ('npt', c_int), ('pts', c_void_p), ('xonly', c_int), ('x1', c_double), ('x2', c_double), ('y1', c_double), ('invslope', c_double)]
class gfiltrec(Structure):
_fields_ = [('nshapes', c_int), ('maxshapes', c_int), ('shapes', POINTER(shaperec * maxshapes)), ('rid', c_int), ('usebinsiz', c_int), ('evsect', c_char_p), ('tlminx', c_double), ('tlminy', c_double), ('binsizx', c_double), ('binsizy', c_double), ('tloff', c_double), ('xmin', c_int), ('xmax', c_int), ('ymin', c_int), ('ymax', c_int), ('block', c_int), ('x0', c_int), ('x1', c_int), ('y0', c_int), ('y1', c_int), ('ybuf', POINTER(c_int)), ('x0s', POINTER(c_int)), ('x1s', POINTER(c_int)), ('nmask', c_int), ('maskdim', c_int), ('masks', POINTER(filtmask))]
# taken from the code in evfilter.c that initializes the g struct
# allocate shape record
shapearr = (shaperec * maxshapes)()
# allocate g record
grec = gfiltrec()
# fill in g record
grec.nshapes = nshape
grec.maxshapes = maxshapes
grec.shapes = pointer(shapearr)
# pointer to g record
g=pointer(grec)
# # processing loop
# while True:
# rvals = ''
# buf = sys.stdin.read(4)
# if not buf: break
# vals = struct.unpack('=i', buf)
# nev = vals[0]/evsize
# for i in range(nev):
# evbuf = sys.stdin.read(evsize)
# rvals += struct.pack('=i', xfilter(evdef, evbuf))
# sys.stdout.write(struct.pack('=i', nev*4))
# sys.stdout.write(rvals)
# sys.stdout.flush()
# processing loop
obytes = 0
while True:
# get byte count
nval = c_int(0)
if libc.read(0, byref(nval), 4) != 4: break
bytes = nval.value
nev = bytes / evsize
# create a new data buffer, if necessary
if obytes != bytes:
evbuf = create_string_buffer(bytes)
pevbuf = addressof(evbuf)
rvals = (c_int * nev)()
obytes = bytes
# read data
if libc.read(0, evbuf, bytes) != bytes: break
# process data
ioff = 0
for i in range(nev):
rvals[i] = xfilter(evdef, evbuf[ioff:ioff+evsize])
ioff += evsize
# write result byte count and result data
nval = c_int(nev*4)
libc.write(1, byref(nval), 4)
libc.write(1, rvals, nval)
|