--- a/gamin.spec 2020-04-28 10:15:58.288728880 +0300 +++ b/gamin.spec 2020-04-28 10:16:15.368816041 +0300 @@ -32,7 +32,7 @@ Summary: Python bindings for the gamin library Group: Development/Libraries Requires: gamin = %{version} -Requires: %{_libdir}/python%(echo `python -c "import sys; print sys.version[0:3]"`) +Requires: %{_libdir}/python%(echo `python -c "import sys; print(sys.version[0:3])"`) %description python The gamin-python package contains a module that allow monitoring of --- a/python/tests/basic2.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/basic2.py 2020-04-28 09:21:56.928853041 +0300 @@ -16,4 +16,4 @@ mon.disconnect() del mon -print "OK" +print("OK") --- a/python/tests/basic3.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/basic3.py 2020-04-28 09:22:48.185783579 +0300 @@ -27,7 +27,7 @@ shutil.rmtree ("temp_dir", True) os.mkdir ("temp_dir") if top != 4: - print "Error: top monitor got %d events insteads of 4" % (top) + print("Error: top monitor got %d events insteads of 4" % (top)) sys.exit(1) -print "OK" +print("OK") --- a/python/tests/basic4.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/basic4.py 2020-04-28 09:23:35.479360223 +0300 @@ -13,10 +13,10 @@ def callback(path, event): global top, expect, ok - print "Got callback: %s, %s" % (path, event) + print("Got callback: %s, %s" % (path, event)) if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -36,8 +36,8 @@ del mon shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: top monitor got %d events insteads of 4" % (top) + print("Error: top monitor got %d events insteads of 4" % (top)) sys.exit(1) if ok: - print "OK" + print("OK") --- a/python/tests/basic5.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/basic5.py 2020-04-28 09:24:24.129610391 +0300 @@ -15,8 +15,8 @@ global top, expect, ok # print "Got callback: %s, %s" % (path, event) if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -34,8 +34,8 @@ del mon shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: top monitor got %d events insteads of 4" % (top) + print("Error: top monitor got %d events insteads of 4" % (top)) sys.exit(1) if ok: - print "OK" + print("OK") --- a/python/tests/basic6.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/basic6.py 2020-04-28 09:25:17.209883211 +0300 @@ -14,8 +14,8 @@ global top, expect, ok # print "Got callback: %s, %s" % (path, event) if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -32,8 +32,8 @@ del mon shutil.rmtree ("temp_dir", True) if top != 3: - print "Error: top monitor got %d events insteads of 3" % (top) + print("Error: top monitor got %d events insteads of 3" % (top)) sys.exit(1) if ok: - print "OK" + print("OK") --- a/python/tests/basic.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/basic.py 2020-04-28 09:25:44.686691054 +0300 @@ -20,6 +20,6 @@ mon.disconnect() del mon if nb_callbacks > 2: - print 'OK' + print('OK') else: - print 'error' + print('error') --- a/python/tests/bigfile.py 2020-04-28 10:04:16.718483188 +0300 +++ b/python/tests/bigfile.py 2020-04-28 10:08:29.099770201 +0300 @@ -11,16 +11,16 @@ expect = [gamin.GAMExists, gamin.GAMEndExist, gamin.GAMDeleted] def callback(path, event): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) os.mkdir ("temp_dir") fd = os.open("temp_dir/bigfile", os.O_WRONLY | os.O_CREAT) -os.lseek(fd, 2200000000L, 0) +os.lseek(fd, 2200000000, 0) os.write(fd, "foo") os.close(fd) @@ -36,8 +36,8 @@ shutil.rmtree ("temp_dir", True) if top != 3: - print "Error: top monitor got %d events insteads of 3" % (top) + print("Error: top monitor got %d events insteads of 3" % (top)) sys.exit(1) if ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify10.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify10.py 2020-04-28 09:32:18.885379969 +0300 @@ -22,30 +22,30 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect2[top2] != event: - print "Error got event %d expected %d" % (expect2[top2], event) - ok = 0 + print("Error got event %d expected %d" % (expect2[top2], event)) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -72,10 +72,10 @@ shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: monitor got %d events insteads of 4" % (top) + print("Error: monitor got %d events insteads of 4" % (top)) elif top2 != 2: - print "Error: monitor got %d events insteads of 2" % (top2) + print("Error: monitor got %d events insteads of 2" % (top2)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify11.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify11.py 2020-04-28 09:33:43.045811250 +0300 @@ -23,30 +23,30 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect2[top2] != event: - print "Error got event %d expected %d" % (expect2[top2], event) - ok = 0 + print("Error got event %d expected %d" % (expect2[top2], event)) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -76,10 +76,10 @@ shutil.rmtree ("temp_dir", True) if top != 5: - print "Error: monitor got %d events insteads of 5" % (top) + print("Error: monitor got %d events insteads of 5" % (top)) elif top2 != 3: - print "Error: monitor got %d events insteads of 3" % (top2) + print ("Error: monitor got %d events insteads of 3" % (top2)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify12.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify12.py 2020-04-28 09:35:57.416499538 +0300 @@ -23,30 +23,30 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect2[top2] != event: - print "Error got event %d expected %d" % (expect2[top2], event) - ok = 0 + print("Error got event %d expected %d" % (expect2[top2], event)) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -75,10 +75,10 @@ shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: monitor got %d events insteads of 4" % (top) + print("Error: monitor got %d events insteads of 4" % (top)) elif top2 != 5: - print "Error: monitor2 got %d events insteads of 5" % (top2) + print("Error: monitor2 got %d events insteads of 5" % (top2)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify13.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify13.py 2020-04-28 09:36:58.396811829 +0300 @@ -27,40 +27,40 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect2[top2] != event: - print "Error got event %d expected %d" % (expect2[top2], event) - ok = 0 + print("Error got event %d expected %d" % (expect2[top2], event)) + ok = 0 top2 = top2 + 1 def callback3(path, event, which): global top3, expect3, ok -# print "Got callback3: %s, %s" % (path, event) +# print("Got callback3: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect3[top3] != event: - print "Error got event %d expected %d" % (expect3[top3], event) - ok = 0 + print("Error got event %d expected %d" % (expect3[top3], event)) + ok = 0 top3 = top3 + 1 shutil.rmtree ("temp_dir", True) @@ -94,12 +94,12 @@ shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: monitor got %d events insteads of 4" % (top) + print("Error: monitor got %d events insteads of 4" % (top)) elif top2 != 5: - print "Error: monitor2 got %d events insteads of 5" % (top2) + print("Error: monitor2 got %d events insteads of 5" % (top2)) elif top3 != 4: - print "Error: monitor3 got %d events insteads of 4" % (top3) + print("Error: monitor3 got %d events insteads of 4" % (top3)) elif dbg != 6 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify15.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify15.py 2020-04-28 09:37:53.067091790 +0300 @@ -18,26 +18,26 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) # ignore events on a, focuse on b only if path[-2:] == "/a": return if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -92,8 +92,8 @@ shutil.rmtree ("temp_dir", True) if top != 3: - print "Error: monitor got %d events insteads of 3" % (top) + print("Error: monitor got %d events insteads of 3" % (top)) elif dbg != 5 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 5" % (dbg) + print("Error: debug got %d events insteads of 5" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify2.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify2.py 2020-04-28 09:38:30.887285380 +0300 @@ -18,23 +18,23 @@ def debug(path, type, data): global dbg, db_expect, ok - print "Got debug %s, %s, %s" % (path, type, data) + print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -56,8 +56,8 @@ shutil.rmtree ("temp_dir", True) if top != 2: - print "Error: monitor got %d events insteads of 2" % (top) + print("Error: monitor got %d events insteads of 2" % (top)) elif dbg != 2 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 2" % (dbg) + print("Error: debug got %d events insteads of 2" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify3.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify3.py 2020-04-28 09:40:47.691318954 +0300 @@ -19,23 +19,23 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-10:] != "temp_dir/a": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (db_expect[dbg], type) - ok = 0 + print("Error got debug event %d expected %d" % (db_expect[dbg], type)) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 @@ -60,8 +60,8 @@ del mon if top != 3: - print "Error: monitor got %d events insteads of 2" % (top) + print("Error: monitor got %d events insteads of 2" % (top)) elif dbg != 2 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 2" % (dbg) + print("Error: debug got %d events insteads of 2" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify4.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify4.py 2020-04-28 09:41:22.311496122 +0300 @@ -18,23 +18,23 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (db_expect[dbg], type) - ok = 0 + print("Error got debug event %d expected %d" % (db_expect[dbg], type)) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -55,8 +55,8 @@ shutil.rmtree ("temp_dir", True) if top != 2: - print "Error: monitor got %d events insteads of 2" % (top) + print("Error: monitor got %d events insteads of 2" % (top)) elif dbg != 2 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 2" % (dbg) + print("Error: debug got %d events insteads of 2" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify5.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify5.py 2020-04-28 09:41:22.321496173 +0300 @@ -19,23 +19,23 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -61,8 +61,8 @@ shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: monitor got %d events insteads of 4" % (top) + print("Error: monitor got %d events insteads of 4" % (top)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify6.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify6.py 2020-04-28 09:41:22.331496225 +0300 @@ -19,26 +19,26 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if dbg < 2 and path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if dbg >= 2 and path[-10:] != "temp_dir/a": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -64,8 +64,8 @@ shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: monitor got %d events insteads of 4" % (top) + print("Error: monitor got %d events insteads of 4" % (top)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify7.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify7.py 2020-04-28 09:50:04.574149660 +0300 @@ -15,52 +15,52 @@ dbg = 0 db_expect = [ 51, # directory watch 53, # file watch count incremented - 53, # file disapear count decremented - 53, # file recreated - 53, # removal of watch on file - 52 # removal of watch on directory - ] + 53, # file disapear count decremented + 53, # file recreated + 53, # removal of watch on file + 52 # removal of watch on directory + ] top_f = 0 expect_f = [gamin.GAMExists, gamin.GAMEndExist, gamin.GAMDeleted, gamin.GAMCreated] top_d = 0 expect_d = [gamin.GAMExists, # directory exists gamin.GAMExists, # file a exists - gamin.GAMEndExist,# end listing - gamin.GAMDeleted, # file a removed + gamin.GAMEndExist,# end listing + gamin.GAMDeleted, # file a removed gamin.GAMCreated # file a created - ] + ] def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback_file(path, event): global top_f, expect_f, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect_f[top_f] != event: - print "Error got file event %d expected %d" % (expect_f[top_f], event) - ok = 0 + print("Error got file event %d expected %d" % (expect_f[top_f], event)) + ok = 0 top_f = top_f + 1 def callback_dir(path, event): global top_d, expect_d, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect_d[top_d] != event: - print "Error got dir event %d expected %d" % (expect_d[top_d], event) - ok = 0 + print("Error got dir event %d expected %d" % (expect_d[top_d], event)) + ok = 0 top_d = top_d + 1 shutil.rmtree ("temp_dir", True) @@ -88,10 +88,10 @@ shutil.rmtree ("temp_dir", True) if top_f != 4: - print "Error: file monitor got %d events insteads of 4" % (top_f) + print("Error: file monitor got %d events insteads of 4" % (top_f)) if top_d != 5: - print "Error: dir monitor got %d events insteads of 4" % (top_d) + print("Error: dir monitor got %d events insteads of 4" % (top_d)) elif dbg != 6 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 6" % (dbg) + print("Error: debug got %d events insteads of 6" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify8.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify8.py 2020-04-28 09:41:22.338162925 +0300 @@ -23,30 +23,30 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect2[top2] != event: - print "Error got event %d expected %d" % (expect2[top2], event) - ok = 0 + print("Error got event %d expected %d" % (expect2[top2], event)) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -74,10 +74,10 @@ shutil.rmtree ("temp_dir", True) if top != 5: - print "Error: monitor got %d events insteads of 5" % (top) + print("Error: monitor got %d events insteads of 5" % (top)) elif top2 != 3: - print "Error: monitor got %d events insteads of 3" % (top2) + print("Error: monitor got %d events insteads of 3" % (top2)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify9.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify9.py 2020-04-28 09:41:22.348162976 +0300 @@ -23,30 +23,30 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect2[top2] != event: - print "Error got event %d expected %d" % (expect2[top2], event) - ok = 0 + print("Error got event %d expected %d" % (expect2[top2], event)) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -73,10 +73,10 @@ shutil.rmtree ("temp_dir", True) if top != 4: - print "Error: monitor got %d events insteads of 4" % (top) + print("Error: monitor got %d events insteads of 4" % (top)) elif top2 != 2: - print "Error: monitor got %d events insteads of 2" % (top2) + print("Error: monitor got %d events insteads of 2" % (top2)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/dnotify.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/dnotify.py 2020-04-28 09:41:57.501676222 +0300 @@ -19,23 +19,23 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-10:] != "temp_dir/a": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (db_expect[dbg], type) - ok = 0 + print("Error got debug event %d expected %d" % (db_expect[dbg], type)) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 @@ -58,8 +58,8 @@ shutil.rmtree ("temp_dir", True) if top != 2: - print "Error: monitor got %d events insteads of 2" % (top) + print("Error: monitor got %d events insteads of 2" % (top)) elif dbg != 2 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 2" % (dbg) + print("Error: debug got %d events insteads of 2" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/flood2.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/flood2.py 2020-04-28 09:43:06.445362352 +0300 @@ -37,15 +37,15 @@ global block threads = threads + 1 -# print "%s active" % (filename) +# print("%s active" % (filename)) f = open(filename, "w") f.write(block) j = 0 while j < 50: wait_ms(100) - j = j + 1 - f.write(block) -# print "%s quiet" % (filename) + j = j + 1 + f.write(block) +# print("%s quiet" % (filename)) f.close() wait_ms(8000) threads = threads - 1 @@ -63,43 +63,43 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 # on may see one or two bursts if dbg == 4 and type == 53: dbg = 6 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if top < 2: - if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + if expect[top] != event: + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 elif event != gamin.GAMChanged: - print "Error got event %d expected %d" % (event, gamin.GAMChanged) - ok = 0 + print("Error got event %d expected %d" % (event, gamin.GAMChanged)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) # ignore the Changed events generated by modifying a if event == gamin.GAMAcknowledge: return if event == gamin.GAMChanged: return if expect2[top2] != event: - print "Error got event %d expected %d" % (event, expect2[top2]) - ok = 0 + print("Error got event %d expected %d" % (event, expect2[top2])) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -121,7 +121,7 @@ i = i + 1 wait_ms(100) mon.handle_events() -# print "created b" +# print("created b") f = open("temp_dir/b", "w").close() while i < 50: i = i + 1 @@ -129,7 +129,7 @@ mon.handle_events() mon.handle_events() os.unlink("temp_dir/b") -# print "deleted b" +# print("deleted b") # wait until the thread finishes, collecting events wait_ms(100) @@ -137,7 +137,7 @@ mon.handle_events() wait_ms(100) -#print "all threads terminated, exiting ..." +#print("all threads terminated, exiting ...") mon.handle_events() mon.stop_watch("temp_dir/a") @@ -149,12 +149,12 @@ shutil.rmtree ("temp_dir", True) if top <= 2: - print "Error: monitor got only %d events" % (top) + print("Error: monitor got only %d events" % (top)) elif top >= 28: - print "Error: event flow didn't worked properly, gor %d events" % (top) + print("Error: event flow didn't worked properly, gor %d events" % (top)) elif top2 != 5: - print "Error: monitor2 got %d events instead of %d" % (top2, 5) + print("Error: monitor2 got %d events instead of %d" % (top2, 5)) elif dbg != 8 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 8" % (dbg) + print("Error: debug got %d events insteads of 8" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/flood3.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/flood3.py 2020-04-28 09:43:06.458695754 +0300 @@ -37,15 +37,15 @@ global block threads = threads + 1 -# print "%s active" % (filename) +# print("%s active" % (filename)) f = open(filename, "w") f.write(block) j = 0 while j < 50: wait_ms(100) - j = j + 1 - f.write(block) -# print "%s quiet" % (filename) + j = j + 1 + f.write(block) +# print("%s quiet" % (filename)) f.close() time.sleep(8) threads = threads - 1 @@ -62,41 +62,41 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if top < 2: - if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + if expect[top] != event: + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 elif event != gamin.GAMChanged: - print "Error got event %d expected %d" % (event, gamin.GAMChanged) - ok = 0 + print("Error got event %d expected %d" % (event, gamin.GAMChanged)) + ok = 0 top = top + 1 def callback2(path, event, which): global top2, expect2, ok -# print "Got callback2: %s, %s" % (path, event) +# print("Got callback2: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if top2 < 2: - if expect2[top2] != event: - print "Error got event %d expected %d" % (event, expect2[top2]) - ok = 0 + if expect2[top2] != event: + print("Error got event %d expected %d" % (event, expect2[top2])) + ok = 0 elif event != gamin.GAMChanged: - print "Error got event %d expected %d" % (event, gamin.GAMChanged) - ok = 0 + print("Error got event %d expected %d" % (event, gamin.GAMChanged)) + ok = 0 top2 = top2 + 1 shutil.rmtree ("temp_dir", True) @@ -127,7 +127,7 @@ mon.handle_events() time.sleep(1) -#print "all threads terminated, exiting ..." +#print("all threads terminated, exiting ...") mon.handle_events() mon.stop_watch("temp_dir/a") @@ -139,14 +139,14 @@ shutil.rmtree ("temp_dir", True) if top <= 2: - print "Error: monitor got only %d events" % (top) + print("Error: monitor got only %d events" % (top)) elif top >= 20: - print "Error: event flow didn't worked properly, got %d events" % (top) + print("Error: event flow didn't worked properly, got %d events" % (top)) elif top2 <= 2: - print "Error: monitor got only %d events" % (top2) + print("Error: monitor got only %d events" % (top2)) elif top2 >= 20: - print "Error: event flow didn't worked properly, got %d events 2" % (top2) + print("Error: event flow didn't worked properly, got %d events 2" % (top2)) elif dbg != 6 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 6" % (dbg) + print("Error: debug got %d events insteads of 6" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/flood4.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/flood4.py 2020-04-28 09:43:06.468695805 +0300 @@ -36,20 +36,20 @@ threads = threads + 1 i = 0 while i < 15: - f = open(directory + '/a', "w").close() - f = open(directory + '/b', "w").close() - f = open(directory + '/c', "w").close() + f = open(directory + '/a', "w").close() + f = open(directory + '/b', "w").close() + f = open(directory + '/c', "w").close() wait_ms(100) - os.unlink(directory + '/a') - f = open(directory + '/d', "w").close() - os.unlink(directory + '/b') - f = open(directory + '/e', "w").close() + os.unlink(directory + '/a') + f = open(directory + '/d', "w").close() + os.unlink(directory + '/b') + f = open(directory + '/e', "w").close() wait_ms(100) - os.unlink(directory + '/c') - os.unlink(directory + '/d') - os.unlink(directory + '/e') + os.unlink(directory + '/c') + os.unlink(directory + '/d') + os.unlink(directory + '/e') wait_ms(100) - i = i + 1 + i = i + 1 wait_ms(8000) threads = threads - 1 thread.exit() @@ -63,28 +63,28 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if top < 2: - if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + if expect[top] != event: + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 elif event != gamin.GAMCreated and event != gamin.GAMDeleted and \ event != gamin.GAMChanged: - print "Error got event %d" % (event) - ok = 0 + print("Error got event %d" % (event)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -101,7 +101,7 @@ mon.handle_events() wait_ms(100) -#print "all threads terminated, exiting ..." +#print("all threads terminated, exiting ...") mon.stop_watch("temp_dir") time.sleep(1) @@ -111,10 +111,10 @@ shutil.rmtree ("temp_dir", True) if top <= 2: - print "Error: monitor got only %d events" % (top) + print("Error: monitor got only %d events" % (top)) elif top >= 60: - print "Error: event flow didn't worked properly, gor %d events" % (top) + print("Error: event flow didn't worked properly, gor %d events" % (top)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/flood.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/flood.py 2020-04-28 09:44:19.372402209 +0300 @@ -34,15 +34,15 @@ global block threads = threads + 1 -# print "%s active" % (filename) +# print("%s active" % (filename)) f = open(filename, "w") f.write(block) i = 0 while i < 50: wait_ms(100) - i = i + 1 - f.write(block) -# print "%s quiet" % (filename) + i = i + 1 + f.write(block) +# print("%s quiet" % (filename)) wait_ms(10000) f.write(block) f.close() @@ -59,27 +59,27 @@ def debug(path, type, data): global dbg, db_expect, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) if path[-8:] != "temp_dir": - print "Error got debug path unexpected %s" % (path) - ok = 0 + print("Error got debug path unexpected %s" % (path)) + ok = 0 if db_expect[dbg] != type: - print "Error got debug event %d expected %d" % (type, db_expect[dbg]) - ok = 0 + print("Error got debug event %d expected %d" % (type, db_expect[dbg])) + ok = 0 dbg = dbg + 1 def callback(path, event, which): global top, expect, ok - print "Got callback: %s, %s" % (path, event) + print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if top < 2: - if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + if expect[top] != event: + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 elif event != gamin.GAMChanged: - print "Error got event %d expected %d" % (event, gamin.GAMChanged) - ok = 0 + print("Error got event %d expected %d" % (event, gamin.GAMChanged)) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -97,7 +97,7 @@ mon.handle_events() wait_ms(100) -#print "all threads terminated, exiting ..." +#print("all threads terminated, exiting ...") mon.stop_watch("temp_dir/a") time.sleep(1) @@ -107,10 +107,10 @@ shutil.rmtree ("temp_dir", True) if top <= 2: - print "Error: monitor got only %d events" % (top) + print("Error: monitor got only %d events" % (top)) elif top >= 15: - print "Error: event flow didn't worked properly, gor %d events" % (top) + print("Error: event flow didn't worked properly, gor %d events" % (top)) elif dbg != 4 and gamin.has_debug_api == 1: - print "Error: debug got %d events insteads of 4" % (dbg) + print("Error: debug got %d events insteads of 4" % (dbg)) elif ok == 1: - print "OK" + print("OK") --- a/python/tests/readonly.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/readonly.py 2020-04-28 09:48:02.523532294 +0300 @@ -12,10 +12,10 @@ def callback(path, event): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if expect[top] != event: - print "Error got event %d expected %d" % (event, expect[top]) - ok = 0 + print("Error got event %d expected %d" % (event, expect[top])) + ok = 0 top = top + 1 shutil.rmtree ("temp_dir", True) @@ -29,11 +29,11 @@ mon.stop_watch("temp_dir") mon.disconnect() del mon -os.chmod ("temp_dir", 0755) +os.chmod ("temp_dir", 755) shutil.rmtree ("temp_dir", True) if top != 2: - print "Error: top monitor got %d events insteads of 4" % (top) + print("Error: top monitor got %d events insteads of 4" % (top)) sys.exit(1) if ok: - print "OK" + print("OK") --- a/python/tests/level.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/level.patched.py 2020-04-28 11:17:24.737888018 +0300 @@ -10,7 +10,7 @@ sub = 0 def callback(path, event, which): global top, sub -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if which == 0: top = top + 1 elif which == 1: @@ -27,7 +27,7 @@ mon.handle_events() mon.stop_watch("temp_dir") if top != 3: - print "Error: top monitor got %d events insteads of 3" % (top) + print("Error: top monitor got %d events insteads of 3" % (top)) time.sleep(1) os.mkdir ("temp_dir/a/b") time.sleep(1) @@ -38,6 +38,6 @@ shutil.rmtree ("temp_dir", True) if sub != 3: - print "Error: sub monitor got %d events insteads of 3" % (sub) + print("Error: sub monitor got %d events insteads of 3" % (sub)) else: - print "OK" + print("OK") --- a/python/tests/multiple2.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/multiple2.patched.py 2020-04-28 09:44:44.835865847 +0300 @@ -11,11 +11,11 @@ def callback(path, event, number): global nb_callbacks -# print "Got callback: %d, %s, %s" % (number, path, event) +# print("Got callback: %d, %s, %s" % (number, path, event)) if nb_callbacks.has_key(number): nb_callbacks[number] = nb_callbacks[number] + 1 else: - nb_callbacks[number] = 1 + nb_callbacks[number] = 1 shutil.rmtree ("temp_dir", True) os.mkdir ("temp_dir") @@ -47,11 +47,11 @@ i = 0 while i < 10: if not nb_callbacks.has_key(i): - print "Error: monitor %d didn't got events" % (i) - sys.exit(1) + print("Error: monitor %d didn't got events" % (i)) + sys.exit(1) if nb_callbacks[i] != 4: - print "Error: monitor %d got %d out of 4 events" % (i, nb_callbacks[i]) - sys.exit(1) + print("Error: monitor %d got %d out of 4 events" % (i, nb_callbacks[i])) + sys.exit(1) i = i + 1 shutil.rmtree ("temp_dir/a", True) @@ -64,9 +64,9 @@ shutil.rmtree ("temp_dir", True) if not nb_callbacks.has_key(11): - print "Error: main monitor didn't got events" + print("Error: main monitor didn't got events") sys.exit(1) if nb_callbacks[11] != 6: - print "Error: main monitor got %d out of 6 events" % (nb_callbacks[11]) + print("Error: main monitor got %d out of 6 events" % (nb_callbacks[11])) sys.exit(1) -print "OK" +print("OK") --- a/python/tests/multiple3.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/multiple3.patched.py 2020-04-28 09:48:53.360455909 +0300 @@ -21,25 +21,25 @@ global expect1, nb1 global expect2, nb2 -# print "Got callback on %d: %s, %s" % (which, path, event) +# print("Got callback on %d: %s, %s" % (which, path, event)) if event == gamin.GAMAcknowledge: return if which == 0: if event != expect0[nb0]: - print "Error: monitor %d got event %d expected %d" % (which, event, - expect0[nb0]) + print("Error: monitor %d got event %d expected %d" % (which, event, + expect0[nb0])) ok = 0 nb0 = nb0 + 1 elif which == 1: if event != expect1[nb1]: - print "Error: monitor %d got event %d expected %d" % (which, event, - expect1[nb1]) + print("Error: monitor %d got event %d expected %d" % (which, event, + expect1[nb1])) ok = 0 nb1 = nb1 + 1 elif which == 2: if event != expect2[nb2]: - print "Error: monitor %d got event %d expected %d" % (which, event, - expect2[nb2]) + print("Error: monitor %d got event %d expected %d" % (which, event, + expect2[nb2])) ok = 0 nb2 = nb2 + 1 @@ -72,13 +72,13 @@ shutil.rmtree ("temp_dir", True) if nb0 != len(expect0): - print "Error: monitor 0 got %d events, expecting %d" % (nb0, len(expect0)) + print("Error: monitor 0 got %d events, expecting %d" % (nb0, len(expect0))) ok = 0 if nb1 != len(expect1): - print "Error: monitor 1 got %d events, expecting %d" % (nb1, len(expect1)) + print("Error: monitor 1 got %d events, expecting %d" % (nb1, len(expect1))) ok = 0 if nb2 != len(expect2): - print "Error: monitor 2 got %d events, expecting %d" % (nb2, len(expect2)) + print("Error: monitor 2 got %d events, expecting %d" % (nb2, len(expect2))) ok = 0 if ok: - print "OK" + print("OK") --- a/python/tests/multiple.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/multiple.patched.py 2020-04-28 09:45:02.162621170 +0300 @@ -11,11 +11,11 @@ def callback(path, event, number): global nb_callbacks -# print "Got callback: %d, %s, %s" % (number, path, event) +# print("Got callback: %d, %s, %s" % (number, path, event)) if nb_callbacks.has_key(number): nb_callbacks[number] = nb_callbacks[number] + 1 else: - nb_callbacks[number] = 1 + nb_callbacks[number] = 1 shutil.rmtree ("temp_dir", True) os.mkdir ("temp_dir") @@ -44,11 +44,11 @@ i = 0 while i < 10: if not nb_callbacks.has_key(i): - print "Error: monitor %d didn't got events" % (i) - sys.exit(1) + print("Error: monitor %d didn't got events" % (i)) + sys.exit(1) if nb_callbacks[i] != 4: - print "Error: monitor %d got %d out of 4 events" % (i, nb_callbacks[i]) - sys.exit(1) + print("Error: monitor %d got %d out of 4 events" % (i, nb_callbacks[i])) + sys.exit(1) i = i + 1 -print "OK" +print("OK") --- a/python/tests/noexists.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/noexists.patched.py 2020-04-28 09:45:33.372779922 +0300 @@ -10,7 +10,7 @@ def callback(path, event): global nb_callbacks -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) nb_callbacks = nb_callbacks + 1 shutil.rmtree ("temp_dir", True) @@ -22,7 +22,7 @@ time.sleep(1) ret = mon.event_pending() if ret != 0: - print 'error : no event expected' + print('error : no event expected') shutil.rmtree ("temp_dir", True) sys.exit(1) @@ -30,7 +30,7 @@ time.sleep(1) ret = mon.event_pending() if ret != 1: - print 'error : created event expected' + print('error : created event expected') shutil.rmtree ("temp_dir", True) sys.exit(1) @@ -39,7 +39,7 @@ time.sleep(1) ret = mon.event_pending() if ret != 1: - print 'error : deleted event expected' + print('error : deleted event expected') shutil.rmtree ("temp_dir", True) sys.exit(1) @@ -48,6 +48,6 @@ mon.disconnect() del mon if nb_callbacks == 2: - print 'OK' + print('OK') else: - print 'error' + print('error') --- a/python/tests/nokernel.py 2020-04-28 09:06:40.054123779 +0300 +++ b/python/tests/nokernel.patched.py 2020-04-28 09:45:33.379446621 +0300 @@ -18,24 +18,24 @@ def debug(path, type, data): global dbg, ok -# print "Got debug %s, %s, %s" % (path, type, data) +# print("Got debug %s, %s, %s" % (path, type, data)) dbg = dbg + 1 ok = 0 def callback(path, event, which): global top, expect, ok -# print "Got callback: %s, %s" % (path, event) +# print("Got callback: %s, %s" % (path, event)) if event == gamin.GAMAcknowledge: return if expect[top] != event: - print "Error got event %d expected %d" % (expect[top], event) - ok = 0 + print("Error got event %d expected %d" % (expect[top], event)) + ok = 0 top = top + 1 if not os.access('/media/test', os.R_OK | os.X_OK | os.W_OK): - print "missing access to /media/test, test skipped" - print "OK" + print("missing access to /media/test, test skipped") + print("OK") sys.exit(0) shutil.rmtree ("/media/test/a", True) @@ -53,10 +53,10 @@ del mon if top != 3: - print "Error: monitor got %d events insteads of 3" % (top) + print("Error: monitor got %d events insteads of 3" % (top)) elif dbg != 0 and gamin.has_debug_api == 1: - print "Error: debug got %d kernel events insteads of 0" % (dbg) + print("Error: debug got %d kernel events insteads of 0" % (dbg)) elif ok == 1: - print "OK" + print("OK") shutil.rmtree ("/media/test/a", True) --- a/py-compile 2020-04-28 10:09:56.813551018 +0300 +++ b/py-compile 2020-04-28 12:05:58.349373709 +0300 @@ -107,34 +107,34 @@ files = '''$files''' -print 'Byte-compiling python modules...' -for file in string.split(files): +print('Byte-compiling python modules...') +for file in str(files).split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): - continue - print file, - sys.stdout.flush() + continue + print(file, + sys.stdout.flush()) py_compile.compile(filepath, filepath + 'c', path) -print" || exit $? +print()" || exit $? # this will fail for python < 1.5, but that doesn't matter ... $PYTHON -O -c " import sys, os, string, py_compile files = '''$files''' -print 'Byte-compiling python modules (optimized versions) ...' -for file in string.split(files): +print('Byte-compiling python modules (optimized versions) ...') +for file in str(files).split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): - continue - print file, - sys.stdout.flush() + continue + print(file, + sys.stdout.flush()) py_compile.compile(filepath, filepath + 'o', path) -print" 2>/dev/null || : +print()" 2>/dev/null || : # Local Variables: # mode: shell-script --- a/python/gamin.py 2020-04-28 11:32:25.005794146 +0300 +++ b/python/gamin.py 2020-04-28 12:41:56.560517035 +0300 @@ -4,7 +4,7 @@ import os.path has_debug_api = 0 -if _gamin.__dict__.has_key("MonitorDebug"): +if "MonitorDebug" in _gamin.__dict__: has_debug_api = 1 # @@ -36,7 +36,7 @@ def GaminErrmsg(err = None): if err == None: - err = _gamin.Errno() + err = _gamin.Errno() if err == GAM_ARG: msg = "bad argument error" elif err == GAM_FILE: @@ -58,12 +58,12 @@ class GaminException(Exception): def __init__(self, value): Exception.__init__(self) - self.value = value - self.errno = GaminErrno() + self.value = value + self.errno = GaminErrno() def __str__(self): str = GaminErrmsg(self.errno) - if str != "": + if str != "": return repr(self.value) + ': ' + str return repr(self.value) @@ -76,181 +76,181 @@ FAM API events.""" class WatchObject: - def __init__ (self, monitor, mon_no, path, dir, callback, data=None): - self.monitor = monitor - self.callback = callback - self.data = data - self.path = path - self.__mon_no = mon_no - if dir == 1: - ret = _gamin.MonitorDirectory(self.__mon_no, path, self); - if ret < 0: - raise(GaminException("Failed to monitor directory %s" % - (path))) - elif dir == 0: - ret = _gamin.MonitorFile(self.__mon_no, path, self); - if ret < 0: - raise(GaminException("Failed to monitor file %s" % - (path))) - elif dir == -1: - ret = _gamin.MonitorDebug(self.__mon_no, path, self); - if ret < 0: - raise(GaminException("Failed to debug %s" % - (path))) - self.__req_no = ret - - def _internal_callback(self, path, event): - # it is very important here to catch all exception which may - # arise in the client callback code. - try: - if self.data != None: - self.callback (path, event, self.data) - else: - self.callback (path, event) - except: - import traceback - traceback.print_exc() - - if event == GAMAcknowledge: - try: - self.monitor.cancelled.remove(self) - except: - print "gamin failed to remove from cancelled" - pass - - def cancel(self): - ret = _gamin.MonitorCancel(self.__mon_no, self.__req_no); - if ret < 0: - raise(GaminException("Failed to stop monitor on %s" % - (self.path))) - try: - self.monitor.cancelled.append(self) - except: - print "gamin cancel() failed to add to cancelled" + def __init__ (self, monitor, mon_no, path, dir, callback, data=None): + self.monitor = monitor + self.callback = callback + self.data = data + self.path = path + self.__mon_no = mon_no + if dir == 1: + ret = _gamin.MonitorDirectory(self.__mon_no, path, self); + if ret < 0: + raise(GaminException("Failed to monitor directory %s" % + (path))) + elif dir == 0: + ret = _gamin.MonitorFile(self.__mon_no, path, self); + if ret < 0: + raise(GaminException("Failed to monitor file %s" % + (path))) + elif dir == -1: + ret = _gamin.MonitorDebug(self.__mon_no, path, self); + if ret < 0: + raise(GaminException("Failed to debug %s" % + (path))) + self.__req_no = ret + + def _internal_callback(self, path, event): + # it is very important here to catch all exception which may + # arise in the client callback code. + try: + if self.data != None: + self.callback (path, event, self.data) + else: + self.callback (path, event) + except: + import traceback + traceback.print_exc() + + if event == GAMAcknowledge: + try: + self.monitor.cancelled.remove(self) + except: + print("gamin failed to remove from cancelled") + pass + + def cancel(self): + ret = _gamin.MonitorCancel(self.__mon_no, self.__req_no); + if ret < 0: + raise(GaminException("Failed to stop monitor on %s" % + (self.path))) + try: + self.monitor.cancelled.append(self) + except: + print("gamin cancel() failed to add to cancelled") def __init__ (self): self.__no = _gamin.MonitorConnect() - if self.__no < 0: - raise(GaminException("Failed to connect to gam_server")) - self.objects = {} - self.__fd = _gamin.GetFd(self.__no) - if self.__fd < 0: - _gamin.MonitorClose(self.__no) - raise(GaminException("Failed to get file descriptor")) - self.cancelled = [] + if self.__no < 0: + raise(GaminException("Failed to connect to gam_server")) + self.objects = {} + self.__fd = _gamin.GetFd(self.__no) + if self.__fd < 0: + _gamin.MonitorClose(self.__no) + raise(GaminException("Failed to get file descriptor")) + self.cancelled = [] def __del__ (self): self.disconnect() def __raise_disconnected(): - raise(GaminException("Already disconnected")) + raise(GaminException("Already disconnected")) def _debug_object(self, value, callback, data = None): if has_debug_api == 0: - return; + return; if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); obj = self.WatchObject(self, self.__no, value, -1, callback, data) - # persistency need to be insured - self.objects["debug"] = obj - return obj + # persistency need to be insured + self.objects["debug"] = obj + return obj def disconnect(self): if (self.__no >= 0): - _gamin.MonitorClose(self.__no) - self.__no = -1; + _gamin.MonitorClose(self.__no) + self.__no = -1; def watch_directory(self, directory, callback, data = None): if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); directory = os.path.abspath(directory) obj = self.WatchObject(self, self.__no, directory, 1, callback, data) - if self.objects.has_key(directory): - self.objects[directory].append(obj) - else: - self.objects[directory] = [obj] - return obj + if directory in self.objects: + self.objects[directory].append(obj) + else: + self.objects[directory] = [obj] + return obj def watch_file(self, file, callback, data = None): if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); file = os.path.abspath(file) obj = self.WatchObject(self, self.__no, file, 0, callback, data) - if self.objects.has_key(file): - self.objects[file].append(obj) - else: - self.objects[file] = [obj] - return obj + if file in self.objects: + self.objects[file].append(obj) + else: + self.objects[file] = [obj] + return obj def no_exists(self): if (self.__no < 0): - return - ret = _gamin.MonitorNoExists(self.__no) - return ret + return + ret = _gamin.MonitorNoExists(self.__no) + return ret def stop_watch(self, path): if (self.__no < 0): - return + return path = os.path.abspath(path) - try: - list = self.objects[path] - except: - raise(GaminException("Resource %s is not monitored" % (path))) - for obj in list: - obj.cancel() - self.objects[path] = [] - + try: + list = self.objects[path] + except: + raise(GaminException("Resource %s is not monitored" % (path))) + for obj in list: + obj.cancel() + self.objects[path] = [] + def get_fd(self): if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); return self.__fd def event_pending(self): if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); ret = _gamin.EventPending(self.__no); - if ret < 0: - raise(GaminException("Failed to check pending events")) - return ret + if ret < 0: + raise(GaminException("Failed to check pending events")) + return ret def handle_one_event(self): if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); ret = _gamin.ProcessOneEvent(self.__no); - if ret < 0: - raise(GaminException("Failed to process one event")) - return ret + if ret < 0: + raise(GaminException("Failed to process one event")) + return ret def handle_events(self): if (self.__no < 0): - self.__raise_disconnected(); + self.__raise_disconnected(); ret = _gamin.ProcessEvents(self.__no); - if ret < 0: - raise(GaminException("Failed to process events")) - return ret + if ret < 0: + raise(GaminException("Failed to process events")) + return ret def run_unit_tests(): def callback(path, event): - print "Got callback: %s, %s" % (path, event) + print("Got callback: %s, %s" % (path, event)) mon = WatchMonitor() - print "watching current directory" + print("watching current directory") mon.watch_directory(".", callback) import time time.sleep(1) - print "fd: ", mon.get_fd() + print("fd: ", mon.get_fd()) ret = mon.event_pending() - print "pending: ", ret + print("pending: ", ret) if ret > 0: ret = mon.handle_one_event() - print "processed %d event" % (ret) - ret = mon.handle_events() - print "processed %d remaining events" % (ret) - print "stop watching current directory" + print("processed %d event" % (ret)) + ret = mon.handle_events() + print("processed %d remaining events" % (ret)) + print("stop watching current directory") mon.stop_watch(".") - print "disconnecting" + print("disconnecting") del mon if __name__ == '__main__': --- a/gamin.spec.in 2020-04-28 11:39:33.414597930 +0300 +++ b/gamin.spec.in 2020-04-28 11:40:33.141565854 +0300 @@ -32,7 +32,7 @@ Summary: Python bindings for the gamin library Group: Development/Libraries Requires: gamin = %{version} -Requires: %{_libdir}/python%(echo `python -c "import sys; print sys.version[0:3]"`) +Requires: %{_libdir}/python%(echo `python -c "import sys; print(sys.version[0:3])"`) %description python The gamin-python package contains a module that allow monitoring of --- a/doc/apibuild.py 2020-04-28 11:39:54.804705751 +0300 +++ b/doc/apibuild.py 2020-04-28 11:46:21.249997412 +0300 @@ -47,33 +47,33 @@ def __init__(self, name, module=None, type=None, lineno = 0, info=None, extra=None, conditionals = None): self.name = name - self.module = module - self.type = type - self.info = info - self.extra = extra - self.lineno = lineno - self.static = 0 - if conditionals == None or len(conditionals) == 0: - self.conditionals = None - else: - self.conditionals = conditionals[:] - if self.name == debugsym: - print "=> define %s : %s" % (debugsym, (module, type, info, - extra, conditionals)) + self.module = module + self.type = type + self.info = info + self.extra = extra + self.lineno = lineno + self.static = 0 + if conditionals == None or len(conditionals) == 0: + self.conditionals = None + else: + self.conditionals = conditionals[:] + if self.name == debugsym: + print("=> define %s : %s" % (debugsym, (module, type, info, + extra, conditionals))) def __repr__(self): r = "%s %s:" % (self.type, self.name) - if self.static: - r = r + " static" - if self.module != None: - r = r + " from %s" % (self.module) - if self.info != None: - r = r + " " + `self.info` - if self.extra != None: - r = r + " " + `self.extra` - if self.conditionals != None: - r = r + " " + `self.conditionals` - return r + if self.static: + r = r + " static" + if self.module != None: + r = r + " from %s" % (self.module) + if self.info != None: + r = r + " " + self.info + if self.extra != None: + r = r + " " + self.extra + if self.conditionals != None: + r = r + " " + self.conditionals + return r def set_module(self, module): @@ -89,10 +89,10 @@ def set_static(self, static): self.static = static def set_conditionals(self, conditionals): - if conditionals == None or len(conditionals) == 0: - self.conditionals = None - else: - self.conditionals = conditionals[:] + if conditionals == None or len(conditionals) == 0: + self.conditionals = None + else: + self.conditionals = conditionals[:] def get_name(self): return self.name @@ -113,19 +113,19 @@ def update(self, module, type = None, info = None, extra=None, conditionals=None): - if self.name == debugsym: - print "=> update %s : %s" % (debugsym, (module, type, info, - extra, conditionals)) + if self.name == debugsym: + print("=> update %s : %s" % (debugsym, (module, type, info, + extra, conditionals))) if module != None and self.module == None: - self.set_module(module) + self.set_module(module) if type != None and self.type == None: - self.set_type(type) + self.set_type(type) if info != None: - self.set_info(info) + self.set_info(info) if extra != None: - self.set_extra(extra) + self.set_extra(extra) if conditionals != None: - self.set_conditionals(conditionals) + self.set_conditionals(conditionals) class index: @@ -133,75 +133,75 @@ self.name = name self.identifiers = {} self.functions = {} - self.variables = {} - self.includes = {} - self.structs = {} - self.enums = {} - self.typedefs = {} - self.macros = {} - self.references = {} - self.info = {} + self.variables = {} + self.includes = {} + self.structs = {} + self.enums = {} + self.typedefs = {} + self.macros = {} + self.references = {} + self.info = {} def add_ref(self, name, module, static, type, lineno, info=None, extra=None, conditionals = None): if name[0:2] == '__': - return None + return None d = None try: - d = self.identifiers[name] - d.update(module, type, lineno, info, extra, conditionals) - except: - d = identifier(name, module, type, lineno, info, extra, conditionals) - self.identifiers[name] = d - - if d != None and static == 1: - d.set_static(1) + d = self.identifiers[name] + d.update(module, type, lineno, info, extra, conditionals) + except: + d = identifier(name, module, type, lineno, info, extra, conditionals) + self.identifiers[name] = d + + if d != None and static == 1: + d.set_static(1) - if d != None and name != None and type != None: - self.references[name] = d + if d != None and name != None and type != None: + self.references[name] = d - if name == debugsym: - print "New ref: %s" % (d) + if name == debugsym: + print("New ref: %s" % (d)) - return d + return d def add(self, name, module, static, type, lineno, info=None, extra=None, conditionals = None): if name[0:2] == '__': - return None + return None d = None try: - d = self.identifiers[name] - d.update(module, type, lineno, info, extra, conditionals) - except: - d = identifier(name, module, type, lineno, info, extra, conditionals) - self.identifiers[name] = d - - if d != None and static == 1: - d.set_static(1) - - if d != None and name != None and type != None: - if type == "function": - self.functions[name] = d - elif type == "functype": - self.functions[name] = d - elif type == "variable": - self.variables[name] = d - elif type == "include": - self.includes[name] = d - elif type == "struct": - self.structs[name] = d - elif type == "enum": - self.enums[name] = d - elif type == "typedef": - self.typedefs[name] = d - elif type == "macro": - self.macros[name] = d - else: - print "Unable to register type ", type + d = self.identifiers[name] + d.update(module, type, lineno, info, extra, conditionals) + except: + d = identifier(name, module, type, lineno, info, extra, conditionals) + self.identifiers[name] = d + + if d != None and static == 1: + d.set_static(1) + + if d != None and name != None and type != None: + if type == "function": + self.functions[name] = d + elif type == "functype": + self.functions[name] = d + elif type == "variable": + self.variables[name] = d + elif type == "include": + self.includes[name] = d + elif type == "struct": + self.structs[name] = d + elif type == "enum": + self.enums[name] = d + elif type == "typedef": + self.typedefs[name] = d + elif type == "macro": + self.macros[name] = d + else: + print("Unable to register type ", type) - if name == debugsym: - print "New symbol: %s" % (d) + if name == debugsym: + print("New symbol: %s" % (d)) - return d + return d def merge(self, idx): for id in idx.functions.keys(): @@ -209,41 +209,41 @@ # macro might be used to override functions or variables # definitions # - if self.macros.has_key(id): - del self.macros[id] - if self.functions.has_key(id): - print "function %s from %s redeclared in %s" % ( - id, self.functions[id].module, idx.functions[id].module) - else: - self.functions[id] = idx.functions[id] - self.identifiers[id] = idx.functions[id] + if self.macros.has_key(id): + del self.macros[id] + if self.functions.has_key(id): + print("function %s from %s redeclared in %s" % ( + id, self.functions[id].module, idx.functions[id].module)) + else: + self.functions[id] = idx.functions[id] + self.identifiers[id] = idx.functions[id] for id in idx.variables.keys(): # # macro might be used to override functions or variables # definitions # - if self.macros.has_key(id): - del self.macros[id] - if self.variables.has_key(id): - print "variable %s from %s redeclared in %s" % ( - id, self.variables[id].module, idx.variables[id].module) - else: - self.variables[id] = idx.variables[id] - self.identifiers[id] = idx.variables[id] + if self.macros.has_key(id): + del self.macros[id] + if self.variables.has_key(id): + print("variable %s from %s redeclared in %s" % ( + id, self.variables[id].module, idx.variables[id].module)) + else: + self.variables[id] = idx.variables[id] + self.identifiers[id] = idx.variables[id] for id in idx.structs.keys(): - if self.structs.has_key(id): - print "struct %s from %s redeclared in %s" % ( - id, self.structs[id].module, idx.structs[id].module) - else: - self.structs[id] = idx.structs[id] - self.identifiers[id] = idx.structs[id] + if self.structs.has_key(id): + print("struct %s from %s redeclared in %s" % ( + id, self.structs[id].module, idx.structs[id].module)) + else: + self.structs[id] = idx.structs[id] + self.identifiers[id] = idx.structs[id] for id in idx.typedefs.keys(): - if self.typedefs.has_key(id): - print "typedef %s from %s redeclared in %s" % ( - id, self.typedefs[id].module, idx.typedefs[id].module) - else: - self.typedefs[id] = idx.typedefs[id] - self.identifiers[id] = idx.typedefs[id] + if self.typedefs.has_key(id): + print("typedef %s from %s redeclared in %s" % ( + id, self.typedefs[id].module, idx.typedefs[id].module)) + else: + self.typedefs[id] = idx.typedefs[id] + self.identifiers[id] = idx.typedefs[id] for id in idx.macros.keys(): # # macro might be used to override functions or variables @@ -255,83 +255,83 @@ continue if self.enums.has_key(id): continue - if self.macros.has_key(id): - print "macro %s from %s redeclared in %s" % ( - id, self.macros[id].module, idx.macros[id].module) - else: - self.macros[id] = idx.macros[id] - self.identifiers[id] = idx.macros[id] + if self.macros.has_key(id): + print("macro %s from %s redeclared in %s" % ( + id, self.macros[id].module, idx.macros[id].module)) + else: + self.macros[id] = idx.macros[id] + self.identifiers[id] = idx.macros[id] for id in idx.enums.keys(): - if self.enums.has_key(id): - print "enum %s from %s redeclared in %s" % ( - id, self.enums[id].module, idx.enums[id].module) - else: - self.enums[id] = idx.enums[id] - self.identifiers[id] = idx.enums[id] + if self.enums.has_key(id): + print("enum %s from %s redeclared in %s" % ( + id, self.enums[id].module, idx.enums[id].module)) + else: + self.enums[id] = idx.enums[id] + self.identifiers[id] = idx.enums[id] def merge_public(self, idx): for id in idx.functions.keys(): - if self.functions.has_key(id): - up = idx.functions[id] - self.functions[id].update(None, up.type, up.info, up.extra) - # else: - # print "Function %s from %s is not declared in headers" % ( - # id, idx.functions[id].module) - # TODO: do the same for variables. + if self.functions.has_key(id): + up = idx.functions[id] + self.functions[id].update(None, up.type, up.info, up.extra) + # else: + # print("Function %s from %s is not declared in headers" % ( + # id, idx.functions[id].module)) + # TODO: do the same for variables. def analyze_dict(self, type, dict): count = 0 - public = 0 + public = 0 for name in dict.keys(): - id = dict[name] - count = count + 1 - if id.static == 0: - public = public + 1 + id = dict[name] + count = count + 1 + if id.static == 0: + public = public + 1 if count != public: - print " %d %s , %d public" % (count, type, public) - elif count != 0: - print " %d public %s" % (count, type) + print(" %d %s , %d public" % (count, type, public)) + elif count != 0: + print(" %d public %s" % (count, type)) def analyze(self): - self.analyze_dict("functions", self.functions) - self.analyze_dict("variables", self.variables) - self.analyze_dict("structs", self.structs) - self.analyze_dict("typedefs", self.typedefs) - self.analyze_dict("macros", self.macros) + self.analyze_dict("functions", self.functions) + self.analyze_dict("variables", self.variables) + self.analyze_dict("structs", self.structs) + self.analyze_dict("typedefs", self.typedefs) + self.analyze_dict("macros", self.macros) class CLexer: """A lexer for the C language, tokenize the input by reading and analyzing it line by line""" def __init__(self, input): self.input = input - self.tokens = [] - self.line = "" - self.lineno = 0 + self.tokens = [] + self.line = "" + self.lineno = 0 def getline(self): line = '' - while line == '': - line = self.input.readline() - if not line: - return None - self.lineno = self.lineno + 1 - line = string.lstrip(line) - line = string.rstrip(line) - if line == '': - continue - while line[-1] == '\\': - line = line[:-1] - n = self.input.readline() - self.lineno = self.lineno + 1 - n = string.lstrip(n) - n = string.rstrip(n) - if not n: - break - else: - line = line + n + while line == '': + line = self.input.readline() + if not line: + return None + self.lineno = self.lineno + 1 + line = string.lstrip(line) + line = string.rstrip(line) + if line == '': + continue + while line[-1] == '\\': + line = line[:-1] + n = self.input.readline() + self.lineno = self.lineno + 1 + n = string.lstrip(n) + n = string.rstrip(n) + if not n: + break + else: + line = line + n return line - + def getlineno(self): return self.lineno @@ -339,194 +339,194 @@ self.tokens.insert(0, token); def debug(self): - print "Last token: ", self.last - print "Token queue: ", self.tokens - print "Line %d end: " % (self.lineno), self.line + print("Last token: ", self.last) + print("Token queue: ", self.tokens) + print("Line %d end: " % (self.lineno), self.line) def token(self): while self.tokens == []: - if self.line == "": - line = self.getline() - else: - line = self.line - self.line = "" - if line == None: - return None - - if line[0] == '#': - self.tokens = map((lambda x: ('preproc', x)), - string.split(line)) - break; - l = len(line) - if line[0] == '"' or line[0] == "'": - end = line[0] - line = line[1:] - found = 0 - tok = "" - while found == 0: - i = 0 - l = len(line) - while i < l: - if line[i] == end: - self.line = line[i+1:] - line = line[:i] - l = i - found = 1 - break - if line[i] == '\\': - i = i + 1 - i = i + 1 - tok = tok + line - if found == 0: - line = self.getline() - if line == None: - return None - self.last = ('string', tok) - return self.last - - if l >= 2 and line[0] == '/' and line[1] == '*': - line = line[2:] - found = 0 - tok = "" - while found == 0: - i = 0 - l = len(line) - while i < l: - if line[i] == '*' and i+1 < l and line[i+1] == '/': - self.line = line[i+2:] - line = line[:i-1] - l = i - found = 1 - break - i = i + 1 - if tok != "": - tok = tok + "\n" - tok = tok + line - if found == 0: - line = self.getline() - if line == None: - return None - self.last = ('comment', tok) - return self.last - if l >= 2 and line[0] == '/' and line[1] == '/': - line = line[2:] - self.last = ('comment', line) - return self.last - i = 0 - while i < l: - if line[i] == '/' and i+1 < l and line[i+1] == '/': - self.line = line[i:] - line = line[:i] - break - if line[i] == '/' and i+1 < l and line[i+1] == '*': - self.line = line[i:] - line = line[:i] - break - if line[i] == '"' or line[i] == "'": - self.line = line[i:] - line = line[:i] - break - i = i + 1 - l = len(line) - i = 0 - while i < l: - if line[i] == ' ' or line[i] == '\t': - i = i + 1 - continue - o = ord(line[i]) - if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ - (o >= 48 and o <= 57): - s = i - while i < l: - o = ord(line[i]) - if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ - (o >= 48 and o <= 57) or string.find( - " \t(){}:;,+-*/%&!|[]=><", line[i]) == -1: - i = i + 1 - else: - break - self.tokens.append(('name', line[s:i])) - continue - if string.find("(){}:;,[]", line[i]) != -1: + if self.line == "": + line = self.getline() + else: + line = self.line + self.line = "" + if line == None: + return None + + if line[0] == '#': + self.tokens = map((lambda x: ('preproc', x)), + string.split(line)) + break; + l = len(line) + if line[0] == '"' or line[0] == "'": + end = line[0] + line = line[1:] + found = 0 + tok = "" + while found == 0: + i = 0 + l = len(line) + while i < l: + if line[i] == end: + self.line = line[i+1:] + line = line[:i] + l = i + found = 1 + break + if line[i] == '\\': + i = i + 1 + i = i + 1 + tok = tok + line + if found == 0: + line = self.getline() + if line == None: + return None + self.last = ('string', tok) + return self.last + + if l >= 2 and line[0] == '/' and line[1] == '*': + line = line[2:] + found = 0 + tok = "" + while found == 0: + i = 0 + l = len(line) + while i < l: + if line[i] == '*' and i+1 < l and line[i+1] == '/': + self.line = line[i+2:] + line = line[:i-1] + l = i + found = 1 + break + i = i + 1 + if tok != "": + tok = tok + "\n" + tok = tok + line + if found == 0: + line = self.getline() + if line == None: + return None + self.last = ('comment', tok) + return self.last + if l >= 2 and line[0] == '/' and line[1] == '/': + line = line[2:] + self.last = ('comment', line) + return self.last + i = 0 + while i < l: + if line[i] == '/' and i+1 < l and line[i+1] == '/': + self.line = line[i:] + line = line[:i] + break + if line[i] == '/' and i+1 < l and line[i+1] == '*': + self.line = line[i:] + line = line[:i] + break + if line[i] == '"' or line[i] == "'": + self.line = line[i:] + line = line[:i] + break + i = i + 1 + l = len(line) + i = 0 + while i < l: + if line[i] == ' ' or line[i] == '\t': + i = i + 1 + continue + o = ord(line[i]) + if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ + (o >= 48 and o <= 57): + s = i + while i < l: + o = ord(line[i]) + if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ + (o >= 48 and o <= 57) or string.find( + " \t(){}:;,+-*/%&!|[]=><", line[i]) == -1: + i = i + 1 + else: + break + self.tokens.append(('name', line[s:i])) + continue + if string.find("(){}:;,[]", line[i]) != -1: # if line[i] == '(' or line[i] == ')' or line[i] == '{' or \ -# line[i] == '}' or line[i] == ':' or line[i] == ';' or \ -# line[i] == ',' or line[i] == '[' or line[i] == ']': - self.tokens.append(('sep', line[i])) - i = i + 1 - continue - if string.find("+-*><=/%&!|.", line[i]) != -1: +# line[i] == '}' or line[i] == ':' or line[i] == ';' or \ +# line[i] == ',' or line[i] == '[' or line[i] == ']': + self.tokens.append(('sep', line[i])) + i = i + 1 + continue + if string.find("+-*><=/%&!|.", line[i]) != -1: # if line[i] == '+' or line[i] == '-' or line[i] == '*' or \ -# line[i] == '>' or line[i] == '<' or line[i] == '=' or \ -# line[i] == '/' or line[i] == '%' or line[i] == '&' or \ -# line[i] == '!' or line[i] == '|' or line[i] == '.': - if line[i] == '.' and i + 2 < l and \ - line[i+1] == '.' and line[i+2] == '.': - self.tokens.append(('name', '...')) - i = i + 3 - continue - - j = i + 1 - if j < l and ( - string.find("+-*><=/%&!|", line[j]) != -1): -# line[j] == '+' or line[j] == '-' or line[j] == '*' or \ -# line[j] == '>' or line[j] == '<' or line[j] == '=' or \ -# line[j] == '/' or line[j] == '%' or line[j] == '&' or \ -# line[j] == '!' or line[j] == '|'): - self.tokens.append(('op', line[i:j+1])) - i = j + 1 - else: - self.tokens.append(('op', line[i])) - i = i + 1 - continue - s = i - while i < l: - o = ord(line[i]) - if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ - (o >= 48 and o <= 57) or ( - string.find(" \t(){}:;,+-*/%&!|[]=><", line[i]) == -1): -# line[i] != ' ' and line[i] != '\t' and -# line[i] != '(' and line[i] != ')' and -# line[i] != '{' and line[i] != '}' and -# line[i] != ':' and line[i] != ';' and -# line[i] != ',' and line[i] != '+' and -# line[i] != '-' and line[i] != '*' and -# line[i] != '/' and line[i] != '%' and -# line[i] != '&' and line[i] != '!' and -# line[i] != '|' and line[i] != '[' and -# line[i] != ']' and line[i] != '=' and -# line[i] != '*' and line[i] != '>' and -# line[i] != '<'): - i = i + 1 - else: - break - self.tokens.append(('name', line[s:i])) +# line[i] == '>' or line[i] == '<' or line[i] == '=' or \ +# line[i] == '/' or line[i] == '%' or line[i] == '&' or \ +# line[i] == '!' or line[i] == '|' or line[i] == '.': + if line[i] == '.' and i + 2 < l and \ + line[i+1] == '.' and line[i+2] == '.': + self.tokens.append(('name', '...')) + i = i + 3 + continue + + j = i + 1 + if j < l and ( + string.find("+-*><=/%&!|", line[j]) != -1): +# line[j] == '+' or line[j] == '-' or line[j] == '*' or \ +# line[j] == '>' or line[j] == '<' or line[j] == '=' or \ +# line[j] == '/' or line[j] == '%' or line[j] == '&' or \ +# line[j] == '!' or line[j] == '|'): + self.tokens.append(('op', line[i:j+1])) + i = j + 1 + else: + self.tokens.append(('op', line[i])) + i = i + 1 + continue + s = i + while i < l: + o = ord(line[i]) + if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ + (o >= 48 and o <= 57) or ( + string.find(" \t(){}:;,+-*/%&!|[]=><", line[i]) == -1): +# line[i] != ' ' and line[i] != '\t' and +# line[i] != '(' and line[i] != ')' and +# line[i] != '{' and line[i] != '}' and +# line[i] != ':' and line[i] != ';' and +# line[i] != ',' and line[i] != '+' and +# line[i] != '-' and line[i] != '*' and +# line[i] != '/' and line[i] != '%' and +# line[i] != '&' and line[i] != '!' and +# line[i] != '|' and line[i] != '[' and +# line[i] != ']' and line[i] != '=' and +# line[i] != '*' and line[i] != '>' and +# line[i] != '<'): + i = i + 1 + else: + break + self.tokens.append(('name', line[s:i])) - tok = self.tokens[0] - self.tokens = self.tokens[1:] - self.last = tok - return tok + tok = self.tokens[0] + self.tokens = self.tokens[1:] + self.last = tok + return tok class CParser: """The C module parser""" def __init__(self, filename, idx = None): self.filename = filename - if len(filename) > 2 and filename[-2:] == '.h': - self.is_header = 1 - else: - self.is_header = 0 + if len(filename) > 2 and filename[-2:] == '.h': + self.is_header = 1 + else: + self.is_header = 0 self.input = open(filename) - self.lexer = CLexer(self.input) - if idx == None: - self.index = index() - else: - self.index = idx - self.top_comment = "" - self.last_comment = "" - self.comment = None - self.collect_ref = 0 - self.no_error = 0 - self.conditionals = [] - self.defines = [] + self.lexer = CLexer(self.input) + if idx == None: + self.index = index() + else: + self.index = idx + self.top_comment = "" + self.last_comment = "" + self.comment = None + self.collect_ref = 0 + self.no_error = 0 + self.conditionals = [] + self.defines = [] def collect_references(self): self.collect_ref = 1 @@ -542,149 +542,149 @@ def index_add(self, name, module, static, type, info=None, extra = None): self.index.add(name, module, static, type, self.lineno(), - info, extra, self.conditionals) + info, extra, self.conditionals) def index_add_ref(self, name, module, static, type, info=None, extra = None): self.index.add_ref(name, module, static, type, self.lineno(), - info, extra, self.conditionals) + info, extra, self.conditionals) def warning(self, msg): if self.no_error: - return - print msg + return + print(msg) def error(self, msg, token=-1): if self.no_error: - return + return - print "Parse Error: " + msg - if token != -1: - print "Got token ", token - self.lexer.debug() - sys.exit(1) + print("Parse Error: " + msg) + if token != -1: + print("Got token ", token) + self.lexer.debug() + sys.exit(1) def debug(self, msg, token=-1): - print "Debug: " + msg - if token != -1: - print "Got token ", token - self.lexer.debug() + print("Debug: " + msg) + if token != -1: + print("Got token ", token) + self.lexer.debug() def parseTopComment(self, comment): - res = {} - lines = string.split(comment, "\n") - item = None - for line in lines: - while line != "" and (line[0] == ' ' or line[0] == '\t'): - line = line[1:] - while line != "" and line[0] == '*': - line = line[1:] - while line != "" and (line[0] == ' ' or line[0] == '\t'): - line = line[1:] - try: - (it, line) = string.split(line, ":", 1) - item = it - while line != "" and (line[0] == ' ' or line[0] == '\t'): - line = line[1:] - if res.has_key(item): - res[item] = res[item] + " " + line - else: - res[item] = line - except: - if item != None: - if res.has_key(item): - res[item] = res[item] + " " + line - else: - res[item] = line - self.index.info = res + res = {} + lines = string.split(comment, "\n") + item = None + for line in lines: + while line != "" and (line[0] == ' ' or line[0] == '\t'): + line = line[1:] + while line != "" and line[0] == '*': + line = line[1:] + while line != "" and (line[0] == ' ' or line[0] == '\t'): + line = line[1:] + try: + (it, line) = string.split(line, ":", 1) + item = it + while line != "" and (line[0] == ' ' or line[0] == '\t'): + line = line[1:] + if res.has_key(item): + res[item] = res[item] + " " + line + else: + res[item] = line + except: + if item != None: + if res.has_key(item): + res[item] = res[item] + " " + line + else: + res[item] = line + self.index.info = res def parseComment(self, token): if self.top_comment == "": - self.top_comment = token[1] - if self.comment == None or token[1][0] == '*': - self.comment = token[1]; - else: - self.comment = self.comment + token[1] - token = self.lexer.token() + self.top_comment = token[1] + if self.comment == None or token[1][0] == '*': + self.comment = token[1]; + else: + self.comment = self.comment + token[1] + token = self.lexer.token() if string.find(self.comment, "DOC_DISABLE") != -1: - self.stop_error() + self.stop_error() if string.find(self.comment, "DOC_ENABLE") != -1: - self.start_error() + self.start_error() - return token + return token # # Parse a comment block associate to a macro # def parseMacroComment(self, name, quiet = 0): if name[0:2] == '__': - quiet = 1 + quiet = 1 args = [] - desc = "" + desc = "" if self.comment == None: - if not quiet: - self.warning("Missing comment for macro %s" % (name)) - return((args, desc)) + if not quiet: + self.warning("Missing comment for macro %s" % (name)) + return((args, desc)) if self.comment[0] != '*': - if not quiet: - self.warning("Missing * in macro comment for %s" % (name)) - return((args, desc)) - lines = string.split(self.comment, '\n') - if lines[0] == '*': - del lines[0] - if lines[0] != "* %s:" % (name): - if not quiet: - self.warning("Misformatted macro comment for %s" % (name)) - self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) - return((args, desc)) - del lines[0] - while lines[0] == '*': - del lines[0] - while len(lines) > 0 and lines[0][0:3] == '* @': - l = lines[0][3:] - try: - (arg, desc) = string.split(l, ':', 1) - desc=string.strip(desc) - arg=string.strip(arg) + if not quiet: + self.warning("Missing * in macro comment for %s" % (name)) + return((args, desc)) + lines = string.split(self.comment, '\n') + if lines[0] == '*': + del lines[0] + if lines[0] != "* %s:" % (name): + if not quiet: + self.warning("Misformatted macro comment for %s" % (name)) + self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) + return((args, desc)) + del lines[0] + while lines[0] == '*': + del lines[0] + while len(lines) > 0 and lines[0][0:3] == '* @': + l = lines[0][3:] + try: + (arg, desc) = string.split(l, ':', 1) + desc=string.strip(desc) + arg=string.strip(arg) except: - if not quiet: - self.warning("Misformatted macro comment for %s" % (name)) - self.warning(" problem with '%s'" % (lines[0])) - del lines[0] - continue - del lines[0] - l = string.strip(lines[0]) - while len(l) > 2 and l[0:3] != '* @': - while l[0] == '*': - l = l[1:] - desc = desc + ' ' + string.strip(l) - del lines[0] - if len(lines) == 0: - break - l = lines[0] + if not quiet: + self.warning("Misformatted macro comment for %s" % (name)) + self.warning(" problem with '%s'" % (lines[0])) + del lines[0] + continue + del lines[0] + l = string.strip(lines[0]) + while len(l) > 2 and l[0:3] != '* @': + while l[0] == '*': + l = l[1:] + desc = desc + ' ' + string.strip(l) + del lines[0] + if len(lines) == 0: + break + l = lines[0] args.append((arg, desc)) - while len(lines) > 0 and lines[0] == '*': - del lines[0] - desc = "" - while len(lines) > 0: - l = lines[0] - while len(l) > 0 and l[0] == '*': - l = l[1:] - l = string.strip(l) - desc = desc + " " + l - del lines[0] - - desc = string.strip(desc) - - if quiet == 0: - if desc == "": - self.warning("Macro comment for %s lack description of the macro" % (name)) + while len(lines) > 0 and lines[0] == '*': + del lines[0] + desc = "" + while len(lines) > 0: + l = lines[0] + while len(l) > 0 and l[0] == '*': + l = l[1:] + l = string.strip(l) + desc = desc + " " + l + del lines[0] + + desc = string.strip(desc) + + if quiet == 0: + if desc == "": + self.warning("Macro comment for %s lack description of the macro" % (name)) - return((args, desc)) + return((args, desc)) # # Parse a comment block and merge the informations found in the @@ -693,167 +693,167 @@ # def mergeFunctionComment(self, name, description, quiet = 0): if name == 'main': - quiet = 1 + quiet = 1 if name[0:2] == '__': - quiet = 1 + quiet = 1 - (ret, args) = description - desc = "" - retdesc = "" + (ret, args) = description + desc = "" + retdesc = "" if self.comment == None: - if not quiet: - self.warning("Missing comment for function %s" % (name)) - return(((ret[0], retdesc), args, desc)) + if not quiet: + self.warning("Missing comment for function %s" % (name)) + return(((ret[0], retdesc), args, desc)) if self.comment[0] != '*': - if not quiet: - self.warning("Missing * in function comment for %s" % (name)) - return(((ret[0], retdesc), args, desc)) - lines = string.split(self.comment, '\n') - if lines[0] == '*': - del lines[0] - if lines[0] != "* %s:" % (name): - if not quiet: - self.warning("Misformatted function comment for %s" % (name)) - self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) - return(((ret[0], retdesc), args, desc)) - del lines[0] - while lines[0] == '*': - del lines[0] - nbargs = len(args) - while len(lines) > 0 and lines[0][0:3] == '* @': - l = lines[0][3:] - try: - (arg, desc) = string.split(l, ':', 1) - desc=string.strip(desc) - arg=string.strip(arg) + if not quiet: + self.warning("Missing * in function comment for %s" % (name)) + return(((ret[0], retdesc), args, desc)) + lines = string.split(self.comment, '\n') + if lines[0] == '*': + del lines[0] + if lines[0] != "* %s:" % (name): + if not quiet: + self.warning("Misformatted function comment for %s" % (name)) + self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) + return(((ret[0], retdesc), args, desc)) + del lines[0] + while lines[0] == '*': + del lines[0] + nbargs = len(args) + while len(lines) > 0 and lines[0][0:3] == '* @': + l = lines[0][3:] + try: + (arg, desc) = string.split(l, ':', 1) + desc=string.strip(desc) + arg=string.strip(arg) except: - if not quiet: - self.warning("Misformatted function comment for %s" % (name)) - self.warning(" problem with '%s'" % (lines[0])) - del lines[0] - continue - del lines[0] - l = string.strip(lines[0]) - while len(l) > 2 and l[0:3] != '* @': - while l[0] == '*': - l = l[1:] - desc = desc + ' ' + string.strip(l) - del lines[0] - if len(lines) == 0: - break - l = lines[0] - i = 0 - while i < nbargs: - if args[i][1] == arg: - args[i] = (args[i][0], arg, desc) - break; - i = i + 1 - if i >= nbargs: - if not quiet: - self.warning("Unable to find arg %s from function comment for %s" % ( - arg, name)) - while len(lines) > 0 and lines[0] == '*': - del lines[0] - desc = "" - while len(lines) > 0: - l = lines[0] - while len(l) > 0 and l[0] == '*': - l = l[1:] - l = string.strip(l) - if len(l) >= 6 and l[0:6] == "return" or l[0:6] == "Return": - try: - l = string.split(l, ' ', 1)[1] - except: - l = "" - retdesc = string.strip(l) - del lines[0] - while len(lines) > 0: - l = lines[0] - while len(l) > 0 and l[0] == '*': - l = l[1:] - l = string.strip(l) - retdesc = retdesc + " " + l - del lines[0] - else: - desc = desc + " " + l - del lines[0] - - retdesc = string.strip(retdesc) - desc = string.strip(desc) - - if quiet == 0: - # - # report missing comments - # - i = 0 - while i < nbargs: - if args[i][2] == None and args[i][0] != "void" and args[i][1] != None: - self.warning("Function comment for %s lack description of arg %s" % (name, args[i][1])) - i = i + 1 - if retdesc == "" and ret[0] != "void": - self.warning("Function comment for %s lack description of return value" % (name)) - if desc == "": - self.warning("Function comment for %s lack description of the function" % (name)) + if not quiet: + self.warning("Misformatted function comment for %s" % (name)) + self.warning(" problem with '%s'" % (lines[0])) + del lines[0] + continue + del lines[0] + l = string.strip(lines[0]) + while len(l) > 2 and l[0:3] != '* @': + while l[0] == '*': + l = l[1:] + desc = desc + ' ' + string.strip(l) + del lines[0] + if len(lines) == 0: + break + l = lines[0] + i = 0 + while i < nbargs: + if args[i][1] == arg: + args[i] = (args[i][0], arg, desc) + break; + i = i + 1 + if i >= nbargs: + if not quiet: + self.warning("Unable to find arg %s from function comment for %s" % ( + arg, name)) + while len(lines) > 0 and lines[0] == '*': + del lines[0] + desc = "" + while len(lines) > 0: + l = lines[0] + while len(l) > 0 and l[0] == '*': + l = l[1:] + l = string.strip(l) + if len(l) >= 6 and l[0:6] == "return" or l[0:6] == "Return": + try: + l = string.split(l, ' ', 1)[1] + except: + l = "" + retdesc = string.strip(l) + del lines[0] + while len(lines) > 0: + l = lines[0] + while len(l) > 0 and l[0] == '*': + l = l[1:] + l = string.strip(l) + retdesc = retdesc + " " + l + del lines[0] + else: + desc = desc + " " + l + del lines[0] + + retdesc = string.strip(retdesc) + desc = string.strip(desc) + + if quiet == 0: + # + # report missing comments + # + i = 0 + while i < nbargs: + if args[i][2] == None and args[i][0] != "void" and args[i][1] != None: + self.warning("Function comment for %s lack description of arg %s" % (name, args[i][1])) + i = i + 1 + if retdesc == "" and ret[0] != "void": + self.warning("Function comment for %s lack description of return value" % (name)) + if desc == "": + self.warning("Function comment for %s lack description of the function" % (name)) - return(((ret[0], retdesc), args, desc)) + return(((ret[0], retdesc), args, desc)) def parsePreproc(self, token): - if debug: - print "=> preproc ", token, self.lexer.tokens + if debug: + print("=> preproc ", token, self.lexer.tokens) name = token[1] - if name == "#include": - token = self.lexer.token() - if token == None: - return None - if token[0] == 'preproc': - self.index_add(token[1], self.filename, not self.is_header, - "include") - return self.lexer.token() - return token - if name == "#define": - token = self.lexer.token() - if token == None: - return None - if token[0] == 'preproc': - # TODO macros with arguments - name = token[1] - lst = [] - token = self.lexer.token() - while token != None and token[0] == 'preproc' and \ - token[1][0] != '#': - lst.append(token[1]) - token = self.lexer.token() + if name == "#include": + token = self.lexer.token() + if token == None: + return None + if token[0] == 'preproc': + self.index_add(token[1], self.filename, not self.is_header, + "include") + return self.lexer.token() + return token + if name == "#define": + token = self.lexer.token() + if token == None: + return None + if token[0] == 'preproc': + # TODO macros with arguments + name = token[1] + lst = [] + token = self.lexer.token() + while token != None and token[0] == 'preproc' and \ + token[1][0] != '#': + lst.append(token[1]) + token = self.lexer.token() try: - name = string.split(name, '(') [0] + name = string.split(name, '(') [0] except: pass info = self.parseMacroComment(name, not self.is_header) - self.index_add(name, self.filename, not self.is_header, - "macro", info) - return token - if (name == "#ifdef" or name == "#ifndef") and self.is_header: - try: - self.defines.append(self.lexer.tokens[0][1]) - if string.find(self.lexer.tokens[0][1], 'ENABLED') != -1: - self.conditionals.append(self.lexer.tokens[0][1]) -# print self.conditionals -# print self.defines - except: - pass - if name == "#endif" and self.is_header: - if self.conditionals != [] and self.defines != [] and \ - self.defines[-1] == self.conditionals[-1]: - self.conditionals = self.conditionals[:-1] - self.defines = self.defines[:-1] -# print self.defines -# print self.conditionals - token = self.lexer.token() - while token != None and token[0] == 'preproc' and \ - token[1][0] != '#': - token = self.lexer.token() - return token + self.index_add(name, self.filename, not self.is_header, + "macro", info) + return token + if (name == "#ifdef" or name == "#ifndef") and self.is_header: + try: + self.defines.append(self.lexer.tokens[0][1]) + if string.find(self.lexer.tokens[0][1], 'ENABLED') != -1: + self.conditionals.append(self.lexer.tokens[0][1]) +# print(self.conditionals) +# print(self.defines) + except: + pass + if name == "#endif" and self.is_header: + if self.conditionals != [] and self.defines != [] and \ + self.defines[-1] == self.conditionals[-1]: + self.conditionals = self.conditionals[:-1] + self.defines = self.defines[:-1] +# print(self.defines) +# print(self.conditionals) + token = self.lexer.token() + while token != None and token[0] == 'preproc' and \ + token[1][0] != '#': + token = self.lexer.token() + return token # # token acquisition on top of the lexer, it handle internally @@ -864,218 +864,218 @@ global ignored_words token = self.lexer.token() - while token != None: - if token[0] == 'comment': - token = self.parseComment(token) - continue - elif token[0] == 'preproc': - token = self.parsePreproc(token) - continue - elif token[0] == "name" and ignored_words.has_key(token[1]): - (n, info) = ignored_words[token[1]] - i = 0 - while i < n: - token = self.lexer.token() - i = i + 1 - token = self.lexer.token() - continue - else: - if debug: - print "=> ", token - return token - return None + while token != None: + if token[0] == 'comment': + token = self.parseComment(token) + continue + elif token[0] == 'preproc': + token = self.parsePreproc(token) + continue + elif token[0] == "name" and ignored_words.has_key(token[1]): + (n, info) = ignored_words[token[1]] + i = 0 + while i < n: + token = self.lexer.token() + i = i + 1 + token = self.lexer.token() + continue + else: + if debug: + print("=> ", token) + return token + return None # # Parse a typedef, it records the type and its name. # def parseTypedef(self, token): if token == None: - return None - token = self.parseType(token) - if token == None: - self.error("parsing typedef") - return None - base_type = self.type - type = base_type - #self.debug("end typedef type", token) - while token != None: - if token[0] == "name": - name = token[1] - signature = self.signature - if signature != None: - type = string.split(type, '(')[0] - d = self.mergeFunctionComment(name, - ((type, None), signature), 1) - self.index_add(name, self.filename, not self.is_header, - "functype", d) - else: - if base_type == "struct": - self.index_add(name, self.filename, not self.is_header, - "struct", type) - base_type = "struct " + name - else: - self.index_add(name, self.filename, not self.is_header, - "typedef", type) - token = self.token() - else: - self.error("parsing typedef: expecting a name") - return token - #self.debug("end typedef", token) - if token != None and token[0] == 'sep' and token[1] == ',': - type = base_type - token = self.token() - while token != None and token[0] == "op": - type = type + token[1] - token = self.token() - elif token != None and token[0] == 'sep' and token[1] == ';': - break; - elif token != None and token[0] == 'name': - type = base_type - continue; - else: - self.error("parsing typedef: expecting ';'", token) - return token - token = self.token() - return token - + return None + token = self.parseType(token) + if token == None: + self.error("parsing typedef") + return None + base_type = self.type + type = base_type + #self.debug("end typedef type", token) + while token != None: + if token[0] == "name": + name = token[1] + signature = self.signature + if signature != None: + type = string.split(type, '(')[0] + d = self.mergeFunctionComment(name, + ((type, None), signature), 1) + self.index_add(name, self.filename, not self.is_header, + "functype", d) + else: + if base_type == "struct": + self.index_add(name, self.filename, not self.is_header, + "struct", type) + base_type = "struct " + name + else: + self.index_add(name, self.filename, not self.is_header, + "typedef", type) + token = self.token() + else: + self.error("parsing typedef: expecting a name") + return token + #self.debug("end typedef", token) + if token != None and token[0] == 'sep' and token[1] == ',': + type = base_type + token = self.token() + while token != None and token[0] == "op": + type = type + token[1] + token = self.token() + elif token != None and token[0] == 'sep' and token[1] == ';': + break; + elif token != None and token[0] == 'name': + type = base_type + continue; + else: + self.error("parsing typedef: expecting ';'", token) + return token + token = self.token() + return token + # # Parse a C code block, used for functions it parse till # the balancing } included # def parseBlock(self, token): while token != None: - if token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseBlock(token) - elif token[0] == "sep" and token[1] == "}": - self.comment = None - token = self.token() - return token - else: - if self.collect_ref == 1: - oldtok = token - token = self.token() - if oldtok[0] == "name" and oldtok[1][0:3] == "xml": - if token[0] == "sep" and token[1] == "(": - self.index_add_ref(oldtok[1], self.filename, - 0, "function") - token = self.token() - elif token[0] == "name": - token = self.token() - if token[0] == "sep" and (token[1] == ";" or - token[1] == "," or token[1] == "="): - self.index_add_ref(oldtok[1], self.filename, - 0, "type") - elif oldtok[0] == "name" and oldtok[1][0:4] == "XML_": - self.index_add_ref(oldtok[1], self.filename, - 0, "typedef") - elif oldtok[0] == "name" and oldtok[1][0:7] == "LIBXML_": - self.index_add_ref(oldtok[1], self.filename, - 0, "typedef") - - else: - token = self.token() - return token + if token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseBlock(token) + elif token[0] == "sep" and token[1] == "}": + self.comment = None + token = self.token() + return token + else: + if self.collect_ref == 1: + oldtok = token + token = self.token() + if oldtok[0] == "name" and oldtok[1][0:3] == "xml": + if token[0] == "sep" and token[1] == "(": + self.index_add_ref(oldtok[1], self.filename, + 0, "function") + token = self.token() + elif token[0] == "name": + token = self.token() + if token[0] == "sep" and (token[1] == ";" or + token[1] == "," or token[1] == "="): + self.index_add_ref(oldtok[1], self.filename, + 0, "type") + elif oldtok[0] == "name" and oldtok[1][0:4] == "XML_": + self.index_add_ref(oldtok[1], self.filename, + 0, "typedef") + elif oldtok[0] == "name" and oldtok[1][0:7] == "LIBXML_": + self.index_add_ref(oldtok[1], self.filename, + 0, "typedef") + + else: + token = self.token() + return token # # Parse a C struct definition till the balancing } # def parseStruct(self, token): fields = [] - #self.debug("start parseStruct", token) + #self.debug("start parseStruct", token) while token != None: - if token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseTypeBlock(token) - elif token[0] == "sep" and token[1] == "}": - self.struct_fields = fields - #self.debug("end parseStruct", token) - #print fields - token = self.token() - return token - else: - base_type = self.type - #self.debug("before parseType", token) - token = self.parseType(token) - #self.debug("after parseType", token) - if token != None and token[0] == "name": - fname = token[1] - token = self.token() - if token[0] == "sep" and token[1] == ";": - self.comment = None - token = self.token() - fields.append((self.type, fname, self.comment)) - self.comment = None - else: - self.error("parseStruct: expecting ;", token) - elif token != None and token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseTypeBlock(token) - if token != None and token[0] == "name": - token = self.token() - if token != None and token[0] == "sep" and token[1] == ";": - token = self.token() - else: - self.error("parseStruct: expecting ;", token) - else: - self.error("parseStruct: name", token) - token = self.token() - self.type = base_type; + if token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseTypeBlock(token) + elif token[0] == "sep" and token[1] == "}": + self.struct_fields = fields + #self.debug("end parseStruct", token) + #print(fields) + token = self.token() + return token + else: + base_type = self.type + #self.debug("before parseType", token) + token = self.parseType(token) + #self.debug("after parseType", token) + if token != None and token[0] == "name": + fname = token[1] + token = self.token() + if token[0] == "sep" and token[1] == ";": + self.comment = None + token = self.token() + fields.append((self.type, fname, self.comment)) + self.comment = None + else: + self.error("parseStruct: expecting ;", token) + elif token != None and token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseTypeBlock(token) + if token != None and token[0] == "name": + token = self.token() + if token != None and token[0] == "sep" and token[1] == ";": + token = self.token() + else: + self.error("parseStruct: expecting ;", token) + else: + self.error("parseStruct: name", token) + token = self.token() + self.type = base_type; self.struct_fields = fields - #self.debug("end parseStruct", token) - #print fields - return token + #self.debug("end parseStruct", token) + #print(fields) + return token # # Parse a C enum block, parse till the balancing } # def parseEnumBlock(self, token): self.enums = [] - name = None - self.comment = None - comment = "" - value = "0" + name = None + self.comment = None + comment = "" + value = "0" while token != None: - if token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseTypeBlock(token) - elif token[0] == "sep" and token[1] == "}": - if name != None: - if self.comment != None: - comment = self.comment - self.comment = None - self.enums.append((name, value, comment)) - token = self.token() - return token - elif token[0] == "name": - if name != None: - if self.comment != None: - comment = string.strip(self.comment) - self.comment = None - self.enums.append((name, value, comment)) - name = token[1] - comment = "" - token = self.token() - if token[0] == "op" and token[1][0] == "=": - value = "" - if len(token[1]) > 1: - value = token[1][1:] - token = self.token() - while token[0] != "sep" or (token[1] != ',' and - token[1] != '}'): - value = value + token[1] - token = self.token() - else: - try: - value = "%d" % (int(value) + 1) - except: - self.warning("Failed to compute value of enum %s" % (name)) - value="" - if token[0] == "sep" and token[1] == ",": - token = self.token() - else: - token = self.token() - return token + if token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseTypeBlock(token) + elif token[0] == "sep" and token[1] == "}": + if name != None: + if self.comment != None: + comment = self.comment + self.comment = None + self.enums.append((name, value, comment)) + token = self.token() + return token + elif token[0] == "name": + if name != None: + if self.comment != None: + comment = string.strip(self.comment) + self.comment = None + self.enums.append((name, value, comment)) + name = token[1] + comment = "" + token = self.token() + if token[0] == "op" and token[1][0] == "=": + value = "" + if len(token[1]) > 1: + value = token[1][1:] + token = self.token() + while token[0] != "sep" or (token[1] != ',' and + token[1] != '}'): + value = value + token[1] + token = self.token() + else: + try: + value = "%d" % (int(value) + 1) + except: + self.warning("Failed to compute value of enum %s" % (name)) + value="" + if token[0] == "sep" and token[1] == ",": + token = self.token() + else: + token = self.token() + return token # # Parse a C definition block, used for structs it parse till @@ -1083,15 +1083,15 @@ # def parseTypeBlock(self, token): while token != None: - if token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseTypeBlock(token) - elif token[0] == "sep" and token[1] == "}": - token = self.token() - return token - else: - token = self.token() - return token + if token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseTypeBlock(token) + elif token[0] == "sep" and token[1] == "}": + token = self.token() + return token + else: + token = self.token() + return token # # Parse a type: the fact that the type name can either occur after @@ -1100,198 +1100,198 @@ # def parseType(self, token): self.type = "" - self.struct_fields = [] + self.struct_fields = [] self.signature = None - if token == None: - return token + if token == None: + return token - while token[0] == "name" and ( - token[1] == "const" or token[1] == "unsigned"): - if self.type == "": - self.type = token[1] - else: - self.type = self.type + " " + token[1] - token = self.token() + while token[0] == "name" and ( + token[1] == "const" or token[1] == "unsigned"): + if self.type == "": + self.type = token[1] + else: + self.type = self.type + " " + token[1] + token = self.token() if token[0] == "name" and (token[1] == "long" or token[1] == "short"): - if self.type == "": - self.type = token[1] - else: - self.type = self.type + " " + token[1] - if token[0] == "name" and token[1] == "int": - if self.type == "": - self.type = tmp[1] - else: - self.type = self.type + " " + tmp[1] - + if self.type == "": + self.type = token[1] + else: + self.type = self.type + " " + token[1] + if token[0] == "name" and token[1] == "int": + if self.type == "": + self.type = tmp[1] + else: + self.type = self.type + " " + tmp[1] + elif token[0] == "name" and token[1] == "struct": - if self.type == "": - self.type = token[1] - else: - self.type = self.type + " " + token[1] - token = self.token() - nametok = None - if token[0] == "name": - nametok = token - token = self.token() - if token != None and token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseStruct(token) - elif token != None and token[0] == "op" and token[1] == "*": - self.type = self.type + " " + nametok[1] + " *" - token = self.token() - while token != None and token[0] == "op" and token[1] == "*": - self.type = self.type + " *" - token = self.token() - if token[0] == "name": - nametok = token - token = self.token() - else: - self.error("struct : expecting name", token) - return token - elif token != None and token[0] == "name" and nametok != None: - self.type = self.type + " " + nametok[1] - return token - - if nametok != None: - self.lexer.push(token) - token = nametok - return token + if self.type == "": + self.type = token[1] + else: + self.type = self.type + " " + token[1] + token = self.token() + nametok = None + if token[0] == "name": + nametok = token + token = self.token() + if token != None and token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseStruct(token) + elif token != None and token[0] == "op" and token[1] == "*": + self.type = self.type + " " + nametok[1] + " *" + token = self.token() + while token != None and token[0] == "op" and token[1] == "*": + self.type = self.type + " *" + token = self.token() + if token[0] == "name": + nametok = token + token = self.token() + else: + self.error("struct : expecting name", token) + return token + elif token != None and token[0] == "name" and nametok != None: + self.type = self.type + " " + nametok[1] + return token + + if nametok != None: + self.lexer.push(token) + token = nametok + return token elif token[0] == "name" and token[1] == "enum": - if self.type == "": - self.type = token[1] - else: - self.type = self.type + " " + token[1] - self.enums = [] - token = self.token() - if token != None and token[0] == "sep" and token[1] == "{": - token = self.token() - token = self.parseEnumBlock(token) - else: - self.error("parsing enum: expecting '{'", token) - enum_type = None - if token != None and token[0] != "name": - self.lexer.push(token) - token = ("name", "enum") - else: - enum_type = token[1] - for enum in self.enums: - self.index_add(enum[0], self.filename, - not self.is_header, "enum", - (enum[1], enum[2], enum_type)) - return token - - elif token[0] == "name": - if self.type == "": - self.type = token[1] - else: - self.type = self.type + " " + token[1] - else: - self.error("parsing type %s: expecting a name" % (self.type), - token) - return token - token = self.token() + if self.type == "": + self.type = token[1] + else: + self.type = self.type + " " + token[1] + self.enums = [] + token = self.token() + if token != None and token[0] == "sep" and token[1] == "{": + token = self.token() + token = self.parseEnumBlock(token) + else: + self.error("parsing enum: expecting '{'", token) + enum_type = None + if token != None and token[0] != "name": + self.lexer.push(token) + token = ("name", "enum") + else: + enum_type = token[1] + for enum in self.enums: + self.index_add(enum[0], self.filename, + not self.is_header, "enum", + (enum[1], enum[2], enum_type)) + return token + + elif token[0] == "name": + if self.type == "": + self.type = token[1] + else: + self.type = self.type + " " + token[1] + else: + self.error("parsing type %s: expecting a name" % (self.type), + token) + return token + token = self.token() while token != None and (token[0] == "op" or - token[0] == "name" and token[1] == "const"): - self.type = self.type + " " + token[1] - token = self.token() - - # - # if there is a parenthesis here, this means a function type - # - if token != None and token[0] == "sep" and token[1] == '(': - self.type = self.type + token[1] - token = self.token() - while token != None and token[0] == "op" and token[1] == '*': - self.type = self.type + token[1] - token = self.token() - if token == None or token[0] != "name" : - self.error("parsing function type, name expected", token); - return token - self.type = self.type + token[1] - nametok = token - token = self.token() - if token != None and token[0] == "sep" and token[1] == ')': - self.type = self.type + token[1] - token = self.token() - if token != None and token[0] == "sep" and token[1] == '(': - token = self.token() - type = self.type; - token = self.parseSignature(token); - self.type = type; - else: - self.error("parsing function type, '(' expected", token); - return token - else: - self.error("parsing function type, ')' expected", token); - return token - self.lexer.push(token) - token = nametok - return token + token[0] == "name" and token[1] == "const"): + self.type = self.type + " " + token[1] + token = self.token() # - # do some lookahead for arrays - # - if token != None and token[0] == "name": - nametok = token - token = self.token() - if token != None and token[0] == "sep" and token[1] == '[': - self.type = self.type + nametok[1] - while token != None and token[0] == "sep" and token[1] == '[': - self.type = self.type + token[1] - token = self.token() - while token != None and token[0] != 'sep' and \ - token[1] != ']' and token[1] != ';': - self.type = self.type + token[1] - token = self.token() - if token != None and token[0] == 'sep' and token[1] == ']': - self.type = self.type + token[1] - token = self.token() - else: - self.error("parsing array type, ']' expected", token); - return token - elif token != None and token[0] == "sep" and token[1] == ':': - # remove :12 in case it's a limited int size - token = self.token() - token = self.token() - self.lexer.push(token) - token = nametok + # if there is a parenthesis here, this means a function type + # + if token != None and token[0] == "sep" and token[1] == '(': + self.type = self.type + token[1] + token = self.token() + while token != None and token[0] == "op" and token[1] == '*': + self.type = self.type + token[1] + token = self.token() + if token == None or token[0] != "name" : + self.error("parsing function type, name expected", token); + return token + self.type = self.type + token[1] + nametok = token + token = self.token() + if token != None and token[0] == "sep" and token[1] == ')': + self.type = self.type + token[1] + token = self.token() + if token != None and token[0] == "sep" and token[1] == '(': + token = self.token() + type = self.type; + token = self.parseSignature(token); + self.type = type; + else: + self.error("parsing function type, '(' expected", token); + return token + else: + self.error("parsing function type, ')' expected", token); + return token + self.lexer.push(token) + token = nametok + return token - return token + # + # do some lookahead for arrays + # + if token != None and token[0] == "name": + nametok = token + token = self.token() + if token != None and token[0] == "sep" and token[1] == '[': + self.type = self.type + nametok[1] + while token != None and token[0] == "sep" and token[1] == '[': + self.type = self.type + token[1] + token = self.token() + while token != None and token[0] != 'sep' and \ + token[1] != ']' and token[1] != ';': + self.type = self.type + token[1] + token = self.token() + if token != None and token[0] == 'sep' and token[1] == ']': + self.type = self.type + token[1] + token = self.token() + else: + self.error("parsing array type, ']' expected", token); + return token + elif token != None and token[0] == "sep" and token[1] == ':': + # remove :12 in case it's a limited int size + token = self.token() + token = self.token() + self.lexer.push(token) + token = nametok + + return token # # Parse a signature: '(' has been parsed and we scan the type definition # up to the ')' included def parseSignature(self, token): signature = [] - if token != None and token[0] == "sep" and token[1] == ')': - self.signature = [] - token = self.token() - return token - while token != None: - token = self.parseType(token) - if token != None and token[0] == "name": - signature.append((self.type, token[1], None)) - token = self.token() - elif token != None and token[0] == "sep" and token[1] == ',': - token = self.token() - continue - elif token != None and token[0] == "sep" and token[1] == ')': - # only the type was provided - if self.type == "...": - signature.append((self.type, "...", None)) - else: - signature.append((self.type, None, None)) - if token != None and token[0] == "sep": - if token[1] == ',': - token = self.token() - continue - elif token[1] == ')': - token = self.token() - break - self.signature = signature - return token + if token != None and token[0] == "sep" and token[1] == ')': + self.signature = [] + token = self.token() + return token + while token != None: + token = self.parseType(token) + if token != None and token[0] == "name": + signature.append((self.type, token[1], None)) + token = self.token() + elif token != None and token[0] == "sep" and token[1] == ',': + token = self.token() + continue + elif token != None and token[0] == "sep" and token[1] == ')': + # only the type was provided + if self.type == "...": + signature.append((self.type, "...", None)) + else: + signature.append((self.type, None, None)) + if token != None and token[0] == "sep": + if token[1] == ',': + token = self.token() + continue + elif token[1] == ')': + token = self.token() + break + self.signature = signature + return token # # Parse a global definition, be it a type, variable or function @@ -1300,573 +1300,573 @@ def parseGlobal(self, token): static = 0 if token[1] == 'extern': - token = self.token() - if token == None: - return token - if token[0] == 'string': - if token[1] == 'C': - token = self.token() - if token == None: - return token - if token[0] == 'sep' and token[1] == "{": - token = self.token() -# print 'Entering extern "C line ', self.lineno() - while token != None and (token[0] != 'sep' or - token[1] != "}"): - if token[0] == 'name': - token = self.parseGlobal(token) - else: - self.error( - "token %s %s unexpected at the top level" % ( - token[0], token[1])) - token = self.parseGlobal(token) -# print 'Exiting extern "C" line', self.lineno() - token = self.token() - return token - else: - return token - elif token[1] == 'static': - static = 1 - token = self.token() - if token == None or token[0] != 'name': - return token - - if token[1] == 'typedef': - token = self.token() - return self.parseTypedef(token) - else: - token = self.parseType(token) - type_orig = self.type - if token == None or token[0] != "name": - return token - type = type_orig - self.name = token[1] - token = self.token() - while token != None and (token[0] == "sep" or token[0] == "op"): - if token[0] == "sep": - if token[1] == "[": - type = type + token[1] - token = self.token() - while token != None and (token[0] != "sep" or \ - token[1] != ";"): - type = type + token[1] - token = self.token() - - if token != None and token[0] == "op" and token[1] == "=": - # - # Skip the initialization of the variable - # - token = self.token() - if token[0] == 'sep' and token[1] == '{': - token = self.token() - token = self.parseBlock(token) - else: - self.comment = None - while token != None and (token[0] != "sep" or \ - (token[1] != ';' and token[1] != ',')): - token = self.token() - self.comment = None - if token == None or token[0] != "sep" or (token[1] != ';' and - token[1] != ','): - self.error("missing ';' or ',' after value") - - if token != None and token[0] == "sep": - if token[1] == ";": - self.comment = None - token = self.token() - if type == "struct": - self.index_add(self.name, self.filename, - not self.is_header, "struct", self.struct_fields) - else: - self.index_add(self.name, self.filename, - not self.is_header, "variable", type) - break - elif token[1] == "(": - token = self.token() - token = self.parseSignature(token) - if token == None: - return None - if token[0] == "sep" and token[1] == ";": - d = self.mergeFunctionComment(self.name, - ((type, None), self.signature), 1) - self.index_add(self.name, self.filename, static, - "function", d) - token = self.token() - elif token[0] == "sep" and token[1] == "{": - d = self.mergeFunctionComment(self.name, - ((type, None), self.signature), static) - self.index_add(self.name, self.filename, static, - "function", d) - token = self.token() - token = self.parseBlock(token); - elif token[1] == ',': - self.comment = None - self.index_add(self.name, self.filename, static, - "variable", type) - type = type_orig - token = self.token() - while token != None and token[0] == "sep": - type = type + token[1] - token = self.token() - if token != None and token[0] == "name": - self.name = token[1] - token = self.token() - else: - break - - return token + token = self.token() + if token == None: + return token + if token[0] == 'string': + if token[1] == 'C': + token = self.token() + if token == None: + return token + if token[0] == 'sep' and token[1] == "{": + token = self.token() +# print('Entering extern "C line ', self.lineno()) + while token != None and (token[0] != 'sep' or + token[1] != "}"): + if token[0] == 'name': + token = self.parseGlobal(token) + else: + self.error( + "token %s %s unexpected at the top level" % ( + token[0], token[1])) + token = self.parseGlobal(token) +# print('Exiting extern "C" line', self.lineno()) + token = self.token() + return token + else: + return token + elif token[1] == 'static': + static = 1 + token = self.token() + if token == None or token[0] != 'name': + return token + + if token[1] == 'typedef': + token = self.token() + return self.parseTypedef(token) + else: + token = self.parseType(token) + type_orig = self.type + if token == None or token[0] != "name": + return token + type = type_orig + self.name = token[1] + token = self.token() + while token != None and (token[0] == "sep" or token[0] == "op"): + if token[0] == "sep": + if token[1] == "[": + type = type + token[1] + token = self.token() + while token != None and (token[0] != "sep" or \ + token[1] != ";"): + type = type + token[1] + token = self.token() + + if token != None and token[0] == "op" and token[1] == "=": + # + # Skip the initialization of the variable + # + token = self.token() + if token[0] == 'sep' and token[1] == '{': + token = self.token() + token = self.parseBlock(token) + else: + self.comment = None + while token != None and (token[0] != "sep" or \ + (token[1] != ';' and token[1] != ',')): + token = self.token() + self.comment = None + if token == None or token[0] != "sep" or (token[1] != ';' and + token[1] != ','): + self.error("missing ';' or ',' after value") + + if token != None and token[0] == "sep": + if token[1] == ";": + self.comment = None + token = self.token() + if type == "struct": + self.index_add(self.name, self.filename, + not self.is_header, "struct", self.struct_fields) + else: + self.index_add(self.name, self.filename, + not self.is_header, "variable", type) + break + elif token[1] == "(": + token = self.token() + token = self.parseSignature(token) + if token == None: + return None + if token[0] == "sep" and token[1] == ";": + d = self.mergeFunctionComment(self.name, + ((type, None), self.signature), 1) + self.index_add(self.name, self.filename, static, + "function", d) + token = self.token() + elif token[0] == "sep" and token[1] == "{": + d = self.mergeFunctionComment(self.name, + ((type, None), self.signature), static) + self.index_add(self.name, self.filename, static, + "function", d) + token = self.token() + token = self.parseBlock(token); + elif token[1] == ',': + self.comment = None + self.index_add(self.name, self.filename, static, + "variable", type) + type = type_orig + token = self.token() + while token != None and token[0] == "sep": + type = type + token[1] + token = self.token() + if token != None and token[0] == "name": + self.name = token[1] + token = self.token() + else: + break + + return token def parse(self): self.warning("Parsing %s" % (self.filename)) token = self.token() - while token != None: + while token != None: if token[0] == 'name': - token = self.parseGlobal(token) + token = self.parseGlobal(token) else: - self.error("token %s %s unexpected at the top level" % ( - token[0], token[1])) - token = self.parseGlobal(token) - return - self.parseTopComment(self.top_comment) + self.error("token %s %s unexpected at the top level" % ( + token[0], token[1])) + token = self.parseGlobal(token) + return + self.parseTopComment(self.top_comment) return self.index - + class docBuilder: """A documentation builder""" def __init__(self, name, directories=['.'], excludes=[]): self.name = name self.directories = directories - self.excludes = excludes + ignored_files.keys() - self.modules = {} - self.headers = {} - self.idx = index() + self.excludes = excludes + ignored_files.keys() + self.modules = {} + self.headers = {} + self.idx = index() self.xref = {} - self.index = {} - if name == 'libxml2': - self.basename = 'libxml' - else: - self.basename = name + self.index = {} + if name == 'libxml2': + self.basename = 'libxml' + else: + self.basename = name def indexString(self, id, str): - if str == None: - return - str = string.replace(str, "'", ' ') - str = string.replace(str, '"', ' ') - str = string.replace(str, "/", ' ') - str = string.replace(str, '*', ' ') - str = string.replace(str, "[", ' ') - str = string.replace(str, "]", ' ') - str = string.replace(str, "(", ' ') - str = string.replace(str, ")", ' ') - str = string.replace(str, "<", ' ') - str = string.replace(str, '>', ' ') - str = string.replace(str, "&", ' ') - str = string.replace(str, '#', ' ') - str = string.replace(str, ",", ' ') - str = string.replace(str, '.', ' ') - str = string.replace(str, ';', ' ') - tokens = string.split(str) - for token in tokens: - try: - c = token[0] - if string.find(string.letters, c) < 0: - pass - elif len(token) < 3: - pass - else: - lower = string.lower(token) - # TODO: generalize this a bit - if lower == 'and' or lower == 'the': - pass - elif self.xref.has_key(token): - self.xref[token].append(id) - else: - self.xref[token] = [id] - except: - pass + if str == None: + return + str = string.replace(str, "'", ' ') + str = string.replace(str, '"', ' ') + str = string.replace(str, "/", ' ') + str = string.replace(str, '*', ' ') + str = string.replace(str, "[", ' ') + str = string.replace(str, "]", ' ') + str = string.replace(str, "(", ' ') + str = string.replace(str, ")", ' ') + str = string.replace(str, "<", ' ') + str = string.replace(str, '>', ' ') + str = string.replace(str, "&", ' ') + str = string.replace(str, '#', ' ') + str = string.replace(str, ",", ' ') + str = string.replace(str, '.', ' ') + str = string.replace(str, ';', ' ') + tokens = string.split(str) + for token in tokens: + try: + c = token[0] + if string.find(string.letters, c) < 0: + pass + elif len(token) < 3: + pass + else: + lower = string.lower(token) + # TODO: generalize this a bit + if lower == 'and' or lower == 'the': + pass + elif self.xref.has_key(token): + self.xref[token].append(id) + else: + self.xref[token] = [id] + except: + pass def analyze(self): - print "Project %s : %d headers, %d modules" % (self.name, len(self.headers.keys()), len(self.modules.keys())) - self.idx.analyze() + print("Project %s : %d headers, %d modules" % (self.name, len(self.headers.keys()), len(self.modules.keys()))) + self.idx.analyze() def scanHeaders(self): - for header in self.headers.keys(): - parser = CParser(header) - idx = parser.parse() - self.headers[header] = idx; - self.idx.merge(idx) + for header in self.headers.keys(): + parser = CParser(header) + idx = parser.parse() + self.headers[header] = idx; + self.idx.merge(idx) def scanModules(self): - for module in self.modules.keys(): - parser = CParser(module) - idx = parser.parse() - # idx.analyze() - self.modules[module] = idx - self.idx.merge_public(idx) + for module in self.modules.keys(): + parser = CParser(module) + idx = parser.parse() + # idx.analyze() + self.modules[module] = idx + self.idx.merge_public(idx) def scan(self): for directory in self.directories: - files = glob.glob(directory + "/*.c") - for file in files: - skip = 0 - for excl in self.excludes: - if string.find(file, excl) != -1: - skip = 1; - break - if skip == 0: - self.modules[file] = None; - files = glob.glob(directory + "/*.h") - for file in files: - skip = 0 - for excl in self.excludes: - if string.find(file, excl) != -1: - skip = 1; - break - if skip == 0: - self.headers[file] = None; - self.scanHeaders() - self.scanModules() + files = glob.glob(directory + "/*.c") + for file in files: + skip = 0 + for excl in self.excludes: + if string.find(file, excl) != -1: + skip = 1; + break + if skip == 0: + self.modules[file] = None; + files = glob.glob(directory + "/*.h") + for file in files: + skip = 0 + for excl in self.excludes: + if string.find(file, excl) != -1: + skip = 1; + break + if skip == 0: + self.headers[file] = None; + self.scanHeaders() + self.scanModules() def modulename_file(self, file): module = os.path.basename(file) - if module[-2:] == '.h': - module = module[:-2] - return module + if module[-2:] == '.h': + module = module[:-2] + return module def serialize_enum(self, output, name): id = self.idx.enums[name] output.write(" \n") def serialize_macro(self, output, name): id = self.idx.macros[name] output.write(" \n" % (name, - self.modulename_file(id.module))) - if id.info != None: + self.modulename_file(id.module))) + if id.info != None: try: - (args, desc) = id.info - if desc != None and desc != "": - output.write(" %s\n" % (escape(desc))) - self.indexString(name, desc) - for arg in args: - (name, desc) = arg - if desc != None and desc != "": - output.write(" \n" % ( - name, escape(desc))) - self.indexString(name, desc) - else: - output.write(" \n" % (name)) + (args, desc) = id.info + if desc != None and desc != "": + output.write(" %s\n" % (escape(desc))) + self.indexString(name, desc) + for arg in args: + (name, desc) = arg + if desc != None and desc != "": + output.write(" \n" % ( + name, escape(desc))) + self.indexString(name, desc) + else: + output.write(" \n" % (name)) except: pass output.write(" \n") def serialize_typedef(self, output, name): id = self.idx.typedefs[name] - if id.info[0:7] == 'struct ': - output.write(" \n"); - try: - for field in self.idx.structs[name].info: - desc = field[2] - self.indexString(name, desc) - if desc == None: - desc = '' - else: - desc = escape(desc) - output.write(" \n" % (field[1] , field[0], desc)) - except: - print "Failed to serialize struct %s" % (name) - output.write(" \n") - else: - output.write("/>\n"); - else : - output.write(" \n" % ( - name, self.modulename_file(id.module), id.info)) + if id.info[0:7] == 'struct ': + output.write(" \n"); + try: + for field in self.idx.structs[name].info: + desc = field[2] + self.indexString(name, desc) + if desc == None: + desc = '' + else: + desc = escape(desc) + output.write(" \n" % (field[1] , field[0], desc)) + except: + print("Failed to serialize struct %s" % (name)) + output.write(" \n") + else: + output.write("/>\n"); + else : + output.write(" \n" % ( + name, self.modulename_file(id.module), id.info)) def serialize_variable(self, output, name): id = self.idx.variables[name] - if id.info != None: - output.write(" \n" % ( - name, self.modulename_file(id.module), id.info)) - else: - output.write(" \n" % ( - name, self.modulename_file(id.module))) - + if id.info != None: + output.write(" \n" % ( + name, self.modulename_file(id.module), id.info)) + else: + output.write(" \n" % ( + name, self.modulename_file(id.module))) + def serialize_function(self, output, name): id = self.idx.functions[name] - if name == debugsym: - print "=>", id + if name == debugsym: + print("=>", id) output.write(" <%s name='%s' file='%s'>\n" % (id.type, name, - self.modulename_file(id.module))) - if id.conditionals != None: - for cond in id.conditionals: - output.write(" %s\n"% (cond)); - try: - (ret, params, desc) = id.info - output.write(" %s\n" % (escape(desc))) - self.indexString(name, desc) - if ret[0] != None: - if ret[0] == "void": - output.write(" \n") - else: - output.write(" \n" % ( - ret[0], escape(ret[1]))) - self.indexString(name, ret[1]) - for param in params: - if param[0] == 'void': - continue - if param[2] == None: - output.write(" \n" % (param[1], param[0])) - else: - output.write(" \n" % (param[1], param[0], escape(param[2]))) - self.indexString(name, param[2]) - except: - print "Failed to save function %s info: " % name, `id.info` + self.modulename_file(id.module))) + if id.conditionals != None: + for cond in id.conditionals: + output.write(" %s\n"% (cond)); + try: + (ret, params, desc) = id.info + output.write(" %s\n" % (escape(desc))) + self.indexString(name, desc) + if ret[0] != None: + if ret[0] == "void": + output.write(" \n") + else: + output.write(" \n" % ( + ret[0], escape(ret[1]))) + self.indexString(name, ret[1]) + for param in params: + if param[0] == 'void': + continue + if param[2] == None: + output.write(" \n" % (param[1], param[0])) + else: + output.write(" \n" % (param[1], param[0], escape(param[2]))) + self.indexString(name, param[2]) + except: + print("Failed to save function %s info: " % name, id.info) output.write(" \n" % (id.type)) def serialize_exports(self, output, file): module = self.modulename_file(file) - output.write(" \n" % (module)) - dict = self.headers[file] - if dict.info != None: - for data in ('Summary', 'Description', 'Author'): - try: - output.write(" <%s>%s\n" % ( - string.lower(data), - escape(dict.info[data]), - string.lower(data))) - except: - print "Header %s lacks a %s description" % (module, data) - if dict.info.has_key('Description'): - desc = dict.info['Description'] - if string.find(desc, "DEPRECATED") != -1: - output.write(" \n") + output.write(" \n" % (module)) + dict = self.headers[file] + if dict.info != None: + for data in ('Summary', 'Description', 'Author'): + try: + output.write(" <%s>%s\n" % ( + string.lower(data), + escape(dict.info[data]), + string.lower(data))) + except: + print("Header %s lacks a %s description" % (module, data)) + if dict.info.has_key('Description'): + desc = dict.info['Description'] + if string.find(desc, "DEPRECATED") != -1: + output.write(" \n") ids = dict.macros.keys() - ids.sort() - for id in uniq(ids): - # Macros are sometime used to masquerade other types. - if dict.functions.has_key(id): - continue - if dict.variables.has_key(id): - continue - if dict.typedefs.has_key(id): - continue - if dict.structs.has_key(id): - continue - if dict.enums.has_key(id): - continue - output.write(" \n" % (id)) + ids.sort() + for id in uniq(ids): + # Macros are sometime used to masquerade other types. + if dict.functions.has_key(id): + continue + if dict.variables.has_key(id): + continue + if dict.typedefs.has_key(id): + continue + if dict.structs.has_key(id): + continue + if dict.enums.has_key(id): + continue + output.write(" \n" % (id)) ids = dict.enums.keys() - ids.sort() - for id in uniq(ids): - output.write(" \n" % (id)) + ids.sort() + for id in uniq(ids): + output.write(" \n" % (id)) ids = dict.typedefs.keys() - ids.sort() - for id in uniq(ids): - output.write(" \n" % (id)) + ids.sort() + for id in uniq(ids): + output.write(" \n" % (id)) ids = dict.structs.keys() - ids.sort() - for id in uniq(ids): - output.write(" \n" % (id)) + ids.sort() + for id in uniq(ids): + output.write(" \n" % (id)) ids = dict.variables.keys() - ids.sort() - for id in uniq(ids): - output.write(" \n" % (id)) + ids.sort() + for id in uniq(ids): + output.write(" \n" % (id)) ids = dict.functions.keys() - ids.sort() - for id in uniq(ids): - output.write(" \n" % (id)) - output.write(" \n") + ids.sort() + for id in uniq(ids): + output.write(" \n" % (id)) + output.write(" \n") def serialize_xrefs_files(self, output): headers = self.headers.keys() headers.sort() for file in headers: - module = self.modulename_file(file) - output.write(" \n" % (module)) - dict = self.headers[file] - ids = uniq(dict.functions.keys() + dict.variables.keys() + \ - dict.macros.keys() + dict.typedefs.keys() + \ - dict.structs.keys() + dict.enums.keys()) - ids.sort() - for id in ids: - output.write(" \n" % (id)) - output.write(" \n") + module = self.modulename_file(file) + output.write(" \n" % (module)) + dict = self.headers[file] + ids = uniq(dict.functions.keys() + dict.variables.keys() + \ + dict.macros.keys() + dict.typedefs.keys() + \ + dict.structs.keys() + dict.enums.keys()) + ids.sort() + for id in ids: + output.write(" \n" % (id)) + output.write(" \n") pass def serialize_xrefs_functions(self, output): funcs = {} - for name in self.idx.functions.keys(): - id = self.idx.functions[name] - try: - (ret, params, desc) = id.info - for param in params: - if param[0] == 'void': - continue - if funcs.has_key(param[0]): - funcs[param[0]].append(name) - else: - funcs[param[0]] = [name] - except: - pass - typ = funcs.keys() - typ.sort() - for type in typ: - if type == '' or type == 'void' or type == "int" or \ - type == "char *" or type == "const char *" : - continue - output.write(" \n" % (type)) - ids = funcs[type] - ids.sort() - pid = '' # not sure why we have dups, but get rid of them! - for id in ids: - if id != pid: - output.write(" \n" % (id)) - pid = id - output.write(" \n") + for name in self.idx.functions.keys(): + id = self.idx.functions[name] + try: + (ret, params, desc) = id.info + for param in params: + if param[0] == 'void': + continue + if funcs.has_key(param[0]): + funcs[param[0]].append(name) + else: + funcs[param[0]] = [name] + except: + pass + typ = funcs.keys() + typ.sort() + for type in typ: + if type == '' or type == 'void' or type == "int" or \ + type == "char *" or type == "const char *" : + continue + output.write(" \n" % (type)) + ids = funcs[type] + ids.sort() + pid = '' # not sure why we have dups, but get rid of them! + for id in ids: + if id != pid: + output.write(" \n" % (id)) + pid = id + output.write(" \n") def serialize_xrefs_constructors(self, output): funcs = {} - for name in self.idx.functions.keys(): - id = self.idx.functions[name] - try: - (ret, params, desc) = id.info - if ret[0] == "void": - continue - if funcs.has_key(ret[0]): - funcs[ret[0]].append(name) - else: - funcs[ret[0]] = [name] - except: - pass - typ = funcs.keys() - typ.sort() - for type in typ: - if type == '' or type == 'void' or type == "int" or \ - type == "char *" or type == "const char *" : - continue - output.write(" \n" % (type)) - ids = funcs[type] - ids.sort() - for id in ids: - output.write(" \n" % (id)) - output.write(" \n") + for name in self.idx.functions.keys(): + id = self.idx.functions[name] + try: + (ret, params, desc) = id.info + if ret[0] == "void": + continue + if funcs.has_key(ret[0]): + funcs[ret[0]].append(name) + else: + funcs[ret[0]] = [name] + except: + pass + typ = funcs.keys() + typ.sort() + for type in typ: + if type == '' or type == 'void' or type == "int" or \ + type == "char *" or type == "const char *" : + continue + output.write(" \n" % (type)) + ids = funcs[type] + ids.sort() + for id in ids: + output.write(" \n" % (id)) + output.write(" \n") def serialize_xrefs_alpha(self, output): - letter = None - ids = self.idx.identifiers.keys() - ids.sort() - for id in ids: - if id[0] != letter: - if letter != None: - output.write(" \n") - letter = id[0] - output.write(" \n" % (letter)) - output.write(" \n" % (id)) - if letter != None: - output.write(" \n") + letter = None + ids = self.idx.identifiers.keys() + ids.sort() + for id in ids: + if id[0] != letter: + if letter != None: + output.write(" \n") + letter = id[0] + output.write(" \n" % (letter)) + output.write(" \n" % (id)) + if letter != None: + output.write(" \n") def serialize_xrefs_references(self, output): typ = self.idx.identifiers.keys() - typ.sort() - for id in typ: - idf = self.idx.identifiers[id] - module = idf.module - output.write(" \n" % (id, - 'html/' + self.basename + '-' + - self.modulename_file(module) + '.html#' + - id)) + typ.sort() + for id in typ: + idf = self.idx.identifiers[id] + module = idf.module + output.write(" \n" % (id, + 'html/' + self.basename + '-' + + self.modulename_file(module) + '.html#' + + id)) def serialize_xrefs_index(self, output): index = self.xref - typ = index.keys() - typ.sort() - letter = None - count = 0 - chunk = 0 - chunks = [] - for id in typ: - if len(index[id]) > 30: - continue - if id[0] != letter: - if letter == None or count > 200: - if letter != None: - output.write(" \n") - output.write(" \n") - count = 0 - chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) - output.write(" \n" % (chunk)) - first_letter = id[0] - chunk = chunk + 1 - elif letter != None: - output.write(" \n") - letter = id[0] - output.write(" \n" % (letter)) - output.write(" \n" % (id)) - tokens = index[id]; - tokens.sort() - tok = None - for token in tokens: - if tok == token: - continue - tok = token - output.write(" \n" % (token)) - count = count + 1 - output.write(" \n") - if letter != None: - output.write(" \n") - output.write(" \n") - if count != 0: - chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) - output.write(" \n") - for ch in chunks: - output.write(" \n" % ( - ch[0], ch[1], ch[2])) - output.write(" \n") + typ = index.keys() + typ.sort() + letter = None + count = 0 + chunk = 0 + chunks = [] + for id in typ: + if len(index[id]) > 30: + continue + if id[0] != letter: + if letter == None or count > 200: + if letter != None: + output.write(" \n") + output.write(" \n") + count = 0 + chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) + output.write(" \n" % (chunk)) + first_letter = id[0] + chunk = chunk + 1 + elif letter != None: + output.write(" \n") + letter = id[0] + output.write(" \n" % (letter)) + output.write(" \n" % (id)) + tokens = index[id]; + tokens.sort() + tok = None + for token in tokens: + if tok == token: + continue + tok = token + output.write(" \n" % (token)) + count = count + 1 + output.write(" \n") + if letter != None: + output.write(" \n") + output.write(" \n") + if count != 0: + chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) + output.write(" \n") + for ch in chunks: + output.write(" \n" % ( + ch[0], ch[1], ch[2])) + output.write(" \n") def serialize_xrefs(self, output): - output.write(" \n") - self.serialize_xrefs_references(output) - output.write(" \n") - output.write(" \n") - self.serialize_xrefs_alpha(output) - output.write(" \n") - output.write(" \n") - self.serialize_xrefs_constructors(output) - output.write(" \n") - output.write(" \n") - self.serialize_xrefs_functions(output) - output.write(" \n") - output.write(" \n") - self.serialize_xrefs_files(output) - output.write(" \n") - output.write(" \n") - self.serialize_xrefs_index(output) - output.write(" \n") + output.write(" \n") + self.serialize_xrefs_references(output) + output.write(" \n") + output.write(" \n") + self.serialize_xrefs_alpha(output) + output.write(" \n") + output.write(" \n") + self.serialize_xrefs_constructors(output) + output.write(" \n") + output.write(" \n") + self.serialize_xrefs_functions(output) + output.write(" \n") + output.write(" \n") + self.serialize_xrefs_files(output) + output.write(" \n") + output.write(" \n") + self.serialize_xrefs_index(output) + output.write(" \n") def serialize(self): filename = "%s-api.xml" % self.name - print "Saving XML description %s" % (filename) + print("Saving XML description %s" % (filename)) output = open(filename, "w") output.write('\n') output.write("\n" % self.name) @@ -1902,7 +1902,7 @@ output.close() filename = "%s-refs.xml" % self.name - print "Saving XML Cross References %s" % (filename) + print("Saving XML Cross References %s" % (filename)) output = open(filename, "w") output.write('\n') output.write("\n" % self.name) @@ -1914,19 +1914,19 @@ def rebuild(): builder = None if glob.glob("../libgamin/gam_api.c") != [] : - print "Rebuilding API description for gamin" - builder = docBuilder("gamin", ["../libgamin"]) + print("Rebuilding API description for gamin") + builder = docBuilder("gamin", ["../libgamin"]) else: - print "rebuild() failed, unable to guess the module" - return None + print("rebuild() failed, unable to guess the module") + return None builder.scan() builder.analyze() builder.serialize() # if glob.glob("../libexslt/exslt.c") != [] : # extra = docBuilder("libexslt", ["../libexslt"], ["libexslt.h"]) -# extra.scan() -# extra.analyze() -# extra.serialize() +# extra.scan() +# extra.analyze() +# extra.serialize() return builder # @@ -1942,4 +1942,4 @@ debug = 1 parse(sys.argv[1]) else: - rebuild() + rebuild() --- a/configure.in 2020-04-28 11:48:32.720666822 +0300 +++ b/configure.in 2020-04-28 11:50:19.631211997 +0300 @@ -470,7 +470,7 @@ if test -x "$PYTHON" then echo Found python in environment PYTHON=$PYTHON - with_python=`$PYTHON -c "import sys; print sys.exec_prefix"` + with_python=`$PYTHON -c "import sys; print(sys.exec_prefix)"` else AC_PATH_PROG(PYTHON, python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5) fi @@ -478,7 +478,7 @@ fi if test "$PYTHON" != "" then - PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[[0:3]]"` + PYTHON_VERSION=`$PYTHON -c "import sys; print(sys.version[[0:3]])"` echo Found Python version $PYTHON_VERSION fi if test "$PYTHON_VERSION" != "" @@ -504,7 +504,7 @@ fi if test ! -d "$PYTHON_SITE_PACKAGES" then - PYTHON_SITE_PACKAGES=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib()"` + PYTHON_SITE_PACKAGES=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_lib())"` fi fi fi --- a/python/gamin.c 2020-04-28 12:14:53.648815347 +0300 +++ b/python/gamin.c 2020-04-28 17:06:40.892100767 +0300 @@ -174,7 +174,7 @@ static PyObject * gamin_Errno(PyObject *self, PyObject * args) { - return(PyInt_FromLong(FAMErrno)); + return(PyLong_FromLong(FAMErrno)); } static PyObject * @@ -183,9 +183,9 @@ ret = fam_connect(); if (ret < 0) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(ret)); + return(PyLong_FromLong(ret)); } static PyObject * @@ -198,9 +198,9 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(FAMCONNECTION_GETFD(conn))); + return(PyLong_FromLong(FAMCONNECTION_GETFD(conn))); } static PyObject * @@ -212,7 +212,7 @@ return(NULL); ret = release_connection(no); - return(PyInt_FromLong(ret)); + return(PyLong_FromLong(ret)); } static PyObject * @@ -227,16 +227,16 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } ret = FAMNextEvent(conn, &fe); if (ret < 0) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } call_internal_callback(fe.userdata, &fe.filename[0], fe.code); - return(PyInt_FromLong(ret)); + return(PyLong_FromLong(ret)); } static PyObject * @@ -252,23 +252,23 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } do { ret = FAMPending(conn); if (ret < 0) - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); if (ret == 0) break; ret = FAMNextEvent(conn, &fe); if (ret < 0) - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); call_internal_callback(fe.userdata, &fe.filename[0], fe.code); nb++; } while (ret >= 0); - return(PyInt_FromLong(nb)); + return(PyLong_FromLong(nb)); } static PyObject * @@ -281,9 +281,9 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(FAMPending(conn))); + return(PyLong_FromLong(FAMPending(conn))); } static PyObject * @@ -296,9 +296,9 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(FAMNoExists(conn))); + return(PyLong_FromLong(FAMNoExists(conn))); } static PyObject * @@ -317,20 +317,20 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } noreq = get_request(); if (noreq < 0) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } request = check_request(noreq); ret = FAMMonitorDirectory(conn, filename, request, userdata); if (ret < 0) { release_request(noreq); - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(noreq)); + return(PyLong_FromLong(noreq)); } static PyObject * @@ -349,20 +349,20 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } noreq = get_request(); if (noreq < 0) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } request = check_request(noreq); ret = FAMMonitorFile(conn, filename, request, userdata); if (ret < 0) { release_request(noreq); - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(noreq)); + return(PyLong_FromLong(noreq)); } static PyObject * @@ -379,19 +379,19 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } request = check_request(noreq); if (request == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } ret = FAMCancelMonitor(conn, request); if (ret < 0) { release_request(noreq); - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(ret)); + return(PyLong_FromLong(ret)); } #ifdef GAMIN_DEBUG_API @@ -411,20 +411,20 @@ conn = check_connection(no); if (conn == NULL) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } noreq = get_request(); if (noreq < 0) { - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } request = check_request(noreq); ret = FAMDebug(conn, filename, request, userdata); if (ret < 0) { release_request(noreq); - return(PyInt_FromLong(-1)); + return(PyLong_FromLong(-1)); } - return(PyInt_FromLong(noreq)); + return(PyLong_FromLong(noreq)); } #endif @@ -446,17 +446,26 @@ {NULL, NULL, 0, NULL} }; -void -init_gamin(void) -{ +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + (char *) "_gamin", + "Python gamin module", + -1, + gaminMethods, + NULL, + NULL, + NULL, + NULL, +}; + +PyMODINIT_FUNC PyInit__gamin(void) { static int initialized = 0; if (initialized != 0) return; - /* intialize the python extension module */ - Py_InitModule((char *) "_gamin", gaminMethods); - initialized = 1; + + return PyModule_Create(&moduledef); }