Commits

Anonymous committed e85f6ae

تهذيب مصدر البرنامج وتحديث مكتبات sct.
يؤجل تبديل libmagic بـlibextracter ﻹلى ان تستقر واجهة extractor

Comments (0)

Files changed (21)

misc/announcement

+أنشئ تلاقيم لمحتوى الأدلة
+
+السلام عليكم ورحمة الله وبركاته، أخواني وأخواتي أعضاء مجتمع لينكس العربي، تحية طيبة أهديها لكم وبعد، أقدم لكم مشروع جديد وهو برنامج لإنشاء تلقيما\خلاصات مبنية من محتوى الأدلة\المجلدات؛ البرنامج يمثل كل ملف من ملفات الدليل كحدث في التلقيم جاعلا تاريخ آخر تعديل تاريخا للنشر. ما زال البرنامج في مقتبل عمره واريد أن اغيير فيه (أنوي أن أضيف له قدرة اشتقاق العناوين من صيغ أخرى غير الـHTML مثلا) ولكن البرنامج مستقر من منظور المستخدم (واجهته مستغرة إن شاء الله).
+
+صفحة المشروع: http://seininn.bitbucket.org/projects/pathfeed/index.html
+رابط التحميل المباشر: http://seininn.bitbucket.org/projects/pathfeed/downloads/pathfeed.tar.gz (لكل المعماريات)
+
+ملاحظات: 
+- البرنامج يسلزم ملفات التطويرية لـlibmagic، في أوبنتو الحزمة هي libmagic-dev، في فدورا هي file-devel
+- صمم البرنامج لكي يستخدم في الطرفية ولا واجة رسومية له.
+
+<صورة>
+
+طريقة الإستخدام موضحة على صفحة المشروع.
+
+
+أطرح لكم هذا البرنامج آملا أن يحوز على رضاكم وطالبا آراءكم ونقدكم ومقترحاتكم. أرجو من من يجد الوقت والرغبة أن يجربه على نظامة، فلم يتسنى لي أن أجربه على أنظمة غير تلك التي ذكرتها آنفا.
+
+أشكركم على القراءة وارجو المشاركة وادعوا الله ان يوفق الجميع لما يحبه ويرضاه.

misc/announcement.png

Added
New image
 END OF
 NOTICE
 SOURCE_TARBALL='
-H4sIAEzL+VIAA+w8a3PcNpL+uvMrEG5sD+V565WMNPZpJTlWrSW5LDnZlKyaokiMhmsOOUuQkieO
-PlzV3VXd/ZH7AVdX91eSf3PdDZAEHzMjK5ZTWzHKZQ3xaDSARr+ARqv94N5TB9Lm5jr+7W6ud/S/
-SXrQ7fU21zZ63Y31tQedbndttfeArd8/ag8exCKyQsYeiNiz3Inlz6u3rPyfNLXaUysajzh3WvZ9
-9YELvLGxNmf9Vzvdzppc/9X19c3NLqz/6upG5wHr3BdCevqDr397pcYgvdqRRNBnO0y4k6nHWRQE
-HhsFIQv5NOSC+5HrX7KRC0ViJiI+YfHUsSIuCAD9txNH4yDssxM1V6wuuOu7vm+yQ5znkUXV9qBV
-H/72Ot21Zqfb7H1D2bvHr37E7BPOmRVFlj3mDoNW0BV0XpN1Ah8KIvaI/SW+RMyCMBJ9KsL0A79g
-TTaOomm/3VZ9ty7c6CK23/GoFYSXbVtBgIHlC1T1FNb+xHI9gPYv41iMW3YwabBilQMhYpio0AIg
-YdZxJdx0n7VdbCXaPr+u1Wor7Vrtzw4fuT5nw1fHJwd/G+4OT47fvN7dh/npfNP59mVW4YqHwg18
-ZnRbnVbHgALXt73Y4WxbRI4btMZP81mee1HKu4B1zWdOrEvXxqwszxB2FIjW2MhnRe6ElzLH0cQr
-ZYooxDytFx6GfhHDmWhHsykX5Wxc93zuyPajAuKx78KA8nkSxfyYQ6Dc/Pi2YWYuuQ+ZrN1mjhv6
-1oTXau0VFvsw2cwdAeVBqxmsz5/dEeW92jl98Xx/f294cnpw9N2P6aqc/oUZbyMj/T56Cd8+fHNP
-8FytfB2s4TvuqFajBRhGbGJvAVUBQpTB7CB45/KtWg1GEAPJuv4oGIoPRH72GLjWCtLTMHIjD2oV
-cuPQK+VZtD9L2RwpfSvbxrII9lw4k8CHwABG7vutUil0kpZR4fODl/tsJYhx/bk1kS2Q4pgzgyl2
-aYAsywWKvggE38r1PIElHF6P3Yh7sL4ShutH8D+V2EHsRzouIohDmw9hFdUgbmiqAKUadSJxHcGu
-D8JZ/SpwHbYS+7HgTkNBwL1pqokNfBFpiOgdASeanq2dyyy1KEioLMGy8B9QUV12ZDLs4qxzzgas
-c4a/z7UWsOKXHJYfaZdZvsPcSz8IOdIlt4PQVTwWwWF3dWzfYI9EZLLBgDW7JnDCKA59NrKA5LbS
-yifDg5O9g9fQqCWi4SRwuJlWBey5hgIOFXCTlIhMvj6xG4S0mcH7CmuZ7EPKAEdT2FrRCDpwYHs3
-WFqAyQD0QyF6fbbv05rxEBg6SAWoCtz3esx95PMwpyRZjHzjKGDBFGo8fige99lDATtK4tPAmScQ
-dYktMRZA1zQVqpjKE3KTm28QLvY7HBQNXMDsu4JNw+DKdZAscP8HDVWLZN7EiuArWwiksFaeUvWZ
-IcJzfcyGadXQyJO5N4XSClBZXZTAdaR+F0lna4s9eeLqHaVrA7NiT6Z1CbVB4zKLFeVOUkhlFKCn
-C9i37/LZN7kvhfaTARJj6HFfdQmzn1//EoouUms2WKIJs6pDZJxaP92sNEOFxizHUkHTN7XcakdI
-axex6zns/cSDelzuMyJf0HQkVsC2pnFU2MPQev89ingiUmKH2DcKPZ0zUP6AHb15+XIrTyOK8bFH
-j5i+Rg0gcf4+aiMgI7dQCSwlWofAGob0gwrq2p68STA8tGYXMCLHYSDXuEQX6GYMO+5ZLakEY6Mx
-ANOGjQR6EwwcYEMlbSBYqA9DivKhNYW96NQfQXFDTlZRAJjz6yPGTxStUNuMYSdbljhr53yQSi2J
-RzIFUw71/WjIgZE4vK5qwxQ2W21DgRjBoiYlZkma6XKsep3K8o6WjDJMVmifIAbUNOTCtqZ8HpAG
-9aUjpHCshkITZqRjUvw1pU8pVht5VrlNvT41QKvIFYDKAYWEzNOH4qHYbsvfcyp6rv+OjQHpAfJc
-hooZ/WrPa+A6TxEo/JlTQRoIslbyu1TV2G5n+OdHhqmuT+Yz/aMP01SuT7PbnTO7EpiE0l9IlrQI
-c6AD5VUX9OZ1K2nQVPv+owArrXsYjuzV1dVvE1keESgJ+KzXOzc/dG7MXGOd5OTe0OYut2eIwrUM
-oMH5eyrL6pazermdl+PKN7r2bQnBQ9Lvkf+C+umTiLPCSztRyVbg40rpZKCWX9o28wJvNg2mbKVN
-uxZrF/SfblENk7DGIEiGEy6EdYmMFTRvQ03Sm5Od7/aLU36HhPq+oX1L1Qd+nB2/Oj04Pjo5/+0w
-P0XSYe5aoHhZHqhZERqVHgddLBSwCBy0UZ+HUITmgSoX/dvi2Tzty4ZSkC1Nr/k/YhdVw0Uw3yiY
-b16/vM04bwVzR8GUZtGngbmvYJJNtRzPPT6yYi/qMz/wk6kqwdzrsz20BNB8QWVFrk7EUa2RvY3C
-YFKGiT4Bvxrmp0glPA/77PDgcL+JkoOlquzc9imelpfOVAnm8z577pI3il2HbkQ/FiR97CAuK2F+
-iqTDPJngACp2EYm1pdunEiamJgxDgpAbSSkfc9OtaMnpJzYXzqTSTb0ZczigPUHXBFk7ydbVYM7H
-M07wJM1yCZa320efIukwm99LXV+kPjRU//l7dz55Lod5RcaZcmEwNK9/O55jgokC606wNJh5k6qW
-elFs3aMBdoA1ESgTT/tv+jv9/f5h/3l/rx/14/7Yufre0AQqylywF3jsOnVyPHQWuQKM07G0qC+h
-BybGQQzGlx9EDAyVMIb5FywMgqjFdi6CEO2SFuBcNuC7JeMdGAuQJuhUA0AGNlddag2oLqCpgeMx
-za8GqBVk2IlrF8x30JeKFrFtwdI9Pn3cLylepBJmDjaYI+gMermVySzBvlkIVpo4Hw10pwKoBlUJ
-szsA3l8MWEq0O8A9nAs37/NYALvCjZEHQr4EcpBUViw4Uap6P3PPlW9ljncHKiDRP+4/rvKqLBgX
-NcRe5zaCbvMjqR7FTTm3nDV3GZ5XEWMyVMXEzPI2RqlLbgPpHUGpgUYhuePkcpllbPPmKjrA0JdX
-l/URqFHVSHp09JbzZrqE5W7KXjSn4SIMMU2lF9GoQgZTngXp6SOmfW8eD8iszbtsqmge2Ao3xh3A
-O/PAJ96sj3AfSojxYoQzR9Jd0L2aBzwRzvPQvcUGyMl3waO8mFqK2vcVqME+EnWliFTAUnTXqQI3
-ngdOt3E/EuazOZyB3JXjsC6FKhjmlf5kTGrSWDZrh64QyDVgHWM8viUW3HxoJ3wD/lVgWd5X5Aq+
-badv/Hd+cO0nuvgdupu/5SsW2FHKcaluGTNN/wlsOw6fsTqix0xEsITfTVHn0dzRK+zAd9Fud3+y
-okSRvYJPhz5TGK/5aMRDZNdhom/jWvAJKsHWRXDFW1R3pZ34h3fxsIOc3GMLnTK+45LFmSyhNGpE
-PJ16Lndaee/p/P1jJ2CRAjKoyizKdpM6kLR8ezZMqw2p9dk352c9dWBWXaFzLj2qBaVtS1uTee3I
-V2g0T41F8Lsl+Oipzq35vHYK/puF8Hsl+Oqsdgn8Xgp/ZyH8VR1+6ex2YTsFP07gF1Upts3WNM3p
-q2pALiKw0F54KPAILiHWFl0DUebQKA7xmAKNVNBBRYt29dx+Ur9keUPnzwBTgpe0aHlCHQrhKSDm
-qw2eHfqV1JOSoiP9DvmzXTfZsAjTcy9CC490qa+AxiXiC3mlRtx2UxVB0klotpcI1/rETk90Sf06
-3PnuYHd48uPhy4Ojv/4sv9BhMzz98dW++j46Hu6+2N/963D/aPd47+DoO9PMrxrKGiPpERYBjDFH
-nqApjDitjsR0yUJI3LzAcui0uXhQojO9lwF2dxLRuRWea+nMS03084O/He5nbiJYB/JlINOVy5Is
-CLZPzv7ItsOlEFE8GoGA54nzFgjPigKwXafcTsznvO027xQoqZIbUtmeXNicKs0BkNp4CyHIWnkQ
-CWVlFp1ZYeItBEuVyot1C6Klb5IE6LMccwvyM5pNqheOupix/QzPbJW6NHiLl5/eGoyOAgEYZMA6
-N795azzLny0Z29QNtPUFVFJ3s66vr1vXq3Qxq9fprLd3YIXfGsWWc0629DOyt8CwAI2Qe/BTcG/0
-1mgXaydHb5UHb/OPx7JDoDw13T5bEk/m/SicIeFHnRawdISk7dglqyLJ6+k23pyiIdAPo1EkwEWk
-Nx86VSCw8pfRKNLpUrJpKwxxSkvDwiOr3DTqZ1mFiawuyo2uUKYjSP/RdRC8uxOLnC2SCRXt8JF9
-QCb1GvYHHZ0zco6Qi588+ulIpMbk+miW60fat9yOXN3IkccEaN60WgUnnPK1XfIICJ/XH1FfQDMC
-2PwwYihqGVBNQ8Iw2VfyNC6vr8NYQj4BhZNZzOfXCAnRU5dKc1XLfhror+iZkVmDweO3fqUrJqlR
-7Q5aer8FFQNQTF0HtWc8YHFDmH7C2hKUI5dK3s5C1SPXfN6KVltYxYNnEtieF9j19GAaBmM+6ZnL
-bK9sXfHcIxixCcx5OKu2VjGh87vevZVVhHbgdFbEtSFneo4np1D5bM5Be7MrvWrtuV61jwFUteA3
-C9Za7chHg8IdQdxL1cNTGz1fkAGtLM6Yg4avrgcVjNxb7N0otEgggjBVV+Oq4WuDJLEeiOG15b0r
-L2Vu/Il0Z0WlWal/223kclJWFVRgXQGVHS9U+ndQ277w+IRdw+bi2j1ByXqg1ObSk4CsUBRuCerJ
-IA6Jnr8We46Sf2LNkgMHO8Ar7RGXlsNcEMVpeVb47hvE5wwzXb30ctVe4HNNp7U9WDe8k1gQfpmp
-8FViK8DqytqVE3lb3Sp1017EaPcTW0cwmoE9GnmxGFd3c4seHBhhBizzJ93Ufu8Yhi/p7qnVPrTe
-cbST7q+PxfE/nc7mRjeN/+p1NzH+p7PZ/RL/8znSn9mJDPeZABmowB4tgGenlUTusF/+59d/+/W/
-fv33X/771/9g8Od/f/m/X//11/+s1YBH/x0UoUES4JJkKA15UAGsVvPcCxBHA/mnLaNNbJZ9UhiH
-nkFRJnoGRpjYNaRcMchi2FhN2pVioCJYWBq2wtJYFZYEqNQEqNDcGTQ9Ytu1mm0PLm275vCL+HLQ
-vKwB9xvY3fe165FnXQrQbn8A7Qy4ftJhv/anr+u2bbIm1vwauSX8Pl5lzYB9XVcTYcJPwhOKDuQA
-IEf+wDKJhFn7k+y3EubXdSrDHxIX805d1IrMutVWM3qPNHbb+M9ud6MLNjns/97G5tqX+M/PkdL1
-TzfHp+9jCf/vIrNX69/Z6GL859p6b+0L//8cqb0iVVi1/H32RvBR7HnsxenhS/Ya9EQwfKVbeklU
-5/fqYlW33+l3KUfGeaZRniqTY2QAaPoz8mv0FS/OlF26NwT/LHRJxCCZwJYlq9uOgFR/Al3e84Dj
-QVdbKk9Vp9Y+D6948zrk6Nj3ZmCd8NHItV3Lj5TrfcZ+CoKWDLxUkX0nu6c43OGLND4vy1kWPJkG
-Xtb4e7BcfBUCl7hQ7cAfuZdDYt5bSRX0cBQqKPfm2er5FkghGdZWHf+hzsmA2aPDDdTxfO1CqIQq
-TG5V8/c2lwdvpYaas3dRoyRo8fcm3C/pkySd/5NGdQ99LOP/a6sbKf9fk/x/dWPjC///HEnF/8vV
-16L/ZdB0woJrSwQAeU8SRt/9NicPOq1ugbkroMS0MRANOTxSYWQTW17OcKvC2svR72nUd8qRMTJN
-Z8ip17wG06Bc9OFePFUMcCVIOKBIgoPpK9QPWcsuW2E+6ebdtStByT8/Lz5VuVrDBhPK00KNw5zX
-RUXUoAiTWOeC7hYjj3e/k/NEEIncp0NrQry+EpjP8L++kT9IxjaIBJfjRNBQ/8nc8VKgcnm6NadS
-ubDBjGPdcV1xF7g0WQW/Kc1UNr6bdAQ0SrqvvEJ1lJcY59qKaDjCrJrgP4CQ0/k/msv30cdS/093
-M+X/66vE/3vdL++/fJak6f+ByLT/4ylGGKEEOJFvvfxulsASYaHr8McneQ2evj9af084aiAKynu5
-IHm9olZQ7HM1MrVeA0CHMJIhq8dHGrLj+srY8h2Ph6Z6qGJqzfCCTO6ligbLlf0WrVzf/9JN9ulp
-bNn+X19L/T+d1TVp/3e/6H+fJRX2/6ErbO55ls+DWDB6j+Qedv7td7e+vU/xqlpug6ucitd/ips5
-kqEV821xvUK1LV66QTOMWJTYyBfx6AyPO12b9SgI+p/FTC75/+7BAFyy/9c3N3uZ/2+1R/t/9cv+
-/yzpD+v/S/tTZ/jNZlN2f7x3nFoU+KKKsHw3moFdISLBPBhSmLs/QB9H8eUl1x+iUzzq0gsuLI9d
-WaFrXXhc0AWnJLhecps4pHv7DXp4ii4dxXTdQT4vJZ7d8oW4Crv3DiZzqh/95kfalrzSVn4MTn80
-TjPZS07U1JJe6ESFWh+6DdZpsO5NyaF6axfph+R2B/lEMAaCLqZYETsAQuP0UhTeX2kxJ+DCfxzR
-mvJwgteP8dpwiz1332tEI3sICvf1Mktb65tlv+nJCq0q3ZLbWhFbT56IotldXxHsKVi473sdfL4G
-vrbhYxVM3+T9oXFYz0A30D1QiolNJFry1FmShK/sdyhssDW8tP/w4XuDgBRq5p8BCvDWIDSqvDNF
-VnxVg+RqKl4yxPXp3ORuTSlbna7b39zFmX3vywsTM41y7+0hyxu66HMx3hqPt58+Mkql0PyM6Nf4
-RxxEMLmGNQ0E/vXo61LmTabGzT2QD+ArHUJIJwpbRSR3IKBNGkjnpkAc0u9CRGQ8Kt5P1EvTCQG0
-mgqb8wX1ja0StM9LiDTJNx93gpOSISyze0FvXThBn9lxGAJJggwLueWA6ECpTAENuCL0opngVoiP
-0rXYXsDcKA04sVAcyvtd2bJD/o4ngqKc8dwJUQSK25AzIHeQ6WzCo3HgsPq1C51ecIZROVeuZ8nX
-0v4u8L3CU9Cg8T1WQNJMHYojh+I3uV9PxgfTBQZrqD87gKTR66yvnmdORmxXvDys3IglEVAkN82r
-WKpLUYGWnNUsNhg/1DNpMgIkfWEwwzp9ZZBklVlJMWrlM1auCMKW3lIHhkXk1gBJvd4z1SOZOK7Q
-/gzjRRRYei3yo8aIKYmP7hsfM3hc3NDWLuPKdacrjiMnmQON68E+Qy6CoT1aA/qWrAj+qe0tIyqM
-wiXTMHsBsEqo1gug6BOAPTVMs6IhFT8ZdHUHOKBYbr9d3b6Ive/E06QNwGlKhAtIKr6qqsmb7T//
-TPyWXOzUJneTFu8U66AWrAjxNVWmpvkmuQiU2n/IXe/pCfAl9t/qxvo62n8bm53e+hrd/1nrrH65
-//FZUvK2sAfC6UNyKpJksBUfuKSuoQhUZ26yJ4mx1gqJ6R3HqZcyG1kz84M6anwRXCNvigXPzKUD
-P7GKGmwWxKR9sdMfjkEkuj69p0SvxUqJFaGBOIp9OxfvDJanhCqlH0hPgVINNi4ajzLO0hVaRIeP
-8fygimGOxDWFdT127XHyZg1IP3zBF6GDDWZ5IJBx86XtqI+j49MXB0ff0VZrpXAy5MJLUvomVogv
-hQ/SGZNaoiExkqabzmzTH6ck7lFPnbGpJeQ41OTQjF27YizDMPFlPWaNoKDFjgJ6JcyKMkiyAp3t
-uo4cAEwL3pPPFA6M8Q5C1IbrF9y2cFIP2Ni64qgDZ+qS/qovIBfFMiD9msIrExUa9JKWWR5QaSZk
-BobKc5BnTjYZ8j1sqk0DxmdLGUYzkwp01j2/BUwgmXApyG4CspeBJOsbf0CLF+SYl28m4OMuY5zB
-pppPtOD9AOObmI+KGlGXnIFU+2LyiS15roIVKvYb5JbkF8HKTpndn3gw0veamT99lYE9vZyKmuCw
-G0xn0ptCc6HvbF3eifKhNuzg4jFvVUfq/FqQbqFLuQSDg5EMA6NFSrssPp+M382nyH0Ak2xSkiK1
-xrKG6p5lsu5DsXIGQZsOCQHQZCiot2qlfjM5qoSnfJkZZCcdv+DXcymGC2zPLHHSFQx3u5LAVFCd
-VhETlqthFSKHUjzNpZOQtkFo6brc4PWGFOVTLqJ6anSgW4v0f49b70SZICcz1ZWyZ4P/b+/ampvG
-ofB7foXwQhNg7ThpS2YDdF+WneEB2IE8LcN03NhNvMRxxk6yZID/zrlIsq24TknbbGdW58GT2Mey
-bpaOjz6dL4snOAqWWladwj6zKWWM3sAND63ONFbj2tU6yWa3Dtqtu7XifLfOMk1IqapWLZ9sKr5a
-aqy64AVgWLOe2VY6bXW51GnpyJuqVI51t1JZeSyhHlvY7dsQY/3/TgzAHfbfSd8v8L+nz57R+r9/
-bO2/Q8i9X/8/5EoAHtQ6AOegvBjwJsrzzQPBeyRhEibDD1cIaGnA4+wuYs7nmKxLzMwknsAj47FA
-53VhYgYxB5RPwbBCX5MnuWD287vjXuT5cjc7yk8g6raXEeoYXDR6otaRr934BphCT65XYir0LvkG
-SIXh5K+HVzBlxP7YCu2dw5YOo3FGjmKyn4MvYbTA/fnaASzVMCqKjBcG1chkQx0ZTOYxulWSOI/X
-bP798fq9eBJehs/Lcy83p2RZ4StUgmxdiR5QuA+2ariCtTOuwXz1EiZEZJeBYsTzIqCfyffRCbU/
-D7LE1AN1SL/t5vv2rQZD0+DIMjR/3z41LCJK1QX7q2cI2e27q2cIUUFGOa4tO/OwBqA+qhXAPQfs
-WYrUYKI8DWeyVKvUc5Oa03WuoUV5dM/Cc7kfQOkXN9Yw1ejGQz4ZnVSZUqbaVD/b0NJ3KFM2HIvU
-jQ1OFOoPaPbU34K0XfG8HMKvSgVSS3WzXQTFwFGpM6hoz9H+ttrLnlMbf6Ehw/WZrma80kqyYo5e
-CjlKdfTwdGUtHlU29etmlAlgP1MAse2H10TWu/bjjYAHVYXSa0ReX/XeVD6lsjV9SN2JTWvl+rKF
-/zs8/qdf2v/p9weM//FPrf1/CLnH+D/SZBDgDvhLM/tfI86ldSVCsJiiGiGChhG6H15QaCvzQzRe
-ZYg3yuL8syfe0K78VcbuZqj3FJ58OUv/VU5buWbsqfvfwrnllBb+8uASqp595hMijCmbmMsESZGS
-SDq+ut3i/D98iq5C8fje86xzhNnvaD2M/vT1q//9e9nNl5cRIs4j/yR0H/l9PozwMNSHv8Fc44e4
-Z8vkfBMF2dPeb77fEKClSYqUknT+tHfzVMJgc+NEpunKpMXbIye44H/DNPJoXJ2AoYFwBjb3/93F
-BpBd+O+T49Ni/x+e750cD+z630HkXu7/05DvD6P3VcQ3n6gfyw3It7nB7Pk1N8sV2O3/g23qdYkW
-0cvvZOcXy474H73BYFDE/zmm+D8938b/OYj88qB7Ec+7F0E+bbXCaIGuqySfdJRJEo2nqXBKrlo0
-OpIoWg7Fw55TUnnYl/+QU6dHGLhgKc44Hhp6SL2xePHi1bs/a4mnNQ2c9LcVjMi3EcK4MvFRyDLM
-R2sKhSZiOYp9BJ//RfmFg+fhQ7hLQcs/R45oUyLv5qB1EcMgKCM2/ypiZgFHYEE6A9MMxs1hMV0H
-i6WL5L7xHDoagunwdXOjnAjVg5lKNItCXKZvTFSnuVklYpKlq4VKFBpoHc3SBUXaH8EolzutNhij
-WAg3FaNRpRlktCOzxI4QTusVASVUfOd2DhpFyhRhiKLAYy+QD0eGuDliEDLFC48Yd3hwS6FmMSi/
-mDLsIxhjPD8sWOLhWjDc184itlKHTruYKW5c0aoMLpRg71rWFYxFd59wF6eq/fhRuF+wZj99QmRs
-luBvqFHZ/+F/qcqR4hu6mJujRvnFer0UOBEFWc6wFsWXBD8nqVwfmMTriDAegYApKuSvsmGn9dcs
-QiiCIrRfxwGjQjgiVE7rDYqbXpFKecZL+l8PP1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1as
-WLlF+QHChtmBAKAAAA==
+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
 '
 
 declare -A GLOBAL

package/pathfeed.sig

Binary file modified.
 project=pathfeed
 project_author=Sulaiman A. Mustafa
 
-libsct=libsct/sctos.c libsct/scttime.c libsct/scthtml.c libsct/sctstr.c
+libsct=sctos.c scttime.c sctml.c sctstr.c scta.c sctframe.c
 files=pathfeed.c 
-headers=sctos.h scttime.h scthtml.h sctstr.h
+headers=sctos.h scttime.h sctml.h sctstr.h scta.h sctframe.h
 shared=-lmagic
 
 cc=gcc
 wflags= -Wall
 
 
-pathfeed:
-	$(cc) -std=$(std) -O3 -o $(project) $(files) -Ilibsct $(libsct) $(shared)
+pathfeed: pathfeed.c
+	$(cc) -std=$(std) -O3 -o $(project) $(files) $(libsct) $(shared)
 	
-debug:
+dev:
 	$(cc) -std=$(std) $(debug) $(wflags) -o $(project) $(files) -Ilibsct $(libsct) $(shared)
 
-
+memcheck: 
+	valgrind --tool=memcheck --leak-check=full ./pathfeed -d -D ../test/example.dir -T title -U http://example.com -A me -u stub > /dev/null

source/pathfeed.c

 
 #define _POSIX_C_SOURCE 200809L
 
-#define version "1.0.0"
+#define version "1.0.1"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>
-#include <magic.h>
-
-#include "sctos.h"
-#include "scttime.h"
-#include "scthtml.h"
-#include "sctstr.h"
 
 #include <errno.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <time.h>
 #include <string.h>
-
 #include <libgen.h> // dirname
 
-/* undef if stingy*/
-#ifndef PATHFEED_STINGY
-#define TB "\t"
-#define NL "\n"
-#else
-#define TB ""
-#define NL ""
-#endif
+#include <magic.h>
 
-magic_t mc;   // magic cookie;
+#include "sctos.h"
+#include "scttime.h"
+#include "sctml.h"
+#include "sctstr.h"
+#include "sctframe.h"
+
+
+magic_t mc; // magic cookie
 
 struct info_s{
     char *feed_title;
 
 bool entry_factory(void *unused, char *path){
     const char *mime;
-    char *temp[4];
     struct stat st;
     
-    
-    
-    if (unused) path[0] = 0[path];
+    if (unused) return false;
     
     // get mtime and ignore direcories
     if (stat(path, &st) == -1) return false;
     if (S_ISDIR(st.st_mode)) return true;
     
+    // magic init
     mime = magic_file(mc, path);
     if (!mime) {
         fprintf(stderr, 
-            "dirrss2: Encountered an error when attempting "
+            "pathfeed: Encountered an error when attempting "
             "to open '%s': %s\n", path, strerror(magic_errno(mc)));
         return false;
     }
 
     
     // then build xml tree and print to info.output
+    char *title_raw = NULL;
+    char *title_escaped = NULL;
+    char *title_prefix_raw = NULL;
+    char *title_prefix_escaped = NULL;
+    sctframe_t *f = sctframe_new();
+    if (!f) {
+        fprintf(stderr, "pathfeed: frame allocation error");
+        return false;
+    }
+    
     
     
+     
+    // add libexractor when it's API stablizes
     // Extracting title if html
     char *title = NULL;
     if (info.dynamic && !strcmp(mime, "text/html")) {
-        title = scthtml_get_html_title(path);
+        char **tags;
+        tags = C(f, sctml_get_tags_from_file(path, "title"), sctml_free_tags);
+        if (tags[0]) title_escaped = C(f, sctml_strip_tags(tags[0]));
     }
-    // Maybe add libextractor here?
+    
+    // only apply title prefix if no title was found
+    if (info.entry_title_prefix && !title_escaped) title_prefix_escaped = sctml_xml_escape(info.entry_title_prefix, NULL);
 
     // putting url parts together
-    char *url = NULL;
-    sctstr_append(&url, info.entry_url_prefix);
-    sctstr_append(&url, path+strlen(info.source_dir));
-    temp[0]=url;
-    url = scthtml_percent_encode(temp[0], "-./");
-    free(temp[0]);
-    
-    char *title_prefix = NULL;
-    if (info.entry_title_prefix && !title) title_prefix = scthtml_xml_escape(info.entry_title_prefix, NULL);
-    
-    temp[0] = scthtml_xml_escape(url, "");
-    fprintf( info.outstream,
-            "<entry>" NL
-            TB  "<title>%s%s</title>" NL
-            TB  "<link href='%s' type='%s'/>" NL
-            TB  "<id>%s</id>" NL
-            TB  "<updated>%s</updated>" NL
-            "</entry>" NL,
-                (title_prefix?title_prefix:""),
-                temp[1] = scthtml_xml_escape((title?title:path+strlen(info.source_dir)), ""),
-                temp[0],
-                temp[2] = scthtml_xml_escape((char *)mime, ""),
-                temp[0],
-                scttime_rfc3339(st.st_mtime, (char [22]){0})
-            );
-    
-    free(title_prefix);
-    free(title);
-    free(url);
-    free(temp[0]);
-    free(temp[1]);
-    free(temp[2]);
+    char *abs_url_raw = NULL;
+    char *abs_url_encoded = NULL;
+    char *abs_url_escaped = NULL;
+    char *rel_url_raw = NULL;
+    char *rel_url_encoded = NULL;
+    char *rel_url_escaped = NULL;
+    
+    rel_url_raw = path+strlen(info.source_dir);
+    
+    sctstr_append (&abs_url_raw, info.entry_url_prefix);
+    sctstr_append (&abs_url_raw, rel_url_raw);
+    
+    abs_url_encoded = sctml_percent_encode(abs_url_raw, "-./");
+    abs_url_escaped = sctml_xml_escape(abs_url_encoded, NULL);
+    
+    fprintf( info.outstream, "<entry>\n");
+    fprintf( info.outstream, "\t<title>%s%s</title>\n", 
+                                        (title_prefix_escaped?title_prefix_escaped:""),
+                                        (char *) C(f, 
+                                            sctml_xml_escape((title_escaped?title_escaped:path+strlen(info.source_dir)), NULL)
+                                        ));
+    fprintf( info.outstream, "\t<link href='%s' type='%s'/>\n", 
+                                        abs_url_escaped, 
+                                        (char *) C(f, sctml_xml_escape((char *)mime, ""))
+                                        );
+    fprintf( info.outstream, "\t<id>%s</id>\n", abs_url_escaped);
+    fprintf( info.outstream, "\t<updated>%s</updated>\n", scttime_rfc3339(st.st_mtime, (char [22]){0}));
+    fprintf( info.outstream, "</entry>\n");
+    
+    
+    free(abs_url_raw);
+    free(abs_url_encoded);
+    free(abs_url_escaped);
+    free(rel_url_encoded);
+    free(rel_url_escaped);
+    sctframe_free(f);
     
     return true;
 }
         return 1;
     }
     magic_load(mc, NULL);
-    
+
         
     /* Logic Starts here
     */
     //FIXME write to outfile not stdout
     // here print title and stuff see dirrss or atom spec
 
-    info.feed_url = scthtml_xml_escape(info.feed_url, NULL);
-    info.feed_title = scthtml_xml_escape(info.feed_title, NULL);
-    info.feed_author = scthtml_xml_escape(info.feed_author, NULL);
-    if (info.feed_email) info.feed_email = scthtml_xml_escape(info.feed_email, NULL);
+    info.feed_url = sctml_xml_escape(info.feed_url, NULL);
+    info.feed_title = sctml_xml_escape(info.feed_title, NULL);
+    info.feed_author = sctml_xml_escape(info.feed_author, NULL);
+    if (info.feed_email) info.feed_email = sctml_xml_escape(info.feed_email, NULL);
     
     if (info.verbose) fprintf(stderr, "printing feed header\n");
-    fprintf(info.outstream, "<?xml version=\"1.0\" encoding=\"utf-8\"?>" NL
-        "<feed xmlns=\"http://www.w3.org/2005/Atom\">" NL
-        "<id>%s</id>" NL
-        "<link href=\"%s\" rel=\"self\"/>" NL
-        "<title>%s</title>" NL
-        "<updated>%s</updated>" NL,
+    fprintf(info.outstream, "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+        "<feed xmlns=\"http://www.w3.org/2005/Atom\">"
+        "<id>%s</id>" 
+        "<link href=\"%s\" rel=\"self\"/>" 
+        "<title>%s</title>" 
+        "<updated>%s</updated>" ,
         info.feed_url,
         info.feed_url,
         info.feed_title,
         
     fprintf(info.outstream, "<author><name>%s</name>",info.feed_author);
     if (info.feed_email) fprintf(info.outstream, "<email>%s</email>", info.feed_email);
-    fprintf(info.outstream, "</author>" NL);
+    fprintf(info.outstream, "</author>");
         
     free(info.feed_url);
     free(info.feed_title);
         status = sctos_walk(info.source_dir, entry_factory, NULL); 
     }
     
-    fputs("</feed>" NL, info.outstream);
+    fputs("</feed>", info.outstream);
     if (!status) {
         fprintf(stderr, "A problem was encountered while processing paths "
                         "from '%s'. Feed may not be complete.\n", 
+/*
+    scta: Dynamic Arrays Module 
+
+    Sulaiman (seininn) Mustafa     2014-02-17
+    Version 0.1
+    
+    This module is a part of libstc, but can be used independently.
+    
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#include "scta.h"
+
+
+FILE *scta_config_debug = NULL;
+int scta_config_version[3] = {1, 0, 0};
+
+/*
+    internal array layout
+
+    +------------------+
+    |       SIZE       |  <- internal pointer points here
+    +------------------+
+    |      LENGTH      |
+    +------------------+
+    |      RETURN      |  used to be used for return status, might remove later
+    +------------------+
+    |   ARGUMENT_INT_1 |  argument regesters for functions to avoid multiple 
+    +------------------+  macro argument invokations. unfortunetly, the array
+    |   ARGUMENT_INT_2 |  argument must be invoked more than once. (that, or
+    +------------------+  use statement expressions wich makes this non-c code)
+    |   ARGUMENT_PTR_1 |  :
+    +------------------+  :
+    |   ARGUMENT_PTR_2 |  :
+    +------------------+  '
+    |     ELEMENT_0    |  <- external pointer points here 
+    +------------------+
+    +---------:--------+
+    +---------:--------+
+    +------------------+
+    |     ELEMENT_N    |
+    +------------------+
+    |      STORAGE     |  (same size as normal array elements)
+    +------------------+
+    
+*/
+
+#define ERRMSG_AND_RETURN(RET, ...) {\
+    if (scta_config_debug) {\
+        fprintf(scta_config_debug, "scta:%s():%d: ", __func__, __LINE__);\
+        fprintf(scta_config_debug, __VA_ARGS__);\
+        fprintf(scta_config_debug, "\n");\
+    }\
+    return (RET); \
+}
+
+
+
+// XXX EXTERN SHOULD NOT APPEAR IN THIS DOCUMENT
+
+bool make_space(void **ra, int at, int count){
+    // makes a space inside *ra, and moves everything (including storage) to the right
+    // count is the number of elements to remove and has nothing to do with size
+    size_t size = SCTA__INTERN_SIZE(*ra)[0];
+    int length = SCTA__INTERN_LEN(*ra)[0];
+    void *temp;
+    
+    if (!size) 
+        ERRMSG_AND_RETURN(false, "element size can not be zero.")
+    
+    if (length == INT_MAX) 
+        ERRMSG_AND_RETURN(false, "cannot increase array size do to int limit.")
+        
+    if (!(temp=realloc(*ra, (SCTA_HEAD)+ size*length + size*count + size))) 
+        ERRMSG_AND_RETURN(false, "memory operation failed: new size is %zu", ((SCTA_HEAD+size)+size*length+size))
+    *ra = temp;
+    
+    
+    memmove( ((char *) *ra) + SCTA_HEAD + at*size + size*count, 
+             ((char *) *ra) + SCTA_HEAD + at*size, 
+             (length*size) - (at*size) + size);
+    
+    
+    SCTA__INTERN_LEN(*ra)[0]+=count;
+    return true;
+}
+
+bool collapse_space(void **ra, int at, int count){
+    // removes a space from *ra, and moves everything (including storage) to the left
+    // count is the number of elements to remove and has nothing to do with size
+    size_t size = SCTA__INTERN_SIZE(*ra)[0];
+    int length = SCTA__INTERN_LEN(*ra)[0];
+    void *temp;
+    
+    if (!size) 
+        ERRMSG_AND_RETURN(false, "element size can not be zero.")
+    
+    if (!length) 
+        ERRMSG_AND_RETURN(false, "cannot shorten a zero length array")
+        
+    if (at < length-1) {
+        memmove( ((char *) *ra) + SCTA_HEAD + at*size, 
+                 ((char *) *ra) + SCTA_HEAD + at*size + size*count, 
+                 (length*size) - (at*size + size*count) + size );
+    }
+    
+    if (!(temp=realloc(*ra, SCTA_HEAD + size*length - size*count + size))) 
+        ERRMSG_AND_RETURN(false, "memory operation failed: new size is %zu", ((SCTA_HEAD+size)+size*length-size))
+    *ra = temp;
+    
+    SCTA__INTERN_LEN(*ra)[0] -= count;
+    return true;
+}
+
+
+void* make_raw_array(size_t size){
+    void *ra;
+    
+    if (!size) 
+        ERRMSG_AND_RETURN(NULL, "requested array member size is 0. minimum is 1.")
+    
+    if (!(ra = malloc(SCTA_HEAD + size)))
+        ERRMSG_AND_RETURN(NULL, "could not allocate enough memory: requested %zu", SCTA_HEAD + size)
+        
+    memset(ra, 0, SCTA_HEAD + size);
+    
+    /* debugging macros
+    fprintf(stderr, "base %p\n", c);
+    fprintf(stderr, "size loc %p\n", SCTA__INTERN_SIZE(c));
+    fprintf(stderr, "len loc %p\n", SCTA__INTERN_LEN(c));
+    fprintf(stderr, "MTS: 0x%lx (0x%lx, 0x%lx, 0x%lx)\n", SCTA_HEAD, sizeof(size_t), sizeof(int), sizeof(bool));
+    fprintf(stderr, "len loc %p\n", SCTA__INTERN_LEN(c));
+    */
+    
+    SCTA__INTERN_SIZE(ra)[0] = size;
+    SCTA__INTERN_LEN(ra)[0] = 0;
+    
+    return ra;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Macro functions. Dont forget:
+// -- to differeantiat between internal functions and macro ones and:
+// -- convert arrays to raw arrays and vice versa when nessary by sub/add SCTA__OFFSET_HEADER
+// -- functions here must not use EXTERN functions for concistancy.
+// -- arguments are stored in the array itself. the specification of this is in the function's comment
+// -- arrays passed by macros are in there normal form and not raw form
+
+void* scta_macro_new_(size_t size){/**/
+    void *ra = make_raw_array(size);
+    if (ra) return ((char *)ra)+SCTA_HEAD;
+    else return NULL;
+}
+
+void scta_macro_free_(void *c){ free((char *)c-SCTA_HEAD); }
+
+
+bool scta_macro_set_length_(char **z, int newl){
+    void *ra = *z-SCTA_HEAD;
+    int oldl = SCTA__INTERN_LEN(ra)[0];
+    
+    if (newl > oldl) {
+        if (!make_space(&ra, oldl, newl-oldl)) return false;
+        memset((char *)ra+SCTA_HEAD+(oldl*SCTA__INTERN_SIZE(ra)[0]), 0, (newl-oldl)*SCTA__INTERN_SIZE(ra)[0]);
+    }
+    if (newl < oldl) {
+        if (!collapse_space(&ra, newl, oldl-newl)) return false;
+    }
+    
+    *z = (char *) ra + SCTA_HEAD;
+    return true;    
+}
+
+bool scta_macro_insert_(char **z){/*
+    inserts an element in an array
+    
+    INT1 : at
+    STORAGE: what
+*/
+    void *ra = *z-SCTA_HEAD;
+    
+    
+    size_t size = SCTA__INTERN_SIZE(ra)[0];
+    int oldl = SCTA__INTERN_LEN(ra)[0];
+
+    int at = SCTA__INTERN_INT1(ra)[0];
+    
+    // if negative indexing: normalize
+    if (at < 0) at = oldl + at;
+    // if at is larger than length of array, set to insert to length
+    if (at > oldl) at = oldl;
+    
+    
+    if ( at < 0) 
+        ERRMSG_AND_RETURN(false, "inconsistant paramiters:\n" 
+                                 "\tlength: %d\n" 
+                                 "\top index at: %d\n", oldl, at)
+    
+    if (!make_space(&ra, at, 1)) return false;
+    
+    memmove(    ((char *) ra) + SCTA_HEAD + size*at, 
+                ((char *) ra) + SCTA_HEAD + size*(SCTA__INTERN_LEN(ra)[0]) , size);
+    
+    *z = (char *) ra + SCTA_HEAD;
+    return true;
+}
+
+bool scta_macro_insert_array_(char **z){/*
+    inserts an element in an array
+    
+    INT1 : at
+    INT2 : length
+    PTR1: pointer
+*/
+    void *ra = *z-SCTA_HEAD;    
+    
+    size_t size = SCTA__INTERN_SIZE(ra)[0];
+    int oldl = SCTA__INTERN_LEN(ra)[0];
+
+    int target_length = SCTA__INTERN_INT2(ra)[0];
+    void *target_addr = SCTA__INTERN_PTR1(ra)[0];
+
+    int at = SCTA__INTERN_INT1(ra)[0];
+    
+    // normalize index if negative
+    if (at < 0) at = oldl + at;
+    // set after last element if index is larger than array length
+    if (at > oldl) at = oldl;
+    
+    if ( at < 0) 
+        ERRMSG_AND_RETURN(false, "inconsistant paramiters:\n" 
+                                  "\tlength: %d\n" 
+                                 "\top index at: %d\n", oldl, at)
+    
+    if (!make_space(&ra, at, target_length)) return false;
+    
+    memmove(    ((char *) ra) + SCTA_HEAD + size*at, 
+                target_addr , size*target_length);
+    
+    *z = (char *) ra + SCTA_HEAD;
+    
+    return true;
+}
+
+
+bool scta_macro_delete_subset_(char **z){/*
+    deletes a subset that starts at `at' and has a length of `length'
+    
+    input
+    
+    INT1 : at
+    INT2 : length
+    
+    output:
+    STORAGE fist element in deleted subset
+    
+*/
+    void *ra = *z-SCTA_HEAD;    
+    
+    size_t size = SCTA__INTERN_SIZE(ra)[0];
+    int oldl = SCTA__INTERN_LEN(ra)[0];
+
+    int target_length = SCTA__INTERN_INT2(ra)[0];
+
+    int at = SCTA__INTERN_INT1(ra)[0];
+    // normalze if index is negative
+    if (at < 0) at = oldl + at;
+    // set index BEFORE last element if larger than length (so that the last 
+    // element is deleted
+    if (at > oldl) at = oldl-1;
+    
+    if ( oldl < (at+target_length) || at < 0) 
+        ERRMSG_AND_RETURN(false, "inconsistant paramiters:\n" 
+                                 "\tlength: %d\n" 
+                                 "\tdeletion starts at: %d\n" 
+                                 "\tand spans %d element(s)\n", oldl, at, target_length)
+
+    
+    memmove( ((char *) ra) + SCTA_HEAD + size*oldl, 
+             ((char *) ra) + SCTA_HEAD + size*at, size);
+    
+    if (!collapse_space(&ra, at, target_length)) return false;
+    
+    *z = (char *) ra + SCTA_HEAD;
+    
+    return true;
+}
+
+
+
+// APPENDIX A: EXTERNAL CODE
+void* scta_macro_subset_(size_t size, int at, int length, void *p){
+    void *n = scta_macro_new_(size);
+    if (!n) return NULL;
+    
+    if (at < 0) at = SCTA__EXTERN_LEN(p)[0] + at;
+    
+    if(!scta_insert_array(n, 0, (char *) p + at*SCTA__EXTERN_SIZE(p)[0], length)) return NULL;
+    else return n;
+}
+/*
+    sctstr: A simple string module 
+
+    Sulaiman (seininn) Mustafa     2014-01-19
+    Version 0.1
+    
+    This module is a part of libstc.
+*/
+
+#ifndef SCTA_H
+#define SCTA_H
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <limits.h>
+
+
+
+/*
+‎         .                 لا تستخدم الماكروات التالية واقتصر على الماكروات
+‎        ╱ ╲           ‫المعرفة في "PUBLIC API". استغرار هذه الماكروات غير مضمون.
+‎       ╱ | ╲
+‎      ╱  ·  ╲           Do NOT use the following macros and limit your use
+‎     ∙───────∙         to the macros defined under "PUBLIC API". This macros
+                                  are not garanteed to be stable.
+
+*/
+
+#define SCTA__OFFSET_SIZE 0
+#define SCTA__OFFSET_LEN  (SCTA__OFFSET_SIZE + sizeof(size_t))
+#define SCTA__OFFSET_RET  (SCTA__OFFSET_LEN + sizeof(int))
+#define SCTA__OFFSET_INT1 (SCTA__OFFSET_RET + sizeof(bool))
+#define SCTA__OFFSET_INT2 (SCTA__OFFSET_INT1 + sizeof(int))
+#define SCTA__OFFSET_PTR1 (SCTA__OFFSET_INT2 + sizeof(int))
+#define SCTA__OFFSET_PTR2 (SCTA__OFFSET_PTR1 + sizeof(void *))
+#define SCTA__OFFSET_HEADER  (SCTA__OFFSET_PTR2 + sizeof(void *))
+
+#define SCTA_HEAD SCTA__OFFSET_HEADER
+
+
+
+#define SCTA___SIZE(PTR, OFFSET)  ((size_t *) (((char *) PTR) + SCTA__OFFSET_SIZE   + OFFSET))
+#define SCTA___LEN(PTR, OFFSET)   ((int *)    (((char *) PTR) + SCTA__OFFSET_LEN    + OFFSET))
+#define SCTA___RET(PTR, OFFSET)   ((bool *)   (((char *) PTR) + SCTA__OFFSET_RET    + OFFSET))
+#define SCTA___INT1(PTR, OFFSET)  ((int *)    (((char *) PTR) + SCTA__OFFSET_INT1   + OFFSET))
+#define SCTA___INT2(PTR, OFFSET)  ((int *)    (((char *) PTR) + SCTA__OFFSET_INT2   + OFFSET))
+#define SCTA___PTR1(PTR, OFFSET)  ((void **)  (((char *) PTR) + SCTA__OFFSET_PTR1   + OFFSET))
+#define SCTA___PTR2(PTR, OFFSET)  ((void **)  (((char *) PTR) + SCTA__OFFSET_PTR2   + OFFSET))
+
+
+// returns the size, length, and status of the true bigening of the array (internal)
+#define SCTA__INTERN_SIZE(X) SCTA___SIZE(X, 0)
+#define SCTA__INTERN_LEN(X)  SCTA___LEN(X, 0)
+#define SCTA__INTERN_RET(X)  SCTA___RET(X, 0)
+#define SCTA__INTERN_INT1(X) SCTA___INT1(X, 0)
+#define SCTA__INTERN_INT2(X) SCTA___INT2(X, 0)
+#define SCTA__INTERN_PTR1(X) SCTA___PTR1(X, 0)
+#define SCTA__INTERN_PTR2(X) SCTA___PTR2(X, 0)
+
+
+// returns the size, length, and status of apparent bigening of the array (external)
+#define SCTA__EXTERN_SIZE(X) SCTA___SIZE(X, -SCTA_HEAD)
+#define SCTA__EXTERN_LEN(X)  SCTA___LEN(X,  -SCTA_HEAD)
+#define SCTA__EXTERN_RET(X)  SCTA___RET(X,  -SCTA_HEAD)
+#define SCTA__EXTERN_INT1(X) SCTA___INT1(X, -SCTA_HEAD)
+#define SCTA__EXTERN_INT2(X) SCTA___INT2(X, -SCTA_HEAD)
+#define SCTA__EXTERN_PTR1(X) SCTA___PTR1(X, -SCTA_HEAD)
+#define SCTA__EXTERN_PTR2(X) SCTA___PTR2(X, -SCTA_HEAD)
+
+extern FILE *scta_config_debug;
+extern int scta_config_version[3];
+
+void* scta_macro_new_(size_t size);
+void scta_macro_free_(void *c);
+bool scta_macro_set_length_(char **z, int newlength);
+bool scta_macro_insert_(char **z);
+bool scta_macro_insert_array_(char **z);
+bool scta_macro_delete_subset_(char **z);
+void* scta_macro_subset_(size_t size, int at, int length, void *p);
+
+
+
+/*
+            ╭──────────╮
+            │          │
+            │   ╭──╮   │
+            │   ╰──╯   │
+            │          │                         ╭────╮ ╭────╮ ╭─╮  
+            │   ╭──────╯ ╭─╮    ╭─╮  ╭─╮ ╭──╮    │ ╭╮ │ │ ╭╮ │ │ │
+            │   │ ╭─╮╭─╮ │ ╰──╮ │ │  │ │ │ ╭╯    │ ╰╯ │ │ ╰╯ │ │ │
+            │   │ │ ││ │ │ ╭╮ │ │ │  │ │ │ │     │ ╭╮ │ │ ╭──╯ │ │
+            │   │ │ ╰╯ │ │ ╰╯ │ │ ╰╮ │ │ │ ╰╮    │ ││ │ │ │    │ │
+            ╰───╯ ╰────╯ ╰────╯ ╰──╯ ╰─╯ ╰──╯    ╰─╯╰─╯ ╰─╯    ╰─╯
+         ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ ⇩ 
+*/
+
+
+
+
+
+
+#define scta_new(type)                              (scta_macro_new_(sizeof(type)))/*
+sctman:scta_new
+
+NAME
+    scta_new
+
+SYNOPSIS
+    bool scta_new(type)
+    
+DESCRIPTION
+    Takes any type as its input, and returns a pointer to a zero length array
+    with elements of the same type.
+
+NOTES
+    This function is implemented as a macro.
+
+RETURN
+    a pointer of type `type *' on success, and null otherwise.
+
+EXAMPLE
+    int *list = scta_new(int);
+    char *list = scta_new(char);
+    struct foo *list = scta_new(struct foo);
+    struct foo **list = scta_new(struct foo *);
+
+*/
+
+
+#define scta_free                                scta_macro_free_/*
+sctman:scta_free
+NAME
+    scta_free
+    
+SYNOPSIS
+    void scta_free(array)
+
+DESCRIPTION    
+    Takes a dynamic array and frees it.
+
+RETURN
+    None
+*/
+
+
+#define scta_length(A)                              (SCTA__EXTERN_LEN(A)[0])/*
+
+sctman:scta_length
+NAME
+    scta_length
+    
+SYNOPSIS
+    int scta_length(array)
+
+DESCRIPTION    
+    Returns the length of the array 
+
+RETURN
+    The length of `array' as an int.
+*/
+
+#define scta_set_length(A, newl)                    (scta_macro_set_length_((char **) &(A), newl))/*
+
+DESCRIPTION    
+    expands or collapses an array. If newl is larger than the length of the 
+    array, the array is expanded and all new elements are set to zero. If 
+    newl is smaller than the length of the provided array, the array is 
+    collapsed.
+    
+RETURN
+    A boolian value indicating success or failure; stdbool definitions are used.
+    
+
+*/
+
+#define scta_insert(A, where, what)                 ((SCTA__EXTERN_INT1(A)[0]=where),\
+                                                     ((A)[*SCTA__EXTERN_LEN(A)]=what),\
+                                                     scta_macro_insert_((char **) &(A)))/*
+                                                     
+DESCRIPTION    
+    This macro inserts variable `what' in a dynamic array `A' at index `where'.
+
+RETURN
+    A boolian value indicating success or failure; stdbool definitions are used.
+
+EXAMPLE
+    int *a; // [1, 2, 3]
+    if (!scta_insert(a, 1, 300)) {
+        puts("this macro failed");
+    }
+    a; // [1, 300, 2, 3]
+*/
+                     
+                                                     
+#define scta_insert_array(A, where, target, length) ((SCTA__EXTERN_INT1(A)[0]=(where)),\
+                                                     (SCTA__EXTERN_INT2(A)[0]=(length)),\
+                                                     (SCTA__EXTERN_PTR1(A)[0]=(target)),\
+                                                     scta_macro_insert_array_((char **) &(A)))
+                                                     
+                                                                                             
+#define scta_push(A, what)                          scta_insert((A), INT_MAX, (what))
+
+#define scta_push_array(A, target, length)          (scta_insert_array((A), INT_MAX, (target), (length)))
+
+#define scta_delete_subset(A, where, length)        ((SCTA__EXTERN_INT1(A)[0]=(where)),\
+                                                     (SCTA__EXTERN_INT2(A)[0]=(length)),\
+                                                     scta_macro_delete_subset_((char **) &(A)))
+
+#define scta_pop(A, var)                            (scta_delete_subset((A), INT_MAX, 1) ?\
+                                                     ((var)=((A)[scta_length(A)]),true) :\
+                                                     false)
+
+#define scta_subset(array, at, length)              (scta_macro_subset_(sizeof((array[0])), (at), (length), (array)))
+
+#endif

source/sctframe.c

+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "sctframe.h"
+#include "scta.h"
+
+FILE *sctframe_config_debug = NULL;
+int sctframe_config_version[3] = {1, 0, 0};
+
+sctframe_t *sctframe_new() {
+    sctframe_t *f = malloc(sizeof(sctframe_t));
+    if (!f) {
+        // bad memory
+        return NULL;
+    }
+    f->records = scta_new(struct record);
+    if (!f->records) {
+        // darray fail
+        free(f);
+        return NULL;
+    } 
+    return f;
+}
+
+
+
+void *sctframe_add_(sctframe_t *f, ...) 
+{
+    struct record r;
+    
+    va_list ap;
+    va_start(ap, f);
+    
+    if (!(r.address = va_arg(ap, void *))) goto EXIT;
+    r.freef = va_arg(ap, void (*)(void *));
+    
+    
+    if (!scta_push(f->records, r)) {
+        // could not store array
+        r.address = NULL;
+        goto EXIT;
+    }
+    
+    EXIT:
+    va_end(ap);
+    return r.address;
+}
+
+void sctframe_free(sctframe_t *f) {
+    for (int i = 0; i < scta_length(f->records); ++i) {
+        if (f->records[i].freef) f->records[i].freef(f->records[i].address);
+        else free(f->records[i].address);
+    }
+    scta_free(f->records);
+    free(f);
+}
+

source/sctframe.h

+#ifndef SCTFRAME_H
+#define SCTFRAME_H
+
+extern FILE *sctframe_config_debug;
+extern int sctframe_config_version[3];
+
+struct record {
+    void *address;
+    void (*freef)(void *);
+};
+
+typedef struct {
+    struct record *records;
+} sctframe_t;
+
+
+sctframe_t *sctframe_new();
+void *sctframe_add_(sctframe_t *f, ...);
+void sctframe_free(sctframe_t *f);
+
+#define C(f, ...) (sctframe_add_(f, __VA_ARGS__, NULL))
+
+#endif
+/*
+
+    sctml: Usefull HTML Routines
+    Sulaiman (seininn) Mustafa
+    Date: 2014-01-21
+    
+*/
+
+#define _POSIX_C_SOURCE 200809L
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "sctstr.h"
+#include "sctos.h"
+#include "scta.h"
+
+
+
+FILE *sctml_config_debug = NULL;
+int sctml_config_version[3] = {1, 0, 1};
+
+char *sctml_percent_encode(char *s, char *exceptions){
+    // implemented what I needed, prob. doesn't conferm to spec. Fix later
+    char *out = NULL;
+    
+    if (!exceptions) exceptions = "";
+    
+    for (;*s;++s) {
+        if ((*s >= 0x20 && *s < 0x30) && !strchr(exceptions, *s)) {
+            char buf[4];
+            snprintf(buf, 4, "%%%x", *s);
+            sctstr_append(&out, buf);
+        }
+        else sctstr_append(&out, (char [2]) {*s, 0});
+    }
+    return out;
+}
+
+char *sctml_xml_escape(char *s, char *exceptions){
+    // implemented what I needed, prob. doesn't conferm to spec. Fix later
+    char *out = NULL, *ptr;
+    char *list_in = "\"'<>&";
+    char *list_out[] = {"quot", "apos", "lt", "gt", "amp"};
+    
+    if (!exceptions) exceptions = "";
+    
+    for (;*s;++s) {
+        if ((ptr = strchr(list_in, *s)) && !strchr(exceptions, *s)) {
+            char buf[7] = {0};
+            strcat(buf, "&");
+            strcat(buf, list_out[ptr-list_in]);
+            strcat(buf, ";");
+            sctstr_append(&out, buf);
+        }
+        else sctstr_append(&out, (char [2]) {*s, 0});
+    }
+    return out;    
+}
+
+
+char **sctml_get_tags(char *string, char *tag){
+    #define ERROR_PROC {\
+        scta_free(opening);\
+        scta_free(closing);\
+        for (int i = 0; i < scta_length(list); ++i) free(list[i]);\
+        scta_free(list);\
+        return NULL;\
+    }
+        
+    #define OP_JUMP_CALC {\
+        ++c;\
+        i+=opening_length;\
+        {\
+            char *tc = strstr(string+i, ">");\
+            if (tc) {\
+                i=tc-string;\
+            }\
+            else ERROR_PROC\
+        }\
+    }
+        
+    
+    
+    int tag_length = strlen(tag);
+    
+    char *opening, *closing;
+    int opening_length, closing_length;
+    
+    char *t;
+    
+    // <tag
+    t = scta_new(char);
+    scta_push_array(t, "<", 1);
+    scta_push_array(t, tag, tag_length+1);
+    opening = t;
+    opening_length = tag_length+1;
+    
+    // </tag>
+    t = scta_new(char);
+    scta_push_array(t, "</", 2);
+    scta_push_array(t, tag, tag_length);
+    scta_push_array(t, ">", 2);
+    closing = t;
+    closing_length = tag_length+3;
+    
+    
+    char **list = scta_new(char *);
+
+    while (*string) {
+        // first occurence
+        int c = 0; // match counter 
+        int i = 0; // index
+        
+        string = strstr(string, opening);
+        
+        // if not found break, else skip to after opining string
+        if (!string) break;
+        else OP_JUMP_CALC
+
+        
+        // ignore submatches
+        while (*(string+i) && c) {
+            if (!strncmp(string+i, opening, opening_length)) {
+                OP_JUMP_CALC
+                continue;
+            }
+            if (!strncmp(string+i, closing, closing_length)) {
+                --c;
+                i+=closing_length;
+                continue;
+            }
+            ++i;
+        }
+        
+        if (c) {
+            //error
+            ERROR_PROC
+        }
+        if (i) { //match
+            char *p = malloc(i+1);
+            if (!p) {
+                //error
+                ERROR_PROC
+            }
+            strncpy(p, string, i);
+            p[i] = 0;
+            scta_push(list, p);
+        }
+        
+        string = string+i;
+    }
+    scta_free(opening);
+    scta_free(closing);
+    scta_push(list, NULL);
+    return list;
+}
+
+void sctml_free_tags(char **list) {
+    if (scta_length(list)) for (int i = 0; list[i]; ++i) free(list[i]);
+    scta_free(list);
+}
+
+
+
+
+
+
+char *sctml_strip_tags(char *tag){
+    char *start = strchr(tag, '>');
+    char *end = strrchr(tag, '<');
+    
+    if (!start || !end) {
+        return NULL;
+    }
+    
+    if (start > end) {
+        return NULL;
+    }
+    
+    return strndup(start+1, end-start-1);
+}
+
+
+
+char **sctml_get_tags_from_file(char *filename, char *tag){
+    // Also consider using lim for a more robust method (will be equivilant to js getTextContent)
+    // HERE
+    char *buf;
+    if (!sctos_load(filename, &buf)) {
+        if (sctml_config_debug) fprintf(sctml_config_debug, "failed to load `%s'. enable sctos debuging for further information.\n", filename);
+        return NULL;
+    }
+    char **ret = sctml_get_tags(buf, tag);
+    free(buf);
+    return ret;
+}
+
+/*
+
+    sctml: Usefull XML/HTML Routines
+    Sulaiman (seininn) Mustafa
+    Date: 2014-01-21
+    
+*/
+
+#ifndef sctml_H
+#define sctml_H
+
+#include <stdbool.h>
+#include <stdio.h>
+
+extern FILE *sctml_config_debug;
+extern int sctml_config_version[3];
+
+
+char **sctml_get_tags(char *string, char *tag);
+char **sctml_get_tags_from_file(char *filename, char *tag);
+char *sctml_strip_tags(char *tag);
+void sctml_free_tags(char **list);
+
+char *sctml_percent_encode(char *s, char *exceptions);
+char *sctml_xml_escape(char *s, char *exceptions);
+
+#endif
+/*
+
+    sctos: Usefull Operating System Routines
+    Sulaiman (seininn) Mustafa
+    Version 1:0:1
+    Date: 2014-01-21
+    Dependency list: sctstr
+    
+    This is a module of the sctlibz collection; sctlibs is a 
+    nerve-wrekingly inefficiant library zoo.
+    
+    
+    ---
+    
+    TODO
+        Messy! factorize and add tests. This pile of code is a gigantic bug 
+        waiting to happen.
+
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "sctstr.h"
+
+FILE *sctos_config_debug = NULL;
+bool sctos_config_verbose = true;
+int sctos_config_version[3] = {1, 0, 1};
+
+bool sctos_load(char *path, char **buf){
+    struct stat s;
+    int fd;
+    
+
+    fd = open(path, 0);
+    if (fd == -1) {
+        if (sctos_config_verbose || sctos_config_debug) {
+            fprintf(sctos_config_debug?sctos_config_debug:stderr, "Unable to open '%s': %s\n", path, strerror(errno));
+        }
+        return false;
+    }
+    
+    if (stat(path, &s)) {
+        if (sctos_config_verbose || sctos_config_debug) {
+            fprintf(sctos_config_debug?sctos_config_debug:stderr, "could not stat '%s': %s\n", path, strerror(errno));
+        }
+        return false;
+    }
+    
+    if (!((*buf) = malloc(s.st_size+1))) {
+        if (sctos_config_verbose || sctos_config_debug) {
+            fprintf(sctos_config_debug?sctos_config_debug:stderr, "could not allocate %lld bytes for '%s': %s\n", 
+                (long long int) s.st_size, path, strerror(errno));
+        }
+        return false;
+    }
+    
+    int rc = read(fd, (*buf), s.st_size);
+    // handle interupts: retry
+    
+    if (rc == -1) {
+        if (sctos_config_verbose || sctos_config_debug) {
+            fprintf(sctos_config_debug?sctos_config_debug:stderr, "Unable to read from '%s': %s\n", path, strerror(errno));
+            perror(":");
+        }
+        free(*buf);
+        return false;
+    }
+    (*buf)[s.st_size] = 0;
+    
+    close(fd);
+    return true;
+}
+
+bool sctos_walk(char *path, bool (*handler)(void *payload, char *path), void *payload){
+    // add decrementing maxdepth later
+    // add fail mode strict or (default) permisive
+    DIR *dfd;
+    struct dirent *entry;
+    bool rv = true;
+    
+    if (sctos_config_debug) fprintf(sctos_config_debug, "== looking in '%s'\n", path);
+    if (!(dfd = opendir(path))) {
+        if (sctos_config_verbose || sctos_config_debug) {
+            fprintf(sctos_config_debug?sctos_config_debug:stderr, "could not open '%s': %s\n", path, strerror(errno));
+        }
+        return false;
+    }
+    
+    while ((entry = readdir(dfd))) {
+        char *newpath = NULL;
+        sctstr_append(&newpath, path);
+        sctstr_append(&newpath, "/");
+        sctstr_append(&newpath, entry->d_name);
+        
+        struct stat st;
+        if (stat(newpath, &st) == -1) {
+            if (sctos_config_verbose || sctos_config_debug) perror(newpath);
+            rv = false;
+            free(newpath);
+            continue;
+        }
+        if (S_ISDIR(st.st_mode)) {
+            if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) {
+                free(newpath);
+                continue;
+            }
+            
+            rv &= handler(payload, newpath);
+            rv &= sctos_walk(newpath, handler, payload);
+        }
+        else {
+            rv &= handler(payload, newpath);
+        }
+        free(newpath);
+    }
+    
+    closedir(dfd);
+    return rv;
+}
+
+
+
+/*
+
+    sctos: Usefull Operating System Routines
+    Sulaiman (seininn) Mustafa
+    Version 1:0:1
+    Date: 2014-01-21
+    Dependency list: sctstr
+    
+    This module is a part of libstc.
+*/
+
+#ifndef SCTOS_H
+#define SCTOS_H
+
+#include <stdbool.h>
+#include <stdio.h>
+
+extern bool sctos_config_debug;
+bool sctos_config_verbose;
+
+extern int sctos_config_version[3];
+
+bool sctos_walk(char *dirname, bool (*handler)(void *payload, char *path), void *payload);
+bool sctos_load(char *path, char **buf);
+
+#endif
+/*
+    sctstr: A simple string module 
+
+    Sulaiman (seininn) Mustafa     2014-01-19
+    Version 0.1
+    
+    This module is a part of libstc.
+*/
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+FILE *sctstr_config_debug = NULL;
+
+/*
+bool strDup(char **o, char *s){
+    char *r;
+    if (!(r = malloc(strlen(s)+1))) {
+        *o = NULL;
+        return false;
+    }
+    strcpy(r, s);
+    *o = r;
+    return true;
+}*/
+
+bool sctstr_append(char **o, char *s){
+    char *temp;
+    int len = strlen((*o)?(*o):"");
+    if (!(temp = realloc(*o, len+strlen(s)+1))) {
+        if (sctstr_config_debug) fprintf(sctstr_config_debug, "Out of memory");
+        return false;
+    }
+    else {
+        *o = temp;
+    }
+    if (len == 0) **o = 0;
+    strcat(*o, s);
+    return true;
+}
+/*
+    sctstr: A simple string module 
+
+    Sulaiman (seininn) Mustafa     2014-01-19
+    Version 0.1
+    
+    This module is a part of libstc.
+*/
+#ifndef SCTSTR_H
+#define SCTSTR_H
+
+#include <stdbool.h>
+extern FILE* sctstr_config_debug;
+
+bool sctstr_append(char **o, char *s);
+
+#endif
+
+/*
+
+    sctos: Miscellaneous time Routines
+    Sulaiman (seininn) Mustafa
+    Version 1:0:1
+    Date: 2014-01-21
+    
+    This module is a part of libstc.
+    
+*/