Compare commits
1216 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ace2359e7b | |||
| 617e6510a5 | |||
| 26024770b8 | |||
| d556f58e34 | |||
| b6f302dfc0 | |||
| 8e9b5f14af | |||
| 3635c00143 | |||
| abc71baaa6 | |||
| 959aaebede | |||
| d17f8c5049 | |||
| 42a7201a70 | |||
| 1f1744a49a | |||
| fd7dbe5bd9 | |||
| 984549400d | |||
| cf0c49277e | |||
| 16c3f9fa9c | |||
| 2f2539cf34 | |||
| e66823d017 | |||
| 881c32a3df | |||
| ea0a361c35 | |||
| dc60f8bb7b | |||
| 9e92c9ea12 | |||
| a503a54240 | |||
| 265957712a | |||
| c26962bb71 | |||
| a428eddf93 | |||
| dc4f7eb2f9 | |||
| d54ac1ba91 | |||
| a3d46b18ac | |||
| e81dd05666 | |||
| 29394935e3 | |||
| df8acc4ed7 | |||
| 81928d4ab1 | |||
| 3ebf93e03d | |||
| 59e4032f1f | |||
| 8f15777427 | |||
| 748c4bf780 | |||
| befcf6d2b3 | |||
| 48236ecd3c | |||
| f340f84de7 | |||
| 40e19293f9 | |||
| f252f824a4 | |||
| 1d7e5a8130 | |||
| cb2ff92c2f | |||
| ef373ab54f | |||
| 9141a78c29 | |||
| 10a6370738 | |||
| 573009eeb6 | |||
| c3363712d9 | |||
| faa33d89a2 | |||
| f347458c53 | |||
| 530e6d9196 | |||
| b398e18e12 | |||
| 747e8370e0 | |||
| 2c67875781 | |||
| c96e8a8c19 | |||
| 5f203fc082 | |||
| b943c9b471 | |||
| 1a90a1daa8 | |||
| 72dfc743fd | |||
| 465307655b | |||
| 6ce71e6694 | |||
| 7f01b3b92a | |||
| 76950d56b9 | |||
| c11e0d02b3 | |||
| 4c798c1718 | |||
| 450d7e9ad4 | |||
| b8ab79c83e | |||
| 6934bdd533 | |||
| 84dedb73a5 | |||
| 8964aa5221 | |||
| 3481ae236c | |||
| 46adc5f8a4 | |||
| 5296df5899 | |||
| 13dad4be16 | |||
| b5d0c343b4 | |||
| b00b945264 | |||
| 3bda09e105 | |||
| 32d32c4e4a | |||
| 497441b54e | |||
| 9c564fd4c7 | |||
| 0c2263d0e9 | |||
| 3d4d30766d | |||
| 99d84d44fc | |||
| 41ba7077ad | |||
| 8a929a91c3 | |||
| 0604f06841 | |||
| 229924adf9 | |||
| df988b7c69 | |||
| e8106e2e34 | |||
| c21d3e24f8 | |||
| 2d87aa0753 | |||
| b2ad4dc9a0 | |||
| 370f2ea98f | |||
| a05ca565ff | |||
| 52255637f2 | |||
| 0fcaa3a2f5 | |||
| 0e2fa6eb9d | |||
| 1aac462c83 | |||
| 2a0edfd8f7 | |||
| 1f59a9f846 | |||
| 80c20a90ea | |||
| 56a35649fe | |||
| f07cea0b79 | |||
| 4c1b08a281 | |||
| 117f9eddcd | |||
| 7bbbfce482 | |||
| f37a7811f9 | |||
| 9173c10239 | |||
| 318b31550d | |||
| c18ebc63a6 | |||
| d704694272 | |||
| 1cfec3bdf7 | |||
| fe6ea6bc10 | |||
| d29c8df45e | |||
| 71f996af95 | |||
| d9722ad6b3 | |||
| 398fd8028c | |||
| 1345a3cfd3 | |||
| 7eb0b195b8 | |||
| 009caee82d | |||
| 3bdc805a22 | |||
| ac457792b4 | |||
| 1377b54b9e | |||
| 66418ffc8c | |||
| b4c4b1fb70 | |||
| ffe4a4b047 | |||
| 753ce45310 | |||
| fece0d73e7 | |||
| edce076e68 | |||
| 675d0a009a | |||
| 5d41b5a4db | |||
| fe53b135eb | |||
| 5b1c154ee2 | |||
| 816d882611 | |||
| 12bcb09051 | |||
| c59c69a85f | |||
| bdd0daaf6f | |||
| cfad7c8356 | |||
| b2b8a128d0 | |||
| 1cfad80ca2 | |||
| a5a80e41b8 | |||
| 152f8e92bf | |||
| 0323560b49 | |||
| d3bc84a2f7 | |||
| 8a82c259bd | |||
| 46009c7658 | |||
| 6f760308bd | |||
| c346f8f17d | |||
| af1d059fff | |||
| 5562b21a20 | |||
| 8f68f31877 | |||
| ce7e94030c | |||
| ccf5a1b972 | |||
| 0d5ae77efc | |||
| 1695096d18 | |||
| 6db0b7cf18 | |||
| 575b43b0d4 | |||
| 7b39b05894 | |||
| 8bea9e0a5e | |||
| 2255b32e45 | |||
| b62573ae8f | |||
| 44ed84f5cf | |||
| d008c834be | |||
| 2d3a914aee | |||
| 7324f4c3d1 | |||
| 50c8860a50 | |||
| 6456de7188 | |||
| 23c629f2aa | |||
| 2bf154f74f | |||
| b598ad1bc0 | |||
| ace24ad68e | |||
| 750c1a0f27 | |||
| 52d89bd66b | |||
| 8cfb9d35e9 | |||
| 2f529158a0 | |||
| 6e68ab6d9e | |||
| 7a3c55af35 | |||
| fb39d6304a | |||
| 4cb57d9059 | |||
| 42d69bd0e5 | |||
| f27b399f81 | |||
| a545a3938f | |||
| d1e352c9ee | |||
| 99be1e798b | |||
| 2132a28a17 | |||
| 8b1cc28783 | |||
| 78364ac830 | |||
| 6e5f5732b5 | |||
| 87844254d1 | |||
| 08ef9f69fb | |||
| 5fbd1b78e7 | |||
| 39f5eb753f | |||
| f4cbe3f300 | |||
| 70632e5541 | |||
| 0bba700105 | |||
| b71aaccff3 | |||
| 7271ae9611 | |||
| 6e32dff2ad | |||
| 8f7c898c08 | |||
| f4a9815f48 | |||
| 0f8d5c7e98 | |||
| 5e83596a1b | |||
| 6361213e07 | |||
| 9c59a5d9b6 | |||
| bb04844bd5 | |||
| 0b988176fa | |||
| a354f18a2d | |||
| a7ca0fec88 | |||
| 06eec508df | |||
| 10dc580a3a | |||
| 2f6ae3ef01 | |||
| 392e803905 | |||
| 83a5fb585b | |||
| c6205ffbe0 | |||
| c04737ce20 | |||
| 11b92172fe | |||
| 3a6c574376 | |||
| b21ce925fb | |||
| de9dcc4ed6 | |||
| 9e77dbfe20 | |||
| 4cee0676a4 | |||
| 8ad9d21db3 | |||
| 8ba8317eea | |||
| d221187f24 | |||
| db54ec294f | |||
| 1d39796e3f | |||
| cd6a318903 | |||
| 73090b98ab | |||
| 745de1abab | |||
| 961031efc1 | |||
| 2487595778 | |||
| 5c4863d504 | |||
| 5e3a658932 | |||
| cb4704c821 | |||
| cc0b7d1492 | |||
| f8ebbf8b08 | |||
| 8795f60bf1 | |||
| f00c0a9436 | |||
| 767bc71870 | |||
| 4c068e3e00 | |||
| 277d862172 | |||
| dbed6a47bb | |||
| 94f3749784 | |||
| 728e6d851e | |||
| 11e863545f | |||
| dde49f0bb4 | |||
| a37a75aecc | |||
| e43e3aeb1c | |||
| a8fe529814 | |||
| d9f5e2bb08 | |||
| dfa83b0ac8 | |||
| bd5cef1411 | |||
| cd70b48831 | |||
| 50ebf8088a | |||
| c5cfb7eb40 | |||
| bccaafda6d | |||
| bf0086d7b5 | |||
| 7e65938ca6 | |||
| 112eff2509 | |||
| d7837d9179 | |||
| 6cdd057f80 | |||
| 5a03b213fb | |||
| f270213246 | |||
| 2e1795c5ba | |||
| 732d6710d3 | |||
| edf384d2ee | |||
| c307640826 | |||
| a77b598f82 | |||
| 217420cfa5 | |||
| f2b9dff596 | |||
| ae945ed315 | |||
| 770c153c76 | |||
| 29c4a7e606 | |||
| 8875470b37 | |||
| 6e52364bcb | |||
| 7015d616b4 | |||
| 92e6da3260 | |||
| 9220b6f1d5 | |||
| 1d0d538d0c | |||
| 83052eafae | |||
| fa95c3c4a2 | |||
| 665dcf221b | |||
| 8f73dbd253 | |||
| 826312cbad | |||
| 72a18f2b3f | |||
| a6b5e3d0ae | |||
| 1b321f4fa3 | |||
| fbde0b9f35 | |||
| 0e5f5e54cc | |||
| cbb5902066 | |||
| 92ec1b0598 | |||
| a62fc3abff | |||
| 08f8e55446 | |||
| 68f54a3247 | |||
| 29c099fe56 | |||
| 76b81c7b35 | |||
| d6b33ffd6b | |||
| 16b9873fa8 | |||
| ba4a686d1c | |||
| 4be3d79e12 | |||
| 2569b09dbe | |||
| 5d71e69941 | |||
| 16163bf20b | |||
| f1a97fecbd | |||
| a050f82f0e | |||
| ef7beea334 | |||
| 3f4acb33f9 | |||
| 14822e6395 | |||
| e82db4ed38 | |||
| 87b7ea9cf3 | |||
| 787b1fceff | |||
| 140d6ad839 | |||
| 46e8e22236 | |||
| c386db2b33 | |||
| 8dad091c6b | |||
| 3365ccbb9c | |||
| 2ced230965 | |||
| 989d10a3e1 | |||
| 62d8c69774 | |||
| cf704257b0 | |||
| a6cb6f57d3 | |||
| 141c703ed5 | |||
| 796d58867b | |||
| 2f483ec8e8 | |||
| e338918773 | |||
| d9effc58cf | |||
| 05d03f97fc | |||
| 03e891c0e8 | |||
| 4dfe9d52e9 | |||
| 9e65692b69 | |||
| 0687c9a57a | |||
| ffe1287016 | |||
| 75b7e7260f | |||
| d631e081bc | |||
| db5843d904 | |||
| 5ec16153f7 | |||
| 8c873ccdc8 | |||
| c95088f8d5 | |||
| 519fa55df7 | |||
| b8dda033ed | |||
| 0359e9c5c7 | |||
| d822b4a62a | |||
| d9e8c953b1 | |||
| 9eca502026 | |||
| cd0efe3edb | |||
| 8146e9cbcd | |||
| 5d95275024 | |||
| 49a97eea4b | |||
| 36e9c27e9c | |||
| 6e5153cd07 | |||
| c73da864c8 | |||
| 071bb75700 | |||
| 99374de340 | |||
| db7ae4ed5d | |||
| e61f481881 | |||
| 396a3ad2fc | |||
| be235ddc38 | |||
| 9e72ecd93d | |||
| 8e0bd936eb | |||
| 9d0270dcd6 | |||
| 713415c354 | |||
| 786550572e | |||
| 46caeddc81 | |||
| 71bfde2bfe | |||
| 76771b845a | |||
| a74e239e28 | |||
| 6e763b0b42 | |||
| 2f41ece017 | |||
| 01cd5fe0d5 | |||
| ed12ff7bb3 | |||
| f1386bb60d | |||
| 417bd06e76 | |||
| 91e46e3cf8 | |||
| deb5139c4d | |||
| 862ac5d014 | |||
| 028235d421 | |||
| 143d399849 | |||
| 375f171e47 | |||
| 387edcf4b2 | |||
| 011cd37cfb | |||
| 0d4254f319 | |||
| 4c407c2850 | |||
| 829e2d6c5d | |||
| a31c4bd474 | |||
| 17f24dc377 | |||
| de3e9f2809 | |||
| 4442a282e1 | |||
| 261010f23d | |||
| ede44ca6ee | |||
| 452a953234 | |||
| 2b122562ad | |||
| 6891bc3da3 | |||
| b31b8cd7f0 | |||
| e1379ac5ce | |||
| 0ef3f75d7a | |||
| 407a9e5be0 | |||
| 892bb9bf30 | |||
| 47ac871a12 | |||
| a38c3e7f6d | |||
| 08818355d1 | |||
| 0a68afef00 | |||
| 2c0783e327 | |||
| c2e5e45c84 | |||
| 014236c861 | |||
| 610fd7561b | |||
| d6f4480a4f | |||
| 28a6ac09ad | |||
| 86e4d24476 | |||
| 913a697ab2 | |||
| ebef2b1e44 | |||
| a61457b422 | |||
| 8f7f1135df | |||
| 89612c10c9 | |||
| d55bfb32f1 | |||
| d2b72cf496 | |||
| 8d90fffd46 | |||
| b84af27a86 | |||
| b45f28f3e9 | |||
| bfa1b5656a | |||
| 47f946cd65 | |||
| 970e7bfcda | |||
| a81c7a7cd6 | |||
| b0e1bd239f | |||
| 53ca41717a | |||
| 6a5bee0cdd | |||
| fd3ae51f83 | |||
| 5e5954a808 | |||
| add8540909 | |||
| 06a302aed0 | |||
| 147432d38d | |||
| 2a003ff72b | |||
| 8660d3324d | |||
| 6c59b73ae5 | |||
| 80218c1eca | |||
| f24d96d59f | |||
| d14bd49f46 | |||
| 1a692a0873 | |||
| 631a1a4ddc | |||
| 57df7601d9 | |||
| f7650000aa | |||
| 6f93c2d9b2 | |||
| 1654764968 | |||
| 1a1b8416e2 | |||
| 36c66d52a6 | |||
| 68fe43d488 | |||
| 877b9ee23b | |||
| 80ff93beeb | |||
| b9ddd2812b | |||
| ba54b56de4 | |||
| 85be67bc2d | |||
| ae20e01d2c | |||
| d094e8c3fc | |||
| f009fe1f63 | |||
| 2007fe5f49 | |||
| 84989ffa04 | |||
| 31b629a19c | |||
| e762d9e274 | |||
| 6833267b19 | |||
| 05f2833388 | |||
| 0d026ef18d | |||
| b756d93891 | |||
| f54513586d | |||
| 6c519c237e | |||
| 4ffde4db98 | |||
| 41847d31e7 | |||
| 24ce25bb5c | |||
| e051b69e80 | |||
| 59283d1164 | |||
| 0de32a5edc | |||
| 4f80066dcb | |||
| 04ddc8003f | |||
| 3213f98d66 | |||
| 1f16f85c51 | |||
| c03cb3a11c | |||
| 62e29a6546 | |||
| 3574b065d6 | |||
| c0c47f41be | |||
| 37761d580f | |||
| e075c8e691 | |||
| 0c61ca1a6b | |||
| 1846fa1f54 | |||
| 579ce20cad | |||
| 12e4bcba5d | |||
| b4f57dee3b | |||
| f11673ae3f | |||
| a27af7dd7e | |||
| 2b26a3cc14 | |||
| 47c4849694 | |||
| 30a4adf331 | |||
| 117a721166 | |||
| 1a219e62ba | |||
| c8d54b324b | |||
| 0ac2971fc1 | |||
| 348a40201b | |||
| 9f20ddc800 | |||
| 6f1cc2c1e5 | |||
| 601cd95277 | |||
| 8e9ce59ef2 | |||
| d76ef8e3cf | |||
| c19ffafd8d | |||
| 996a99ad75 | |||
| affb926d44 | |||
| c506e534aa | |||
| 9994315070 | |||
| 4f0d89ef8b | |||
| aab984618d | |||
| 8b662bc6b5 | |||
| 03ce7a8db3 | |||
| 033e7928b5 | |||
| b095f2a158 | |||
| 196c0e0ebc | |||
| 8ab309630b | |||
| 42bac47a71 | |||
| 3bc4de2236 | |||
| a6e4b45a38 | |||
| 28e97ccaf2 | |||
| 255781c029 | |||
| 7f5635ea8c | |||
| 4f18ec726c | |||
| 263622d628 | |||
| 1dfd2443ac | |||
| 881bd53f60 | |||
| ec4404b1ba | |||
| badaeac81f | |||
| 618d5ddaff | |||
| 4ed74af868 | |||
| 123d9af7d0 | |||
| 4f17b30915 | |||
| 1fc265b0aa | |||
| afae9b8d17 | |||
| 481be44879 | |||
| b8530b0f0b | |||
| 69de79684f | |||
| 6e6fd057b5 | |||
| 4b0ebf2b80 | |||
| ee82c32119 | |||
| 3fe6731035 | |||
| 1c3f3b5705 | |||
| def1ccffc4 | |||
| fa2e531343 | |||
| 814ddbc6cc | |||
| 267e8dcfb6 | |||
| 49ec1561f8 | |||
| e2dc612153 | |||
| 8f225431fe | |||
| 194be5e0b7 | |||
| 6788a05dd1 | |||
| 6a7066ac2f | |||
| ec5ff4e973 | |||
| fe6d460531 | |||
| 9cb97af10f | |||
| 1c784eea3d | |||
| 59dd33a461 | |||
| 97ebd912dc | |||
| 742fcc060c | |||
| 3ad5cb8a23 | |||
| 0d1f12e31a | |||
| a8ddf8f66d | |||
| f7a9c0a248 | |||
| 190badb395 | |||
| 3d91ab6c31 | |||
| c15b8d71bc | |||
| 5a707dba8a | |||
| ffd2fcde6b | |||
| 8e4056c1e4 | |||
| 1554e2b135 | |||
| 4715cbb70d | |||
| fd1611079a | |||
| 8edc03df64 | |||
| 9f5c0af5b8 | |||
| 6d6eeba5d5 | |||
| 5dfb64ef71 | |||
| e5bda7add7 | |||
| 77f9b336bd | |||
| cf930d0dde | |||
| f01c94e8bc | |||
| 0d774527b4 | |||
| 58ba9496d0 | |||
| 1993e94e53 | |||
| 3bcc06ed09 | |||
| 2f6ce88e28 | |||
| cd1dec9fc7 | |||
| 05872d7650 | |||
| 1dcee2ffa2 | |||
| 5f622efb77 | |||
| 52e8326d54 | |||
| 436532bed7 | |||
| d15e789200 | |||
| 98942f5528 | |||
| c7c21dc122 | |||
| 4500c1d1a4 | |||
| b8b983dded | |||
| d6a6673971 | |||
| 0580fe8db8 | |||
| c727e24138 | |||
| b83698ebf5 | |||
| 3fbbaa5130 | |||
| 2f48b840ae | |||
| efdee11d5a | |||
| 4c87e11aeb | |||
| e881e008b8 | |||
| 1b2837915d | |||
| d076a6724f | |||
| 386af71c39 | |||
| 49f277192c | |||
| 5974a6276b | |||
| e06a390771 | |||
| b34e204676 | |||
| 755d990dfd | |||
| 7185358b98 | |||
| 3843ec1e02 | |||
| cfc5631d5d | |||
| e64555aca0 | |||
| ef52ebb529 | |||
| c98136ca4f | |||
| 65f44d24ca | |||
| 44f20782fd | |||
| 9b1d76a5d0 | |||
| 21b5074ce8 | |||
| 0b8825fecb | |||
| 3d3c20e507 | |||
| 67a282f19f | |||
| 92023b533a | |||
| c1d14c150e | |||
| aa656c74d5 | |||
| e39b7ffe30 | |||
| 1897148abc | |||
| b76118802a | |||
| 8266aa3343 | |||
| ab0c349261 | |||
| d5e0e66426 | |||
| c5b3107f83 | |||
| 1a0a64e4de | |||
| 6bd9805bcc | |||
| f74c2af65c | |||
| 9531bdf674 | |||
| 76e705e7ee | |||
| d35211328e | |||
| b7bbd81dda | |||
| 9836dd5d10 | |||
| 2109ad320d | |||
| c026121c0e | |||
| ee0c87f7b1 | |||
| 709fb93a22 | |||
| b38cd0a48d | |||
| 264435c32d | |||
| c285929ad3 | |||
| 1cbea8157d | |||
| 0a10334f1b | |||
| f0d5a6ebac | |||
| db7086b5e6 | |||
| 0e92280b33 | |||
| 0d7255158a | |||
| 33564b68dd | |||
| ba942b952a | |||
| bd7f28896e | |||
| 18fe124696 | |||
| ea3a3b6e1c | |||
| e6c06aacff | |||
| 1aee92cd5c | |||
| 40c4cad491 | |||
| 013d46fb02 | |||
| f0f465411f | |||
| 32ce83475d | |||
| ec0d3f5b5d | |||
| 75294b9146 | |||
| 26a0eb68ef | |||
| b983e29fb0 | |||
| 68dadabc29 | |||
| ed9fd3f0e0 | |||
| fa9573436a | |||
| 6d2058c3b7 | |||
| 0d7f93b877 | |||
| f022c9d510 | |||
| 5964a06386 | |||
| f14dc4a4e9 | |||
| fd56e2534c | |||
| 08962a74ab | |||
| f850d36c52 | |||
| c5fb161477 | |||
| bfc2fab33f | |||
| ec9d6c4fd2 | |||
| 6135d61e3d | |||
| a677242a2c | |||
| 6602f30112 | |||
| a4b8dc18c1 | |||
| c0d4741f88 | |||
| b33718180c | |||
| 3872393b29 | |||
| 1d72a7df99 | |||
| 5455908772 | |||
| 8882192fac | |||
| 7b77491c06 | |||
| 20bf214d6e | |||
| 8ab3e63aeb | |||
| 0dc03214c5 | |||
| 362e98b43d | |||
| 193e085cf0 | |||
| e0df2a342b | |||
| ba19ccac43 | |||
| d7261b7a78 | |||
| 0d80173efd | |||
| 930f07d15e | |||
| 66df7389d2 | |||
| c7bf0b6ddd | |||
| 0bc361adeb | |||
| 4fff523a6d | |||
| 67e09fb342 | |||
| c360806f47 | |||
| 7b74b73b08 | |||
| e9a851c0d4 | |||
| b13b169149 | |||
| 455329a745 | |||
| a68b76c8b4 | |||
| 96e3899216 | |||
| 771ab5ea9a | |||
| 3c87e6b270 | |||
| 6d8afec510 | |||
| 89e25657d8 | |||
| 29387f1fcf | |||
| 58e885c052 | |||
| 984dfcd7e1 | |||
| 3785479086 | |||
| 8ed280907c | |||
| d742671205 | |||
| 87e72c28a4 | |||
| 4dee357362 | |||
| 431f4b9b0d | |||
| dd5b7825d5 | |||
| 02bc48925a | |||
| 4eb505755e | |||
| 83e94a70ea | |||
| 8a150b27c3 | |||
| 1a51451ec2 | |||
| 41e51bfb77 | |||
| 7e1d9bc768 | |||
| ba065ec1d8 | |||
| fe057a91c8 | |||
| d2c36eefc9 | |||
| 28d56bab04 | |||
| 2500eff90d | |||
| 153446b3a1 | |||
| 391f5caaa2 | |||
| cc0df92444 | |||
| 03910d67c3 | |||
| fec5cc864e | |||
| cb78362713 | |||
| 4c5b1a6ff4 | |||
| 83c5727698 | |||
| 80838ff1e9 | |||
| 29e8d072b7 | |||
| d7592f01e1 | |||
| 392f283d9e | |||
| bcd738ebbb | |||
| 8020c52c48 | |||
| 3f566e541d | |||
| be4a631dc8 | |||
| 0bfdf908c1 | |||
| 6f2fc23f77 | |||
| f3a47c7e70 | |||
| 36349ffabb | |||
| b13f7366cf | |||
| 9181bcd9a7 | |||
| 7dbc1d894b | |||
| 5720445d15 | |||
| a90027521d | |||
| e02d400bf6 | |||
| efadb8fd31 | |||
| a19d06561b | |||
| 0b685d11c9 | |||
| 28f019d672 | |||
| bf5cbfffc2 | |||
| fe021e7c51 | |||
| c42fb54bc6 | |||
| 9382b68781 | |||
| 178198a417 | |||
| 7068e90771 | |||
| 1c762f23d0 | |||
| fd2b9a6e21 | |||
| db43910288 | |||
| f248c0460e | |||
| b8e3c0ceb4 | |||
| b5053d889e | |||
| 12ba7776b3 | |||
| 7817e88d03 | |||
| 8dec65853d | |||
| 88e3cb3be1 | |||
| fa702b48e3 | |||
| 299dcf6686 | |||
| 27f9ae5bbb | |||
| 9cb3a853f1 | |||
| 95c8ef4148 | |||
| a41bb52014 | |||
| 914cd7221e | |||
| 2dfc0a58ab | |||
| 0c9f3c638a | |||
| a966d6acf1 | |||
| 1e0c38b5f9 | |||
| d3323d6550 | |||
| ebed0b9f20 | |||
| f654a453dc | |||
| 10decf94cc | |||
| 96dd4817f1 | |||
| 72906cdc6a | |||
| fba4375be0 | |||
| 75120676ad | |||
| 7daf63fd3f | |||
| 014de25f6f | |||
| 3fc6535012 | |||
| 4fc0a32572 | |||
| dcc704a357 | |||
| bd8acbde97 | |||
| 112b10c19d | |||
| d89e561a85 | |||
| 49c1da79c8 | |||
| 0a72f00175 | |||
| 1af5820db0 | |||
| c117491549 | |||
| d8748f4270 | |||
| c0ba6e13e4 | |||
| c34daf1a35 | |||
| d461b53235 | |||
| c3ee14eb67 | |||
| 869fb8e327 | |||
| fbbc3024d6 | |||
| f1ba0c0aa7 | |||
| 54340ab4bf | |||
| 39732eee5e | |||
| a9e4526a6d | |||
| 57a6d2abf9 | |||
| d6246941ac | |||
| 2eb91f9b91 | |||
| 34ae413607 | |||
| ee9f8c184b | |||
| 7a84afcbdb | |||
| b8a16ea99d | |||
| 095466d5c7 | |||
| 89cfa22c3f | |||
| 1f18050930 | |||
| 537b78d564 | |||
| 717fd57ce1 | |||
| 3fb7786868 | |||
| 17ecfc9765 | |||
| 5326260a76 | |||
| e7522f4bdf | |||
| 504deeff42 | |||
| b7785b64cf | |||
| f914cb6858 | |||
| 91051d2521 | |||
| 51536a7acd | |||
| 263ccab6e3 | |||
| 9f87755dcb | |||
| 60b4cca5e5 | |||
| d2718e99a4 | |||
| 69a00c0ab3 | |||
| 3272d23917 | |||
| 7f0545cae7 | |||
| 68f35deb86 | |||
| c4f4035072 | |||
| a7d8845952 | |||
| a3378393b0 | |||
| 3dfe0ad478 | |||
| 9a3b7a4f3f | |||
| 78579b1103 | |||
| 7d50344512 | |||
| 7a00c12065 | |||
| af71e67681 | |||
| b3e20fc324 | |||
| bd1014abb6 | |||
| 7f76664a5d | |||
| 0a5a80b05d | |||
| 2d63da0660 | |||
| 8387527d2e | |||
| 5d03ba7d63 | |||
| 0ece50c122 | |||
| f2ac297252 | |||
| 0ca8ae17d4 | |||
| 88ca87cf9e | |||
| 0d69d228e4 | |||
| a3afe95306 | |||
| 9fb4af8658 | |||
| 9bb6ba9311 | |||
| faa42ba341 | |||
| 596827a912 | |||
| 89b4292445 | |||
| dd88737414 | |||
| 5456cfc304 | |||
| 1e66096ea7 | |||
| 2b6ae3908c | |||
| 1924612479 | |||
| 2af5bdeaab | |||
| b28565b38d | |||
| fec602362b | |||
| 6753c5f45a | |||
| 2f3c108d42 | |||
| ce6d99bdb4 | |||
| 86d4125893 | |||
| 3a18f00379 | |||
| e6274904a7 | |||
| 3677395444 | |||
| 22ba35b3b5 | |||
| 9c1ab9979b | |||
| eaa463e1c9 | |||
| 6984be48c3 | |||
| b739bd3d79 | |||
| 23f3e4396c | |||
| c264750924 | |||
| c155f0a5d5 | |||
| 76734f086d | |||
| 4f2d1172dd | |||
| 75caf4e297 | |||
| 509ab8261f | |||
| 1e05b40d4f | |||
| 451390f835 | |||
| 58cce9d2f8 | |||
| 2eb6e3b0ea | |||
| fb1181ed26 | |||
| 6d5e1d529d | |||
| 0e0ca08924 | |||
| 5d948a67a8 | |||
| 6a4db2ecab | |||
| f700273624 | |||
| 0c198e0ccc | |||
| 71ffbbc420 | |||
| 4fd09b889d | |||
| 4cb2a3eebe | |||
| c25186b1f6 | |||
| 779033d0bc | |||
| 3e31560e7d | |||
| d23d7e8775 | |||
| f6fdf5cb7f | |||
| 1879ccd27d | |||
| 08c0796719 | |||
| edc7994ce5 | |||
| bcfcfbd064 | |||
| 9e79b3258d | |||
| 243873cd2d | |||
| c7b8a4b0c1 | |||
| e39e0c7140 | |||
| d4a3f11dbb | |||
| 0962f266b3 | |||
| 69e4d3fdad | |||
| c0908f463a | |||
| b00a61a17b | |||
| 553c2f886a | |||
| 4fd9c5772a | |||
| 04e0e06d85 | |||
| 4d7829d72b | |||
| 6b751aac57 | |||
| 813349fd23 | |||
| 16a2744782 | |||
| 7b6870db22 | |||
| 3e38e7d52c | |||
| 8142d3474d | |||
| 8773649de6 | |||
| c117920ff9 | |||
| c8dd2a3eb8 | |||
| 90b1817e92 | |||
| d6c3ff5997 | |||
| 984ec25132 | |||
| a7bff34784 | |||
| a6e7afbc91 | |||
| 33f1d63b64 | |||
| f95e171e11 | |||
| c82b50b212 | |||
| 2b402b77f1 | |||
| adcb551020 | |||
| 2680aabe06 | |||
| d5c0533b74 | |||
| 609307668b | |||
| cdaf36572a | |||
| 033c8d5d51 | |||
| 6216ec1d6a | |||
| 6c9c67f6c5 | |||
| 5bd32b5521 | |||
| 549336f75b | |||
| f0e75f30b3 | |||
| 144c09f175 | |||
| ee50c0f97c | |||
| ade921bf02 | |||
| 676cacff04 | |||
| a3097d5e25 | |||
| fd78148558 | |||
| a4d79d7375 | |||
| df04e8183d | |||
| c43c484a62 | |||
| 0608c35669 | |||
| 7dd4d06e26 | |||
| 1ee0310b86 | |||
| cc0a52038f | |||
| 6aed1fe231 | |||
| 680608fe18 | |||
| ec6acbc602 | |||
| cb7ee4c5d2 | |||
| 88d5798f45 | |||
| fcc22a0aa3 | |||
| aabefff298 | |||
| ed25c64e97 | |||
| b7dc870c2d | |||
| 9bea608843 | |||
| 9db1732c36 | |||
| 39f1a70174 | |||
| 1810440355 | |||
| 37ac8f179e | |||
| 626a09328f | |||
| 8d489d0d77 | |||
| 776f3db0d7 | |||
| 6046057b88 | |||
| 7e85d9e549 | |||
| 01c8a8b1c2 | |||
| c9bf6ac9ae | |||
| 62e4d69be9 | |||
| 62ac733b09 | |||
| c3b3e1b1b9 | |||
| a791e96e00 | |||
| e87f5521c1 | |||
| 366a708f3a | |||
| 70ba662574 | |||
| b389abd99f | |||
| 4aa2d14fe3 | |||
| af7de75ad4 | |||
| d461ebbda1 | |||
| 55ef94abcd | |||
| afaf489d99 | |||
| 20e4cbfd13 | |||
| f3b8c9f34e | |||
| 45e8ff25a5 | |||
| 268e322e1c | |||
| d3bcba6a05 | |||
| cc4ef1944d | |||
| 5aa8486265 | |||
| fd181673cd | |||
| 62c9547c4e | |||
| cdd117bfb9 | |||
| 304ba57dad | |||
| 69eaaa4177 | |||
| 452ac52fcb | |||
| 40cf489290 | |||
| 891d6be4a6 | |||
| 5d45ce5cf7 | |||
| a0f2241f3a | |||
| aa513bf7d3 | |||
| b2d65febc8 | |||
| 23a6d326e8 | |||
| 5b2f1b6d8b | |||
| b4e9ad031b | |||
| 8b7ebcf040 | |||
| af05296631 | |||
| 29d693de2d | |||
| 51ac5172f5 | |||
| 24ce1ef5e7 | |||
| f6d1e269d1 | |||
| 62c2f5228d | |||
| 9882d9683b | |||
| 45ce89ee1f | |||
| bfb9df1553 | |||
| a5f79204ce | |||
| e322613d84 | |||
| fbb60f5191 | |||
| 899e7d2f39 | |||
| 8e2aa07747 | |||
| a0d262cd76 | |||
| b43a7edee4 | |||
| 7760bbd77c | |||
| 9c0f1b02a7 | |||
| 4ecfff4d8d | |||
| ac03b89f38 | |||
| 620174aea9 | |||
| ab50d28bc4 | |||
| b5318602d1 | |||
| bff2a63ea2 | |||
| aacfb8820e | |||
| 98e8c031d0 | |||
| beb4319d1e | |||
| 2558243c83 | |||
| b670e8d1ac | |||
| 68f8358f06 | |||
| db5a099097 | |||
| ce33ffb62a | |||
| 59a2fb9cfd | |||
| 75bba319de | |||
| f78e9261f3 | |||
| 5f77562333 | |||
| 5c4f01a68d | |||
| 35f6f998e6 | |||
| 6737a3ae09 | |||
| 09559bee8c | |||
| f487ea27a8 | |||
| a3d95f239a | |||
| 023c06e178 | |||
| 414a6c1c9e | |||
| 910e18fb22 | |||
| ac441fd1cf | |||
| 0c328372b5 | |||
| 55ef60a6d4 | |||
| c33584e683 | |||
| ee8c7453bd | |||
| 0330369603 | |||
| 3f7b642c7d | |||
| eb6c51426a | |||
| 0337bdb9fd | |||
| 7aedc62058 | |||
| bfc835cbbf | |||
| 5c6ba30c48 | |||
| 8fe4824ed2 | |||
| d40cb3bd55 | |||
| 4bcd3ac5d7 | |||
| e2b8e9dea9 | |||
| 572314bf3f | |||
| 14d303d331 | |||
| 24ffaa0738 | |||
| 5d9b6d056d | |||
| 5c28ff15ba | |||
| 06ceb2f2a1 | |||
| 7373e1dd8b | |||
| 4b1a9e714d | |||
| 9d76136358 | |||
| b3502420ad | |||
| dd7ac7cca9 | |||
| 31dfa18e9b | |||
| 3e785008d3 | |||
| 6b7c7f755c | |||
| c55a8a8703 | |||
| 64c97308ac | |||
| 3551b0b95a | |||
| 9f16b5c4af | |||
| 9777e549cb | |||
| fbfced1b93 | |||
| 1a84b4681c | |||
| 4bf81b8e1c | |||
| c282e7fdb4 | |||
| d339ee3135 | |||
| 1de95de299 | |||
| 96c998a1d7 | |||
| b5413c0156 | |||
| 7371c195ff | |||
| 0866a1996b | |||
| 41f44c4e78 | |||
| 131712c3bd | |||
| bae12aaab7 | |||
| 74d5844d8c | |||
| c87908266a | |||
| f788d76b8c | |||
| 41031e572e | |||
| f8a0864c1b | |||
| 949587334c | |||
| 0bc6a1a7f1 | |||
| 0d9cbfe927 | |||
| 8742a524c3 | |||
| 79bf2297b5 | |||
| 32e9e23630 | |||
| 7f1cecba92 | |||
| efd30c61c3 | |||
| 4c97b11207 | |||
| 58ea0ab745 | |||
| 3547c71ad5 | |||
| 044d6b2ce2 | |||
| a0b26b6c06 | |||
| 8e3bfde439 | |||
| 6507de959b | |||
| 56d09bf3b5 | |||
| 232754b978 | |||
| 75ef603308 | |||
| a5a2fcee4d | |||
| f86d57bfe3 | |||
| 615615b1df | |||
| aeba0ce170 | |||
| 5ce60aad53 | |||
| dbc01de9a0 | |||
| dfaf3f24fc | |||
| 14b0527e79 | |||
| f0148c3161 | |||
| 6a5e3d924d | |||
| 664a82e7c9 | |||
| e2763b4826 | |||
| afb29b19c2 | |||
| 8d60343940 | |||
| 67a77f1880 | |||
| c933974174 | |||
| 19715903fb | |||
| c88f72fd15 | |||
| 7818596271 | |||
| 9cb8d7bca6 | |||
| 46f9256114 | |||
| c26ef87202 | |||
| 89fee5b835 | |||
| f5795eb01b | |||
| dbf0c9f016 | |||
| 586b43048f | |||
| 63b9ee61d2 | |||
| 3b9eff7f34 | |||
| 59668c5fc1 | |||
| 3ed786fb5c | |||
| 0cd5eb5472 | |||
| ff571b96cb | |||
| 36b852e6bf | |||
| f0c21c7203 | |||
| 0516d8260c | |||
| 1418f57b96 | |||
| b24fb59c94 | |||
| 8fcf2bcd59 | |||
| 079b808a56 | |||
| a4e01e28db | |||
| ec1ef9099f | |||
| ac724c7e6c | |||
| ec25835525 | |||
| d4841a641c | |||
| 5612460720 | |||
| 465ea6429f | |||
| ed9057ca83 | |||
| 14ced962db | |||
| 1aff6b862d | |||
| ef490c4220 | |||
| 0dda83cbbc | |||
| fa4efec3b5 |
@@ -1,7 +0,0 @@
|
|||||||
_darcs
|
|
||||||
B
|
|
||||||
ChangeLog.cvs*
|
|
||||||
TODO.*
|
|
||||||
build
|
|
||||||
doxygen
|
|
||||||
maint
|
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
syntax: regexp
|
||||||
|
|
||||||
|
^\.bzr
|
||||||
|
^ChangeLog
|
||||||
|
^Makevars.global
|
||||||
|
^build
|
||||||
|
^maint
|
||||||
|
|
||||||
|
syntax: glob
|
||||||
|
|
||||||
|
.depend
|
||||||
|
Makevars.local
|
||||||
|
|
||||||
|
*.a
|
||||||
|
*.dll
|
||||||
|
*.lib
|
||||||
|
*.py[cdo]
|
||||||
|
*.so
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
doc/*.1
|
||||||
|
doc/*.doc
|
||||||
|
doc/*.html
|
||||||
|
doc/*.man
|
||||||
|
doc/*.ps
|
||||||
|
doc/*.tex
|
||||||
|
|
||||||
|
src/GNUmakefile
|
||||||
|
src/MMakefile
|
||||||
|
src/compress_nrv*
|
||||||
|
src/*.mft
|
||||||
|
src/*.rc
|
||||||
|
|
||||||
|
src/*.d
|
||||||
|
src/*.exe
|
||||||
|
src/*.map
|
||||||
|
src/*.o
|
||||||
|
src/*.obj
|
||||||
|
src/*.out
|
||||||
|
src/*.res
|
||||||
|
src/*.ttp
|
||||||
|
|
||||||
|
stub/**MMakefile
|
||||||
|
stub/**.*-stamp
|
||||||
|
stub/tmp*/*
|
||||||
|
stub/**/tmp*/*
|
||||||
|
|
||||||
|
stub/tools/armpe/armpe_tester
|
||||||
|
|
||||||
|
stub/tools/sstrip/amd64-linux-sstrip
|
||||||
|
stub/tools/sstrip/i386-linux-sstrip
|
||||||
|
stub/tools/sstrip/sstrip
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
140415ffbcef86a42b4d672249927364430d3d38 RELEASE_111
|
||||||
|
223ac5b23f9731ceac9ff8d65167df4900776e36 RELEASE_190
|
||||||
|
2c753c5bf38e7322715e2a5c6c5381111bd7a61a RELEASE_194
|
||||||
|
2ee65b77f9117651e2e5517b2edede23698d73ca RELEASE_196
|
||||||
|
396983c065fc743cb5b9703e266ca87eeff8a6ee RELEASE_291
|
||||||
|
70402aeee6e0e4fc2889658ed8cee44461c0b0a8 RELEASE_200
|
||||||
|
a1c61174f54aac714f59ac20fcba839d71e64c5c RELEASE_292
|
||||||
|
a916a2fe22de45167d25abcb40008315f415221c RELEASE_201
|
||||||
|
a935d577fc7dd9c2c87761c9c702805da6ce1e51 RELEASE_193
|
||||||
|
b0353253b0b3d062eb5adb50d4b665a96620da45 RELEASE_195
|
||||||
|
b82ef51896199484afe5b0553af7d1e59b7ce428 BRANCHPOINT_FOR_upx2.hg
|
||||||
|
c2e0cd4d621b047f254f2def42132a03683ff52c RELEASE_192
|
||||||
|
d276aa09033c24d0981bc3f4fee5628aecc988ad RELEASE_290
|
||||||
|
eb1ce56dce7dd1835964362470610925963b9043 RELEASE_110
|
||||||
|
ed96891ef795bceec6b7ff3ca1ca7764431bfb39 RELEASE_191
|
||||||
|
ef9c7f2c9658d73a9b5ab2ed291483d2bbcd8bc7 RELEASE_300
|
||||||
|
efa52753e366300c0e0ebe20631adcb24ed3c15b RELEASE_293
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
@@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least
|
|||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) 19yy <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Library General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|||||||
@@ -1,36 +1,48 @@
|
|||||||
# Toplevel Makefile for UPX
|
#
|
||||||
|
# UPX toplevel Makefile - needs GNU make 3.81 or better
|
||||||
|
#
|
||||||
|
|
||||||
SHELL = /bin/sh
|
MAKEFLAGS += -rR
|
||||||
|
.SUFFIXES:
|
||||||
|
export SHELL = /bin/sh
|
||||||
|
|
||||||
|
ifneq ($(findstring $(firstword $(MAKE_VERSION)),3.77 3.78 3.78.1 3.79 3.79.1 3.80),)
|
||||||
|
$(error GNU make 3.81 or better is required)
|
||||||
|
endif
|
||||||
|
|
||||||
srcdir = .
|
srcdir = .
|
||||||
top_srcdir = .
|
top_srcdir = .
|
||||||
|
include $(wildcard $(top_srcdir)/Makevars.global ./Makevars.local)
|
||||||
|
|
||||||
|
|
||||||
|
# info: src/stub needs special build tools
|
||||||
|
BUILD_STUB = 0
|
||||||
|
ifneq ($(wildcard $(HOME)/local/bin/bin-upx/.),)
|
||||||
|
BUILD_STUB = 1
|
||||||
|
endif
|
||||||
|
ifneq ($(wildcard $(HOME)/bin/bin-upx/.),)
|
||||||
|
BUILD_STUB = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@echo "UPX info: please choose a target for 'make'"
|
@echo "UPX info: please choose a target for 'make'"
|
||||||
|
|
||||||
all mostlyclean clean distclean maintainer-clean:
|
all mostlyclean clean distclean maintainer-clean:
|
||||||
$(MAKE) -C src/stub/util/sstrip $@
|
ifeq ($(BUILD_STUB),1)
|
||||||
$(MAKE) -C src/stub $@
|
$(MAKE) -C src/stub $@
|
||||||
|
endif
|
||||||
$(MAKE) -C src $@
|
$(MAKE) -C src $@
|
||||||
$(MAKE) -C doc $@
|
$(MAKE) -C doc $@
|
||||||
|
|
||||||
dist: distclean
|
|
||||||
false
|
|
||||||
|
|
||||||
zip:
|
|
||||||
cd .. && rm -f upx-current.zip && zip -r upx-current.zip upx
|
|
||||||
|
|
||||||
cvs-admin-ko:
|
|
||||||
cvs admin -ko .
|
|
||||||
cvs update -P -d
|
|
||||||
|
|
||||||
|
ifneq ($(wildcard .hg/data/.),)
|
||||||
|
# automatically generate ChangeLog from local Mercurial repo
|
||||||
ChangeLog:
|
ChangeLog:
|
||||||
perl $(srcdir)/scripts/cvs2cl.pl --utc -f ChangeLog.cvs
|
hg log --style=changelog > $@
|
||||||
|
.PHONY: ChangeLog
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
.PHONY: default all mostlyclean clean distclean maintainer-clean
|
||||||
.PHONY: dist cvs-admin-ko ChangeLog
|
|
||||||
|
|
||||||
.NOEXPORT:
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,104 @@
|
|||||||
User visible changes for UPX
|
User visible changes for UPX
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
[ UNSTABLE BETA VERSION - please see README.1ST for some more info ]
|
Changes in 3.01 (31 Jul 2007):
|
||||||
|
* new options --no-mode, --no-owner and --no-time to disable preservation
|
||||||
|
of mode (file permissions), file ownership and timestamps.
|
||||||
|
* dos/exe: fixed an incorrect error message caused by a bug in
|
||||||
|
relocation handling
|
||||||
|
* new format linux/mipsel supports ELF on [32-bit] R3000
|
||||||
|
* fix argv[0] on PowerPC with --lzma
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.00 (27 Apr 2007):
|
||||||
|
* watcom/le & tmt/adam: fixed a problem when using certain filters
|
||||||
|
|
||||||
|
Changes in 2.93 beta (08 Mar 2007):
|
||||||
|
* new formats Mach/i386 and Mach/fat support Mac OS X i686 and
|
||||||
|
Universal binaries [i686 and PowerPC only]
|
||||||
|
* dos/exe: LZMA is now also supported for 16-bit dos/exe. Please note that
|
||||||
|
you have to explicitly use '--lzma' even for '--ultra-brute' here
|
||||||
|
because runtime decompression is about 30 times slower than NRV -
|
||||||
|
which is really noticeable on old machines.
|
||||||
|
* dos/exe: fixed a rarely occuring bug in relocation handling
|
||||||
|
* win32/pe & arm/pe: better icon compression handling
|
||||||
|
|
||||||
|
Changes in 2.92 beta (23 Jan 2007):
|
||||||
|
* new option '--ultra-brute' which tries even more variants
|
||||||
|
* slightly improved compression ratio for some files when
|
||||||
|
using '--brute' or '--ultra-brute'
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 2.91 beta (29 Nov 2006):
|
||||||
|
* assorted bug fixes
|
||||||
|
* arm/pe: fix "missing" icon & version info resource problem for wince 5
|
||||||
|
* win32/pe & arm/pe: added option --compress-icons=3 to compress all icons
|
||||||
|
|
||||||
|
Changes in 2.90 beta (08 Oct 2006):
|
||||||
|
* LZMA algorithm support for most of the 32-bit and 64-bit file formats;
|
||||||
|
use new option '--lzma' to enable
|
||||||
|
* new format: BSD/elf386 supporting FreeBSD, NetBSD and OpenBSD
|
||||||
|
via auto-detection of PT_NOTE or EI_OSABI
|
||||||
|
* arm/pe: all the NRV compression methods are now supported
|
||||||
|
(only NRV2D is missing in thumb mode)
|
||||||
|
* linux/elf386, linux/ElfAMD: remember /proc/self/exe in environment
|
||||||
|
* major source code changes: the runtime decompression stubs are now
|
||||||
|
built from internal ELF objects
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
Changes in 2.03 (07 Nov 2006):
|
||||||
|
* bvmlinuz/386: fix for kernels not at 0x100000; also allow x86_64
|
||||||
|
* linux/elf386: work around Linux kernel bug (0-length .bss needs PF_W)
|
||||||
|
|
||||||
|
Changes in 2.02 (13 Aug 2006):
|
||||||
|
* linux/386: work around Linux kernel bug (".bss" requires PF_W)
|
||||||
|
* linux/ppc32, mach/ppc32: compressed programs now work on a 405 CPU
|
||||||
|
* vmlinuz/386: fixed zlib uncompression problem on DOS
|
||||||
|
|
||||||
|
Changes in 2.01 (06 Jun 2006):
|
||||||
|
* arm/pe: better DLL support
|
||||||
|
* dos/exe: device driver support added
|
||||||
|
* linux/386: Fix --force-execve for PaX, grSecurity, and strict SELinux.
|
||||||
|
/tmp must support execve(); therefore /tmp cannot be mounted 'noexec'.
|
||||||
|
* win32/pe & arm/pe: added new option '--keep-resource=' for
|
||||||
|
excluding selected resources from compression
|
||||||
|
|
||||||
|
Changes in 2.00 (27 Apr 2006):
|
||||||
|
* linux/386: the stub now prints an error message if some strict
|
||||||
|
SELinux mode does prevent runtime decompression and execution
|
||||||
|
(for a fully SELinux-compatible but otherwise inferior compression
|
||||||
|
format you can use the '--force-execve' option)
|
||||||
|
* linux/386: worked around a problem where certain Linux kernels
|
||||||
|
clobber the %ebx register during a syscall
|
||||||
|
* win32/pe: disable filters for files with broken PE headers
|
||||||
|
|
||||||
|
Changes in 1.96 beta (13 Apr 2006):
|
||||||
|
* arm/pe: added filter support
|
||||||
|
* win32/pe: removed an unnecessary check so that Delphi 2006 and
|
||||||
|
Digital Mars C++ programs finally are supported
|
||||||
|
|
||||||
|
Changes in 1.95 beta (09 Apr 2006):
|
||||||
|
* arm/pe: added DLL support
|
||||||
|
* arm/pe: added thumb mode stub support
|
||||||
|
* arm/pe: added unpacking support
|
||||||
|
* win32/pe: really worked around R6002 runtime errors
|
||||||
|
|
||||||
|
Changes in 1.94 beta (11 Mar 2006):
|
||||||
|
* new format: added support for arm/pe (ARM executables running on WinCE)
|
||||||
|
* new format: added support for linux elf/amd64
|
||||||
|
* new format: added support for linux elf/ppc32
|
||||||
|
* new format: added support for mach/ppc32 (Apple Mac OS X)
|
||||||
|
* win32/pe: hopefully working "load config" support
|
||||||
|
* win32/pe: R6002 runtime errors worked around
|
||||||
|
* win32/pe: the stub now clears the dirty stack
|
||||||
|
|
||||||
|
Changes in 1.93 beta (07 Feb 2005):
|
||||||
|
* vmlinuz/386: fixes to support more kernels
|
||||||
|
|
||||||
Changes in 1.92 beta (20 Jul 2004):
|
Changes in 1.92 beta (20 Jul 2004):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
* win32/pe: added option '--strip-loadconf' to strip the SEH load
|
||||||
* win32/pe: added option `--strip-loadconf' to strip the SEH load config section
|
config section [NOTE: this option is obsolete since UPX 1.94]
|
||||||
* win32/pe: try to detect .NET (win32/net) files [not yet supported by UPX]
|
* win32/pe: try to detect .NET (win32/net) files [not yet supported by UPX]
|
||||||
* vmlinux/386: new format that directly supports building Linux kernels
|
* vmlinux/386: new format that directly supports building Linux kernels
|
||||||
* source code: now compiles cleanly under Win64
|
* source code: now compiles cleanly under Win64
|
||||||
@@ -17,7 +110,7 @@ Changes in 1.91 beta (30 Jun 2004):
|
|||||||
* vmlinuz/386: added support for recent kernels
|
* vmlinuz/386: added support for recent kernels
|
||||||
* watcom/le: don't crash on files without relocations
|
* watcom/le: don't crash on files without relocations
|
||||||
* win32/pe: stricter checks of some PE values
|
* win32/pe: stricter checks of some PE values
|
||||||
* option `--brute' now implies `--crp-ms=999999'.
|
* option '--brute' now implies '--crp-ms=999999'.
|
||||||
* source code: much improved portability using ACC, the
|
* source code: much improved portability using ACC, the
|
||||||
Automatic Compiler Configuration
|
Automatic Compiler Configuration
|
||||||
* source code: compile fixes for strict ISO C++ compilers
|
* source code: compile fixes for strict ISO C++ compilers
|
||||||
@@ -25,17 +118,15 @@ Changes in 1.91 beta (30 Jun 2004):
|
|||||||
* re-synced with upx 1.25 branch
|
* re-synced with upx 1.25 branch
|
||||||
|
|
||||||
Changes in 1.90 beta (11 Nov 2002):
|
Changes in 1.90 beta (11 Nov 2002):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
|
||||||
* implemented several new options for finer compression control:
|
* implemented several new options for finer compression control:
|
||||||
`--all-methods', `--all-filters' and `--brute'
|
'--all-methods', '--all-filters' and '--brute'
|
||||||
* ps1/exe: new format - UPX now supports PlayStation One programs
|
* ps1/exe: new format - UPX now supports PlayStation One programs
|
||||||
* linux/386: added the option `--force-execve'
|
* linux/386: added the option '--force-execve'
|
||||||
* vmlinuz/386: better kernel detection and sanity checks
|
* vmlinuz/386: better kernel detection and sanity checks
|
||||||
* re-synced with upx 1.24 branch
|
* re-synced with upx 1.24 branch
|
||||||
* documentation updates
|
* documentation updates
|
||||||
|
|
||||||
Changes in 1.11 beta (20 Dec 2000):
|
Changes in 1.11 beta (20 Dec 2000):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
|
||||||
* vmlinuz/386: new format - UPX now supports bootable linux kernels
|
* vmlinuz/386: new format - UPX now supports bootable linux kernels
|
||||||
* linux/elf386: added the new ELF direct-to-memory executable format - no
|
* linux/elf386: added the new ELF direct-to-memory executable format - no
|
||||||
more temp files are needed for decompression!
|
more temp files are needed for decompression!
|
||||||
@@ -75,9 +166,9 @@ Changes in 1.22 (27 Jun 2002)
|
|||||||
Digital Mars C++ and Watcom C++
|
Digital Mars C++ and Watcom C++
|
||||||
|
|
||||||
Changes in 1.21 (01 Jun 2002)
|
Changes in 1.21 (01 Jun 2002)
|
||||||
* New option `--crp-ms=' for slightly better compression at the cost
|
* New option '--crp-ms=' for slightly better compression at the cost
|
||||||
of higher memory requirements during compression.
|
of higher memory requirements during compression.
|
||||||
Try `upx --best --crp-ms=100000'. See the docs for more info.
|
Try 'upx --best --crp-ms=100000'. See the docs for more info.
|
||||||
* source code: portability fixes
|
* source code: portability fixes
|
||||||
* source code: compile fixes for g++ 3.0 and g++ 3.1
|
* source code: compile fixes for g++ 3.0 and g++ 3.1
|
||||||
|
|
||||||
@@ -91,7 +182,6 @@ Changes in 1.20 (23 May 2001)
|
|||||||
our unstable development releases 1.1x and 1.9x]
|
our unstable development releases 1.1x and 1.9x]
|
||||||
|
|
||||||
Changes in 1.08 (30 Apr 2001)
|
Changes in 1.08 (30 Apr 2001)
|
||||||
* INFO: http://upx.sourceforge.net now is the new permanent UPX home page
|
|
||||||
* new native port to atari/tos
|
* new native port to atari/tos
|
||||||
* win32/pe: shortened the identstring
|
* win32/pe: shortened the identstring
|
||||||
* source code: portability fixes - UPX now builds cleanly under m68k CPUs
|
* source code: portability fixes - UPX now builds cleanly under m68k CPUs
|
||||||
@@ -116,7 +206,7 @@ Changes in 1.05 (24 Jan 2001)
|
|||||||
at the unstable UPX 1.1x beta versions for that)
|
at the unstable UPX 1.1x beta versions for that)
|
||||||
|
|
||||||
Changes in 1.04 (19 Dec 2000)
|
Changes in 1.04 (19 Dec 2000)
|
||||||
* dos/exe: fixed an internal error when using `--no-reloc'
|
* dos/exe: fixed an internal error when using '--no-reloc'
|
||||||
* win32/pe: fixed a rare bug in the relocation handling code
|
* win32/pe: fixed a rare bug in the relocation handling code
|
||||||
* some tunings for the default compression level
|
* some tunings for the default compression level
|
||||||
|
|
||||||
@@ -124,7 +214,7 @@ Changes in 1.03 (30 Nov 2000)
|
|||||||
* linked with a new version of the NRV compression library:
|
* linked with a new version of the NRV compression library:
|
||||||
- improved compression ratio a little bit
|
- improved compression ratio a little bit
|
||||||
- overall significantly faster compression
|
- overall significantly faster compression
|
||||||
- much faster when using high compression levels like `-9' or `--best'
|
- much faster when using high compression levels like '-9' or '--best'
|
||||||
- much faster with large files
|
- much faster with large files
|
||||||
* atari/tos: added support for FreeMiNT
|
* atari/tos: added support for FreeMiNT
|
||||||
* the 32-bit DOS version now uses the new CWSDSTUB extender
|
* the 32-bit DOS version now uses the new CWSDSTUB extender
|
||||||
@@ -132,7 +222,7 @@ Changes in 1.03 (30 Nov 2000)
|
|||||||
Changes in 1.02 (13 Sep 2000)
|
Changes in 1.02 (13 Sep 2000)
|
||||||
* watcom/le: fixed a problem with the Causeway extender
|
* watcom/le: fixed a problem with the Causeway extender
|
||||||
* win32/pe: don't automatically strip relocs if they seem needed
|
* win32/pe: don't automatically strip relocs if they seem needed
|
||||||
* support multiple backup generations when using `-k'
|
* support multiple backup generations when using '-k'
|
||||||
* updated the console screen driver
|
* updated the console screen driver
|
||||||
|
|
||||||
Changes in 1.01 (09 Apr 2000)
|
Changes in 1.01 (09 Apr 2000)
|
||||||
@@ -160,7 +250,7 @@ Changes in 0.99.1 (29 Feb 2000)
|
|||||||
|
|
||||||
Changes in 0.99 (25 Feb 2000)
|
Changes in 0.99 (25 Feb 2000)
|
||||||
* FULL SOURCE CODE RELEASED UNDER THE TERMS OF THE GNU GPL
|
* FULL SOURCE CODE RELEASED UNDER THE TERMS OF THE GNU GPL
|
||||||
* win32/pe: changed default to `--strip-relocs=1'
|
* win32/pe: changed default to '--strip-relocs=1'
|
||||||
* dos/com and dos/sys: fixed a bad decompressor problem
|
* dos/com and dos/sys: fixed a bad decompressor problem
|
||||||
* linux/386: the counter for the progress indicator was off by one
|
* linux/386: the counter for the progress indicator was off by one
|
||||||
|
|
||||||
@@ -183,7 +273,7 @@ Changes in 0.91 (13 Nov 1999)
|
|||||||
* dos/exe: correctly restore cs when uncompressing
|
* dos/exe: correctly restore cs when uncompressing
|
||||||
|
|
||||||
Changes in 0.90 (10 Nov 1999)
|
Changes in 0.90 (10 Nov 1999)
|
||||||
* all formats: `--overlay=copy' now is the default overlay mode
|
* all formats: '--overlay=copy' now is the default overlay mode
|
||||||
* improved compression ratio for most files
|
* improved compression ratio for most files
|
||||||
* win32/pe: uncompression is finally supported
|
* win32/pe: uncompression is finally supported
|
||||||
* win32/pe: never compress REGISTRY resources
|
* win32/pe: never compress REGISTRY resources
|
||||||
@@ -193,7 +283,7 @@ Changes in 0.90 (10 Nov 1999)
|
|||||||
* win32/pe: somewhat less memory is required during compression
|
* win32/pe: somewhat less memory is required during compression
|
||||||
* linux/386: fixed compression of scripts which was broken since 0.71
|
* linux/386: fixed compression of scripts which was broken since 0.71
|
||||||
* linux/386: more FreeBSD compatibility issues
|
* linux/386: more FreeBSD compatibility issues
|
||||||
* changed option: `-i' now prints some more details during compression
|
* changed option: '-i' now prints some more details during compression
|
||||||
(not finished yet)
|
(not finished yet)
|
||||||
|
|
||||||
Changes in 0.84 (04 Oct 1999)
|
Changes in 0.84 (04 Oct 1999)
|
||||||
@@ -209,7 +299,7 @@ Changes in 0.83 (17 Sep 1999)
|
|||||||
Changes in 0.82 (16 Aug 1999)
|
Changes in 0.82 (16 Aug 1999)
|
||||||
* dos/exe: fixed a decompressor bug which could cause crash on some files
|
* dos/exe: fixed a decompressor bug which could cause crash on some files
|
||||||
* linux/386: section headers are now stripped from the stub so that
|
* linux/386: section headers are now stripped from the stub so that
|
||||||
`strip' won't ruin a compressed file any longer
|
'strip' won't ruin a compressed file any longer
|
||||||
* wc/le: support for stack not in the last object disabled again
|
* wc/le: support for stack not in the last object disabled again
|
||||||
* win32/pe: removed some unneeded data
|
* win32/pe: removed some unneeded data
|
||||||
|
|
||||||
@@ -218,32 +308,32 @@ Changes in 0.81 (04 Aug 1999)
|
|||||||
* dos/com: fixed an internal error that could happen with very small files
|
* dos/com: fixed an internal error that could happen with very small files
|
||||||
|
|
||||||
Changes in 0.80 (03 Aug 1999)
|
Changes in 0.80 (03 Aug 1999)
|
||||||
* you can set some default options in the environment var `UPX'
|
* you can set some default options in the environment var 'UPX'
|
||||||
* dos/com: the decompressor stub now checks for enough free memory
|
* dos/com: the decompressor stub now checks for enough free memory
|
||||||
* dos/exe: decompressor rewritten, some bugs are fixed
|
* dos/exe: decompressor rewritten, some bugs are fixed
|
||||||
* dos/exe: new option `--no-reloc': no relocation data is put into
|
* dos/exe: new option '--no-reloc': no relocation data is put into
|
||||||
the DOS header
|
the DOS header
|
||||||
* tmt/adam: added support for more stubs, detect already packed files
|
* tmt/adam: added support for more stubs, detect already packed files
|
||||||
* tmt/adam: new option `--copy-overlay'
|
* tmt/adam: new option '--copy-overlay'
|
||||||
* wc/le: reduced memory requirement during uncompression
|
* wc/le: reduced memory requirement during uncompression
|
||||||
* wc/le: support files which do not contain their stack in the last object
|
* wc/le: support files which do not contain their stack in the last object
|
||||||
* wc/le: fixed a bug which could cause a crash, improved relocation
|
* wc/le: fixed a bug which could cause a crash, improved relocation
|
||||||
handling
|
handling
|
||||||
* wc/le: new option `--copy-overlay'
|
* wc/le: new option '--copy-overlay'
|
||||||
* win32/pe: `--compress-icons=2' is now the default
|
* win32/pe: '--compress-icons=2' is now the default
|
||||||
* win32/pe: even better TLS support
|
* win32/pe: even better TLS support
|
||||||
* win32/pe: versioninfo works on NT
|
* win32/pe: versioninfo works on NT
|
||||||
* win32/pe: import by ordinal from kernel32.dll works
|
* win32/pe: import by ordinal from kernel32.dll works
|
||||||
* win32/pe: other import improvements: importing a nonexistant DLL
|
* win32/pe: other import improvements: importing a nonexistent DLL
|
||||||
results in a usual Windows message, importing a nonexistant function
|
results in a usual Windows message, importing a nonexistent function
|
||||||
results in program exit (instead of crash ;-)
|
results in program exit (instead of crash ;-)
|
||||||
* win32/pe: new option: `--compress-resources=0'
|
* win32/pe: new option: '--compress-resources=0'
|
||||||
* win32/pe: reduced memory requirement during uncompression, some
|
* win32/pe: reduced memory requirement during uncompression, some
|
||||||
files might even require LESS memory when they're compressed
|
files might even require LESS memory when they're compressed
|
||||||
* win32/pe: TYPELIBs should work now
|
* win32/pe: TYPELIBs should work now
|
||||||
* win32/pe: improved relocation handling, 16-bit relocations should work
|
* win32/pe: improved relocation handling, 16-bit relocations should work
|
||||||
* win32/pe: new option `--strip-relocs' (only if you know what you are doing)
|
* win32/pe: new option '--strip-relocs' (only if you know what you are doing)
|
||||||
* win32/pe: new option `--copy-overlay'
|
* win32/pe: new option '--copy-overlay'
|
||||||
* important internal changes: now the stubs are built at runtime
|
* important internal changes: now the stubs are built at runtime
|
||||||
|
|
||||||
Changes in 0.72 (12 May 1999)
|
Changes in 0.72 (12 May 1999)
|
||||||
@@ -257,20 +347,20 @@ Changes in 0.72 (12 May 1999)
|
|||||||
* linux/386: minor decompressor stub updates, nicer progress bar
|
* linux/386: minor decompressor stub updates, nicer progress bar
|
||||||
|
|
||||||
Changes in 0.71 (19 Apr 1999)
|
Changes in 0.71 (19 Apr 1999)
|
||||||
* dos/exe: added option `--no-overlay'
|
* dos/exe: added option '--no-overlay'
|
||||||
* linux/386: various improvements in the stub, most notably the
|
* linux/386: various improvements in the stub, most notably the
|
||||||
overhead for an extra cleanup process has been removed
|
overhead for an extra cleanup process has been removed
|
||||||
* win32/pe: added support for export forwarders
|
* win32/pe: added support for export forwarders
|
||||||
* win32/pe: added support for DLLs without entry point or imports
|
* win32/pe: added support for DLLs without entry point or imports
|
||||||
* win32/pe: yet another .bss fix
|
* win32/pe: yet another .bss fix
|
||||||
* win32/pe: new option `--compress-icons=2': compress all icons
|
* win32/pe: new option '--compress-icons=2': compress all icons
|
||||||
which are not in the first icon directory
|
which are not in the first icon directory
|
||||||
* win32/pe: rearranged stub to avoid false alerts from some virus scanners
|
* win32/pe: rearranged stub to avoid false alerts from some virus scanners
|
||||||
|
|
||||||
Changes in 0.70 (30 Mar 1999)
|
Changes in 0.70 (30 Mar 1999)
|
||||||
* added support for linux/386 executables
|
* added support for linux/386 executables
|
||||||
* improved compression ratio quite a bit
|
* improved compression ratio quite a bit
|
||||||
* added new compression level `--best' to squeeze out even some more bytes
|
* added new compression level '--best' to squeeze out even some more bytes
|
||||||
* win32/pe: TLS support is much better now
|
* win32/pe: TLS support is much better now
|
||||||
* win32/pe: --compress-icons=0 should now work as well
|
* win32/pe: --compress-icons=0 should now work as well
|
||||||
* the usual minor fixes for win32/pe
|
* the usual minor fixes for win32/pe
|
||||||
@@ -287,7 +377,7 @@ Changes in 0.60 (06 Mar 1999)
|
|||||||
* win32/pe: fixed file corruption when the size of the export data is invalid
|
* win32/pe: fixed file corruption when the size of the export data is invalid
|
||||||
* win32/pe: fixed a problem with empty resource data
|
* win32/pe: fixed a problem with empty resource data
|
||||||
* win32/pe: compressed file alignment set to minimum value
|
* win32/pe: compressed file alignment set to minimum value
|
||||||
* win32/pe: made all compressed sections writeable
|
* win32/pe: made all compressed sections writable
|
||||||
* fixed some other win32/pe bugs
|
* fixed some other win32/pe bugs
|
||||||
* fixed an address optimization problem for some not Watcom LE files
|
* fixed an address optimization problem for some not Watcom LE files
|
||||||
* fixed a bug which could make UPX hang when an exe header contained
|
* fixed a bug which could make UPX hang when an exe header contained
|
||||||
@@ -311,7 +401,7 @@ Changes in 0.40 (05 Oct 1998)
|
|||||||
* fixed a small but fatal bug in dos/sys introduced in 0.30
|
* fixed a small but fatal bug in dos/sys introduced in 0.30
|
||||||
* fixed a rare bug in dos/exe
|
* fixed a rare bug in dos/exe
|
||||||
* worked around a bug in djgpp's strip 2.8
|
* worked around a bug in djgpp's strip 2.8
|
||||||
* Allegro packfile support should work now
|
* djgpp/coff: Allegro packfile support should work now
|
||||||
* added dos/exeh compression method (works on 386+)
|
* added dos/exeh compression method (works on 386+)
|
||||||
|
|
||||||
Changes in 0.30 (27 Jul 1998)
|
Changes in 0.30 (27 Jul 1998)
|
||||||
@@ -328,3 +418,5 @@ Changes in 0.20 (05 Jul 1998)
|
|||||||
Changes in 0.05 (26 May 1998)
|
Changes in 0.05 (26 May 1998)
|
||||||
* first public beta release
|
* first public beta release
|
||||||
|
|
||||||
|
|
||||||
|
# vim:set syntax=off tw=0 ts=4 sw=4 et: -*- coding: utf-8 -*-
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -42,8 +42,6 @@ More formats:
|
|||||||
- freebsd/386 (generic), freebsd/elf386 (specialized).
|
- freebsd/386 (generic), freebsd/elf386 (specialized).
|
||||||
Probably could share most of the linux code.
|
Probably could share most of the linux code.
|
||||||
|
|
||||||
- Windows CE
|
|
||||||
|
|
||||||
- add support for self-extracting HTML pages using a Javascript stub
|
- add support for self-extracting HTML pages using a Javascript stub
|
||||||
(like the AlgART HTML Packer "AHP")
|
(like the AlgART HTML Packer "AHP")
|
||||||
|
|
||||||
@@ -58,8 +56,6 @@ Existing formats:
|
|||||||
|
|
||||||
- dos/exe: implement filter support
|
- dos/exe: implement filter support
|
||||||
|
|
||||||
- dos/sys: add support for sys/exe combos
|
|
||||||
|
|
||||||
- linux/i386:
|
- linux/i386:
|
||||||
- use the new assembly preprocessor stuff (ie. process the file
|
- use the new assembly preprocessor stuff (ie. process the file
|
||||||
headers internally)
|
headers internally)
|
||||||
@@ -70,8 +66,7 @@ Existing formats:
|
|||||||
|
|
||||||
- win32/pe: display a nice dialog box in the stub in case
|
- win32/pe: display a nice dialog box in the stub in case
|
||||||
of problems (like importing a DLL or function fails)
|
of problems (like importing a DLL or function fails)
|
||||||
- win32/pe: finer control over resource compression, per section
|
- win32/pe: per section compression
|
||||||
compression
|
|
||||||
|
|
||||||
|
|
||||||
Compression ratio:
|
Compression ratio:
|
||||||
|
|||||||
@@ -8,32 +8,11 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WARNING - UNSTABLE BETA VERSION
|
|
||||||
===============================
|
|
||||||
|
|
||||||
All versions 1.9x are unstable beta releases - use them only for testing,
|
|
||||||
and never distribute a program that is packed with them !
|
|
||||||
There will be hidden bugs. Really.
|
|
||||||
|
|
||||||
The current stable release is 1.25, and the next stable release
|
|
||||||
will be called version 2.00.
|
|
||||||
|
|
||||||
The main news since 1.25 are:
|
|
||||||
- slightly better compression using the new NRV2E algorithm
|
|
||||||
- new options for compression tuining (e.g. `--brute')
|
|
||||||
- support for bootable Linux kernels ("vmlinuz/386")
|
|
||||||
- support for Linux kernel building ("vmlinux/386")
|
|
||||||
- direct Linux ELF-to-memory decompression ("linux/elf386") and
|
|
||||||
shell-to-memory decompression ("linux/sh386")
|
|
||||||
- support for playstation exes ("ps1/exe")
|
|
||||||
- lots of new bugs ;-) take care
|
|
||||||
|
|
||||||
|
|
||||||
WELCOME
|
WELCOME
|
||||||
=======
|
=======
|
||||||
|
|
||||||
@@ -58,7 +37,7 @@ and run exactly as before, with no runtime or memory penalty for most
|
|||||||
of the supported formats.
|
of the supported formats.
|
||||||
|
|
||||||
UPX supports a number of different executable formats, including
|
UPX supports a number of different executable formats, including
|
||||||
Windows 95/98/ME/NT/2000/XP programs and DLLs, DOS programs,
|
Windows 95/98/ME/NT/2000/XP/CE programs and DLLs, DOS programs,
|
||||||
and Linux executables and kernels.
|
and Linux executables and kernels.
|
||||||
|
|
||||||
UPX is free software distributed under the term of the GNU General
|
UPX is free software distributed under the term of the GNU General
|
||||||
@@ -76,8 +55,8 @@ UPX aims to be Commercial Quality Freeware.
|
|||||||
SHORT DOCUMENTATION
|
SHORT DOCUMENTATION
|
||||||
===================
|
===================
|
||||||
|
|
||||||
`upx program.exe' will compress a program or DLL. For best compression
|
'upx program.exe' will compress a program or DLL. For best compression
|
||||||
results try `upx --best program.exe'.
|
results try 'upx --brute program.exe'.
|
||||||
|
|
||||||
Please see the file UPX.DOC for the full documentation. The files
|
Please see the file UPX.DOC for the full documentation. The files
|
||||||
NEWS and BUGS also contain various tidbits of information.
|
NEWS and BUGS also contain various tidbits of information.
|
||||||
@@ -91,7 +70,7 @@ UPX comes with ABSOLUTELY NO WARRANTY; for details see the file LICENSE.
|
|||||||
Having said that, we think that UPX is quite stable now. Indeed we
|
Having said that, we think that UPX is quite stable now. Indeed we
|
||||||
have compressed lots of files without any problems. Also, the
|
have compressed lots of files without any problems. Also, the
|
||||||
current version has undergone several months of beta testing -
|
current version has undergone several months of beta testing -
|
||||||
actually it's more than 4 years since our first public beta.
|
actually it's almost 8 years since our first public beta.
|
||||||
|
|
||||||
This is the first production quality release, and we plan that future
|
This is the first production quality release, and we plan that future
|
||||||
releases will be backward compatible with this version.
|
releases will be backward compatible with this version.
|
||||||
@@ -117,7 +96,7 @@ THE FUTURE
|
|||||||
- We will *NOT* add any sort of protection and/or encryption.
|
- We will *NOT* add any sort of protection and/or encryption.
|
||||||
This only gives people a false feeling of security because
|
This only gives people a false feeling of security because
|
||||||
by definition all protectors/compressors can be broken.
|
by definition all protectors/compressors can be broken.
|
||||||
And don't trust any advertisment of authors of other executable
|
And don't trust any advertisement of authors of other executable
|
||||||
compressors about this topic - just do a websearch on "unpackers"...
|
compressors about this topic - just do a websearch on "unpackers"...
|
||||||
|
|
||||||
- Fix all remaining bugs - keep your reports coming ;-)
|
- Fix all remaining bugs - keep your reports coming ;-)
|
||||||
@@ -129,8 +108,9 @@ THE FUTURE
|
|||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
Copyright (C) 2000-2007 John F. Reiser
|
||||||
|
|
||||||
This program may be used freely, and you are welcome to
|
This program may be used freely, and you are welcome to
|
||||||
redistribute it under certain conditions.
|
redistribute it under certain conditions.
|
||||||
@@ -149,7 +129,7 @@ Markus & Laszlo
|
|||||||
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
markus@oberhumer.com ml1050@users.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+7
-17
@@ -8,26 +8,16 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
|
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
MAJOR NEWS IN UPX 3
|
||||||
|
===================
|
||||||
|
|
||||||
WARNING - UNSTABLE BETA VERSION
|
The main news since UPX 2 are:
|
||||||
===============================
|
|
||||||
|
|
||||||
All versions 1.9x are unstable beta releases - use them only for testing,
|
* new format: added support for linux elf/arm
|
||||||
and never distribute a program that is packed with them !
|
|
||||||
There will be hidden bugs. Really.
|
|
||||||
|
|
||||||
The current stable release is 1.25, and the next stable release
|
* better compression using the LZMA algorithm (option '--lzma')
|
||||||
will be called version 2.00.
|
|
||||||
|
|
||||||
The main news since 1.25 are:
|
|
||||||
- slightly better compression using the new NRV2E algorithm
|
|
||||||
- new options for compression tuining (e.g. `--brute')
|
|
||||||
- support for bootable Linux kernels ("vmlinuz/386")
|
|
||||||
- support for Linux kernel building ("vmlinux/386")
|
|
||||||
- direct Linux ELF-to-memory decompression ("linux/elf386") and
|
|
||||||
shell-to-memory decompression ("linux/sh386")
|
|
||||||
- support for playstation exes ("ps1/exe")
|
|
||||||
- lots of new bugs ;-) take care
|
|
||||||
|
|
||||||
|
|||||||
+20
-28
@@ -69,46 +69,39 @@ Tools needed to build/modify the UPX sources
|
|||||||
- A C++ compiler supporting inner classes, templates, exceptions
|
- A C++ compiler supporting inner classes, templates, exceptions
|
||||||
and RTTI.
|
and RTTI.
|
||||||
|
|
||||||
- GNU make 3.80 for Win32
|
- GNU make 3.80 or better (GNU make 3.81 recommened).
|
||||||
http://www.cygwin.com/
|
|
||||||
|
|
||||||
- GNU make 3.80 for DOS
|
|
||||||
http://www.delorie.com/djgpp/
|
|
||||||
|
|
||||||
|
|
||||||
To compile the packer sources
|
To compile the packer sources
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
set the environment variable UCLDIR to point to your UCL installation, e.g.
|
Set the environment variable UPX_UCLDIR to point to your
|
||||||
|
UCL build directory, e.g.
|
||||||
|
|
||||||
set UCLDIR=c:\src\ucl-1.02 (DOS / Windows)
|
set UPX_UCLDIR=c:\src\ucl-1.03 (DOS / Windows)
|
||||||
export UCLDIR=$HOME/local/src/ucl-1.02 (Unix)
|
export UPX_UCLDIR=$HOME/local/src/ucl-1.03 (Unix)
|
||||||
|
|
||||||
then type
|
Set the environment variable UPX_LZMADIR to point to your
|
||||||
|
to your unpacked lzma443.tar.bz2 source directory, e.g.
|
||||||
|
|
||||||
make target=linux # linux
|
export UPX_LZMADIR=$HOME/local/src/lzma-4.43 (Unix)
|
||||||
make target=djgpp2 # dos32 - djgpp2
|
|
||||||
make target=cygwin # win32 - cygwin 1.3.x
|
Finally type
|
||||||
make target=mingw32 # win32 - mingw32
|
|
||||||
make target=no-cygwin # win32 - mingw32 as included in cygwin
|
make
|
||||||
|
|
||||||
|
|
||||||
If you want to modify the stub sources you'll also need
|
If you want to modify the stub sources you'll also need
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
|
||||||
- Nasm 0.98.38 - the Netwide Assembler
|
- GNU make 3.81 or better
|
||||||
http://upx.sourceforge.net/download/tools/
|
http://savannah.gnu.org/projects/make/
|
||||||
http://sourceforge.net/projects/nasm/
|
|
||||||
|
|
||||||
- A68K - a 68000 macro assembler
|
- Perl & Python
|
||||||
http://upx.sourceforge.net/download/tools/
|
|
||||||
|
|
||||||
- djasm - an assembler for the djgpp stub
|
- A number of cross-assemblers and cross-compilers - precompiled
|
||||||
http://upx.sourceforge.net/download/tools/
|
binaries for i386-linux hosts are available from
|
||||||
|
http://sourceforge.net/project/showfiles.php?group_id=2331
|
||||||
- Perl 5.6 or better
|
|
||||||
|
|
||||||
- Linux (for the linux/386 stubs)
|
|
||||||
|
|
||||||
|
|
||||||
Misc. notes
|
Misc. notes
|
||||||
@@ -123,9 +116,6 @@ Misc. notes
|
|||||||
stream.
|
stream.
|
||||||
- Use gcc extensions and other compiler specific stuff only through
|
- Use gcc extensions and other compiler specific stuff only through
|
||||||
macros.
|
macros.
|
||||||
- Keep in mind that it should be possible to build UPX on braindead
|
|
||||||
file systems (FAT). Don't use long file names or other things
|
|
||||||
that break building under plain DOS.
|
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
@@ -150,3 +140,5 @@ Patches/Contributions
|
|||||||
|
|
||||||
diff -uNr olddirectory newdirectory
|
diff -uNr olddirectory newdirectory
|
||||||
|
|
||||||
|
|
||||||
|
# vi:ts=4:et
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -39,12 +39,12 @@ Ice
|
|||||||
for debugging the PE headersize problem down
|
for debugging the PE headersize problem down
|
||||||
Joergen Ibsen <jibz@hotmail.com> and d'b
|
Joergen Ibsen <jibz@hotmail.com> and d'b
|
||||||
for the relocation & address optimization ideas
|
for the relocation & address optimization ideas
|
||||||
John F. Reiser <jreiser@BitWagon.com>
|
|
||||||
for the new Linux executable formats
|
|
||||||
John S. Fine <johnfine@erols.com>
|
John S. Fine <johnfine@erols.com>
|
||||||
for the new version of the dos/exe decompressor
|
for the new version of the dos/exe decompressor
|
||||||
Lukundoo <Lukundoo@softhome.net>
|
Lukundoo <Lukundoo@softhome.net>
|
||||||
for beta testing
|
for beta testing
|
||||||
|
Michael Devore
|
||||||
|
for initial dos/exe device driver support
|
||||||
Oleg V. Volkov <rover@lglobus.ru>
|
Oleg V. Volkov <rover@lglobus.ru>
|
||||||
for various FreeBSD specific informations
|
for various FreeBSD specific informations
|
||||||
The Owl & G-RoM
|
The Owl & G-RoM
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
UPX TODO list. Last updated 2004-07-19.
|
UPX TODO list. Last updated 2006-12-08.
|
||||||
|
|
||||||
|
|
||||||
IMPORTANT PROBLEMS THAT SHOULD BE FIXED SOON:
|
IMPORTANT PROBLEMS THAT SHOULD BE FIXED SOON:
|
||||||
|
|
||||||
- stub ctojr32 needs CPU 486 because of bswap
|
- [None]
|
||||||
|
|
||||||
|
|
||||||
OTHER:
|
OTHER:
|
||||||
|
|
||||||
|
- docs: convert docs from upx.pod to use AsciiDoc
|
||||||
|
|
||||||
- check all <const_cast> to make sure they are not invalid
|
- check all <const_cast> to make sure they are not invalid
|
||||||
|
|
||||||
- throwNotCompressible() is not a real error, so make the output nicer
|
- throwNotCompressible() is not a real error, so make the output nicer
|
||||||
@@ -39,8 +41,6 @@ ALL FORMATS
|
|||||||
- implement `--cpu=486' option to use bswap on the 32-bit formats
|
- implement `--cpu=486' option to use bswap on the 32-bit formats
|
||||||
(if cpu >= 486)
|
(if cpu >= 486)
|
||||||
|
|
||||||
- consider removing "or ebp,-1" when not needed
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT DJGPP2/COFF
|
FORMAT DJGPP2/COFF
|
||||||
==================
|
==================
|
||||||
@@ -84,10 +84,6 @@ FORMAT WATCOM/LE
|
|||||||
|
|
||||||
- handle holes in the file
|
- handle holes in the file
|
||||||
|
|
||||||
- implement compressWithFilters()
|
|
||||||
|
|
||||||
- add a call to verifyOverlappingDecompression()
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT WIN16/NE
|
FORMAT WIN16/NE
|
||||||
===============
|
===============
|
||||||
@@ -103,11 +99,6 @@ FORMAT WIN32/PE
|
|||||||
|
|
||||||
- decrease runtime memory overhead
|
- decrease runtime memory overhead
|
||||||
|
|
||||||
2 - easy - mfx + ml) new switch(es) : do not compress resource types x,y,z
|
|
||||||
or resource names a,b,c
|
|
||||||
|
|
||||||
3 - medium - ml) rebuild exports
|
|
||||||
|
|
||||||
3 - difficult) don't compress the BSS section and other holes.
|
3 - difficult) don't compress the BSS section and other holes.
|
||||||
|
|
||||||
4 - medium - ml) fix when objectalign < 0x1000
|
4 - medium - ml) fix when objectalign < 0x1000
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
upx.1
|
|
||||||
upx.doc
|
|
||||||
upx.html
|
|
||||||
upx.man
|
|
||||||
upx.ps
|
|
||||||
upx.tex
|
|
||||||
+51
-34
@@ -1,34 +1,51 @@
|
|||||||
|
#
|
||||||
|
# UPX doc Makefile - needs GNU make 3.80 or better
|
||||||
|
#
|
||||||
|
|
||||||
|
MAKEFLAGS += -rR
|
||||||
|
.SUFFIXES:
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
top_srcdir = ..
|
# internal make variables
|
||||||
|
comma := ,
|
||||||
|
empty :=
|
||||||
|
space := $(empty) $(empty)
|
||||||
|
tab := $(empty) $(empty)
|
||||||
|
|
||||||
|
# update $PATH for our special stub build tools
|
||||||
|
ifneq ($(wildcard $(HOME)/local/bin/bin-upx/.),)
|
||||||
|
export PATH := $(HOME)/local/bin/bin-upx:$(PATH)
|
||||||
|
endif
|
||||||
|
ifneq ($(wildcard $(HOME)/bin/bin-upx/.),)
|
||||||
|
export PATH := $(HOME)/bin/bin-upx:$(PATH)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# //
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
|
top_srcdir ?= ..
|
||||||
|
|
||||||
PACKAGE = upx
|
PACKAGE = upx
|
||||||
VERSION_DATE = 20 Jul 2004
|
VERSION_DATE := $(shell sed -n 's/^.*UPX_VERSION_DATE_ISO .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
|
||||||
VERSION := $(shell sed -n 's/^.*UPX_VERSION_STRING .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
|
VERSION := $(shell sed -n 's/^.*UPX_VERSION_STRING .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
|
||||||
|
|
||||||
TRIMSPACE = cat
|
RTRIM := sed -e 's/[ $(tab)]*$$//'
|
||||||
TRIMSPACE = sed -e 's/ *$$//'
|
DETAB2 := sed -e 's/$(tab)/ /g'
|
||||||
|
|
||||||
BUILT_SOURCES = upx.1 upx.doc upx.html upx.man upx.ps upx.tex
|
BUILT_SOURCES = upx.1 upx.doc upx.html upx.man upx.ps upx.tex
|
||||||
BUILT_SOURCES = upx.1 upx.doc upx.html
|
BUILT_SOURCES = upx.1 upx.doc upx.html
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
###
|
### targets
|
||||||
###
|
###
|
||||||
|
|
||||||
all: $(BUILT_SOURCES)
|
all: $(BUILT_SOURCES)
|
||||||
|
|
||||||
mostlyclean:
|
mostlyclean clean distclean maintainer-clean:
|
||||||
-rm -f $(BUILT_SOURCES) pod2htm*
|
rm -f $(BUILT_SOURCES) pod2htm*
|
||||||
|
|
||||||
clean: mostlyclean
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
|
|
||||||
maintainer-clean: distclean
|
|
||||||
|
|
||||||
.SUFFIXES: .1 .doc .html .man .pod .ps .tex .texi
|
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
.PHONY: all mostlyclean clean distclean maintainer-clean
|
||||||
|
|
||||||
@@ -37,32 +54,32 @@ maintainer-clean: distclean
|
|||||||
### rules
|
### rules
|
||||||
###
|
###
|
||||||
|
|
||||||
.pod.1:
|
.SUFFIXES: .1 .doc .html .man .pod .ps .tex
|
||||||
pod2man --center=" " --release="$(PACKAGE) $(VERSION)" --date="$(VERSION_DATE)" $< | $(TRIMSPACE) > $@
|
|
||||||
|
|
||||||
.pod.html:
|
%.1 : %.pod
|
||||||
### pod2html $< | $(TRIMSPACE) > $@
|
pod2man --center=" " --release="$(PACKAGE) $(VERSION)" --date="$(VERSION_DATE)" $< | $(RTRIM) > $@
|
||||||
pod2html --noindex $< | $(TRIMSPACE) > $@
|
|
||||||
@-rm -f pod2htm*
|
|
||||||
|
|
||||||
.pod.tex:
|
%.doc : %.pod
|
||||||
|
pod2text < $< | $(RTRIM) > $@
|
||||||
|
|
||||||
|
%.html : %.pod
|
||||||
|
pod2html --noindex $< | $(RTRIM) | $(DETAB2) > $@
|
||||||
|
@rm -f pod2htm*
|
||||||
|
|
||||||
|
%.man : %.1
|
||||||
|
nroff -man $< | $(RTRIM) > $@
|
||||||
|
|
||||||
|
%.ps : %.1
|
||||||
|
groff -man $< | $(RTRIM) > $@
|
||||||
|
|
||||||
|
%.tex : %.pod
|
||||||
pod2latex $<
|
pod2latex $<
|
||||||
|
|
||||||
.pod.doc:
|
|
||||||
pod2text < $< | $(TRIMSPACE) > $@
|
|
||||||
|
|
||||||
.1.man:
|
|
||||||
nroff -man $< | $(TRIMSPACE) > $@
|
|
||||||
|
|
||||||
.1.ps:
|
|
||||||
groff -man $< | $(TRIMSPACE) > $@
|
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
### dependencies
|
### dependencies
|
||||||
###
|
###
|
||||||
|
|
||||||
$(BUILT_SOURCES): $(top_srcdir)/src/version.h Makefile
|
$(BUILT_SOURCES): $(top_srcdir)/src/version.h $(MAKEFILE_LIST)
|
||||||
|
.DELETE_ON_ERROR: $(BUILT_SOURCES)
|
||||||
.NOEXPORT:
|
|
||||||
|
|
||||||
|
|||||||
+19
-3
@@ -1,5 +1,5 @@
|
|||||||
Decompressing ELF Directly to Memory on Linux/x86
|
Decompressing ELF Directly to Memory on Linux/x86
|
||||||
Copyright 2000 John F. Reiser jreiser@BitWagon.com
|
Copyright (C) 2000-2007 John F. Reiser jreiser@BitWagon.com
|
||||||
|
|
||||||
References:
|
References:
|
||||||
<elf.h> definitions for the ELF file format
|
<elf.h> definitions for the ELF file format
|
||||||
@@ -17,7 +17,7 @@ program itself. So, the decompressor program (which contains the
|
|||||||
compressed version of the original executable) must have the same
|
compressed version of the original executable) must have the same
|
||||||
brk() as the original executable. So, the second PT_LOAD
|
brk() as the original executable. So, the second PT_LOAD
|
||||||
ELF "segment" of the compressed program is used only to set the brk(0).
|
ELF "segment" of the compressed program is used only to set the brk(0).
|
||||||
See src/p_lx_elf.cpp, function PackLinuxI386elf::patchLoader().
|
See src/p_lx_elf.cpp, function PackLinuxElf32::generateElfHdr.
|
||||||
All of the decompressor's code, and all of the compressed image
|
All of the decompressor's code, and all of the compressed image
|
||||||
of the original executable, reside in the first PT_LOAD of the
|
of the original executable, reside in the first PT_LOAD of the
|
||||||
decompressor program.
|
decompressor program.
|
||||||
@@ -57,9 +57,25 @@ Subroutine do_xmap() of src/stub/l_lx_elf.c performs the
|
|||||||
"virtual execve()" using the compressed data as source, and stores
|
"virtual execve()" using the compressed data as source, and stores
|
||||||
the decompressed bytes directly into the appropriate virtual addresses.
|
the decompressed bytes directly into the appropriate virtual addresses.
|
||||||
|
|
||||||
Before transfering control to the PT_INTERP "program interpreter",
|
Before transferring control to the PT_INTERP "program interpreter",
|
||||||
minor tricks are required to setup the Elf32_auxv_t entries,
|
minor tricks are required to setup the Elf32_auxv_t entries,
|
||||||
clear the free portion of the stack (to compensate for ld-linux.so.2
|
clear the free portion of the stack (to compensate for ld-linux.so.2
|
||||||
assuming that its automatic stack variables are initialized to zero),
|
assuming that its automatic stack variables are initialized to zero),
|
||||||
and remove (all but 4 bytes of) the decompression program (and
|
and remove (all but 4 bytes of) the decompression program (and
|
||||||
compressed executable) from the address space.
|
compressed executable) from the address space.
|
||||||
|
|
||||||
|
Because the UPX runtime stub removes all traces of the compressed file
|
||||||
|
from the address space, then the Linux kernel erases the symlink
|
||||||
|
/proc/self/exe. Linux stores the pathname argument that was specified
|
||||||
|
to execve() immediately after the '\0' which terminates the character
|
||||||
|
string of the last environment variable [as of execve()]. This is true
|
||||||
|
for at least all Linux 2.6, 2.4, and 2.2 kernels. The pathname is not
|
||||||
|
"bound" to the file as strongly as /proc/self/exe (the file may be changed
|
||||||
|
without affecting the pathname), but the pathname does provide some
|
||||||
|
information. The pathname may be relative to the working directory,
|
||||||
|
so look before any chdir().
|
||||||
|
|
||||||
|
The Elf formats for Linux add an environment variable named " " [three
|
||||||
|
spaces] which saves the results of readlink("/proc/self/exe",,) before
|
||||||
|
the runtime stub unmaps all its pages. As of 2006-10-03 this works
|
||||||
|
for linux/elf386 and linux/ElfAMD.
|
||||||
|
|||||||
+27
-66
@@ -2,16 +2,8 @@ This documentation is written for those brave souls who want to
|
|||||||
understand and/or modify the UPX assembly stubs - the small snippets
|
understand and/or modify the UPX assembly stubs - the small snippets
|
||||||
that do the runtime decompression when a compressed program is started.
|
that do the runtime decompression when a compressed program is started.
|
||||||
|
|
||||||
So, how the runtime stub/loader generation works?
|
If you look at the C++ source files, you can find code fragments like
|
||||||
|
this:
|
||||||
You might have already noticed that for some file formats the loaders
|
|
||||||
are quite simple (linux/i386 & tos) while in the other cases the
|
|
||||||
loaders look very suspicious: they're full of `%ifdef's and contain
|
|
||||||
loads of cryptic comments like `__PERELOC2__'.
|
|
||||||
|
|
||||||
If you look at the C++ source files, however you can notice that these
|
|
||||||
comment strings (without the leading and trailing underscores) are used
|
|
||||||
in the following way (they are all 8 character length strings):
|
|
||||||
|
|
||||||
addLoader("PEMAIN20",
|
addLoader("PEMAIN20",
|
||||||
ih.entry ? "PEDOJUMP" : "PERETURN",
|
ih.entry ? "PEDOJUMP" : "PERETURN",
|
||||||
@@ -19,71 +11,40 @@ in the following way (they are all 8 character length strings):
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
Basically that's all you have to know: when you want to add a section
|
linker->defineSymbol("original_entry", ih.entry);
|
||||||
of assembly code to the runtime loader, you just write
|
|
||||||
|
|
||||||
l_foo.asm
|
and in the assembly files fragments like this:
|
||||||
---------
|
|
||||||
;__FOOBAR00__
|
|
||||||
|
|
||||||
|
section PEISDLL1
|
||||||
|
cmpb [esp + 8], 1
|
||||||
|
jnz reloc_end_jmp
|
||||||
|
|
||||||
|
section PEMAIN21
|
||||||
|
reloc_end_jmp:
|
||||||
|
|
||||||
|
section PERETURN
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
label1:
|
inc eax
|
||||||
jmps label1
|
ret 0x0C
|
||||||
|
section PEDOJUMP
|
||||||
|
jmp original_entry
|
||||||
|
|
||||||
;__FOOBARZZ__
|
Everything works as you would expect. If you want to add the code
|
||||||
|
fragment which is in `section PERETURN' to the runtime stub, then
|
||||||
p_foo.cpp
|
simply use `addLoader("PERETURN")' in the C++ source.
|
||||||
---------
|
|
||||||
|
|
||||||
addLoader("FOOBAR00", NULL);
|
|
||||||
|
|
||||||
This will add the assembly section starting from __FOOBAR00__ and ending
|
|
||||||
before __FOOBARZZ__ to the loader. You can add an %ifdef - %endif pair
|
|
||||||
before these comments if you wish - but these conditionals will NOT be
|
|
||||||
seen by the assembler, they are just syntactic sugar to make the code a
|
|
||||||
little bit more readable and understandable. (Note however, that only
|
|
||||||
%ifdefs which are started on the 1st column are removed by the upx
|
|
||||||
assembly preprocessor program, so you can still use preprocessor
|
|
||||||
conditionals if you wish - just write them starting from the 2nd
|
|
||||||
column.)
|
|
||||||
|
|
||||||
That's nice, you could say, but how cross section jumps and calls are
|
That's nice, you could say, but how cross section jumps and calls are
|
||||||
handled? Well, that is the nicest part of this stuff - they are handled
|
handled? Well, that is the nicest part of this stuff - they are handled
|
||||||
automatically. All you have to do is to add the required sections to the
|
automatically. All you have to do is to add the required sections to the
|
||||||
loader using `addLoader()' and the rest is done by upx. It will resolve
|
loader using `addLoader()' and the rest is done by upx. It will resolve
|
||||||
every conditional or unconditional jumps or subrutine calls for you.
|
every conditional or unconditional jumps or subroutine calls for you.
|
||||||
|
|
||||||
This functionality (we could say it's a simple linker) is achived by the
|
You can also use (undefined) symbols in the assembly for values that
|
||||||
assembly preprocessor (src/stub/scripts/app.pl) and a little C++ module
|
can only be computed during compression time (like `original_entry').
|
||||||
(src/linker.cpp). And of course NASM - the Netwide Assembler. You can
|
These symbols can be defined later in C++ using
|
||||||
see what's going on behind the scenes - just do:
|
|
||||||
|
|
||||||
cd src/stubs
|
linker->defineSymbol("xx", yy)
|
||||||
make maintainer-clean
|
|
||||||
make all
|
|
||||||
|
|
||||||
This will rebuild all the loaders - and keep the temporary files (*.as[xy])
|
This functionality (we could say it's a simple linker) is achieved by
|
||||||
which are seen by the assembler.
|
compiling the assembly into an ELF object file which a little C++
|
||||||
|
module (src/linker.cpp) can interpret and work with.
|
||||||
Currently this loader/stub building method only works with ix86
|
|
||||||
assembly - both app.pl and linker.cpp heavily rely on this when dealing
|
|
||||||
with cross section references.
|
|
||||||
|
|
||||||
And finally some important features/requirements you should be aware of:
|
|
||||||
|
|
||||||
- as previously stated - preprocessor conditionals starting on the 1st
|
|
||||||
column are removed by app.pl
|
|
||||||
- sections are separated by comments in the form `;__X1234567__'
|
|
||||||
- jumps are recognized by searching for a word which starts with `j'
|
|
||||||
and followed by a label - this also means that `jmp short label1'
|
|
||||||
will NOT be recognized (but you can use a macro called `jmps' for it
|
|
||||||
by adding `%define jmps jmp short' to the beginning of the file)
|
|
||||||
- at the end of the file you need something like this
|
|
||||||
|
|
||||||
eof:
|
|
||||||
; __XTHEENDX__
|
|
||||||
section .data
|
|
||||||
dd -1
|
|
||||||
dw eof
|
|
||||||
|
|
||||||
That's all for now.
|
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
UPX and SELinux
|
||||||
|
March 6, 2006
|
||||||
|
|
||||||
|
|
||||||
|
When a program that has been compressed by UPX is run, the decompressor
|
||||||
|
must create and write new memory pages of executable instructions.
|
||||||
|
SELinux (Security Enhanced Linux) directly controls the conditions
|
||||||
|
under which generating and/or executing new instructions is allowed,
|
||||||
|
so the configuration settings of SELinux affect the running of programs
|
||||||
|
that have been compressed by UPX.
|
||||||
|
|
||||||
|
In SELinux "strict enforcing" mode (the most restrictive), generating
|
||||||
|
new instructions at runtime is not allowed at all: any page with
|
||||||
|
PROT_EXEC permission must be mapped from a file in a mounted filesystem
|
||||||
|
that has 'x' [eXecute] permission, and the generation of such files is
|
||||||
|
also tightly controlled. A program that was compressed by UPX will not
|
||||||
|
run in SELinux strict enforcing mode. Attempts will fail with exit
|
||||||
|
code 127, and a record will be added to the history file
|
||||||
|
/var/log/audit/audit.log.
|
||||||
|
|
||||||
|
In "targeted enforcing" mode, SELinux pays close attention mostly to
|
||||||
|
designated processes that run with elevated privileges: web server,
|
||||||
|
print server, login server, etc. Ordinary user excutables receive
|
||||||
|
much less scrutiny. However, one of the eventual goals of SELinux is to
|
||||||
|
eradicate runtime generation of instructions because of the possibility
|
||||||
|
for exploitation by malware (virus, trojan, key logger, privilege
|
||||||
|
elevation exploit, etc.) Thus targeted enforcing mode notices and
|
||||||
|
logs the use of "execmem" capability that is used by a program which
|
||||||
|
was compressed by UPX. In keeping with the goal of eventual prohibition,
|
||||||
|
SELinux ordinarily would deny execmem. However, most current SELinux
|
||||||
|
systems, including Fedora Core 5 [set for release March 15, 2006],
|
||||||
|
override this with "allow_exemem=1" in /etc/selinux/targeted/booleans.
|
||||||
|
Thus a program compressed by UPX will run in the default installed
|
||||||
|
configuration (targeted enforcing, allow_execmem=1) of SELinux under
|
||||||
|
Fedora Core 5. Each invocation will add a few lines to the log file
|
||||||
|
/var/log/audit/audit.log, one line for each use of execmem. If the
|
||||||
|
SELinux policy becomes more restrictive in the future, then a special
|
||||||
|
SELinux class or other mechanism must be created for compressed programs,
|
||||||
|
or else UPX-compressed executables will not run then.
|
||||||
|
|
||||||
|
In its "permissive" modes, SELinux just logs the potential problems,
|
||||||
|
but otherwise does not interfere. A program compressed by UPX will run
|
||||||
|
in any permissive mode.
|
||||||
+92
-83
@@ -13,7 +13,7 @@ B<upx> S<[ I<command> ]> S<[ I<options> ]> I<filename>...
|
|||||||
=head1 ABSTRACT
|
=head1 ABSTRACT
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -75,8 +75,13 @@ B<UPX> is a versatile executable packer with the following features:
|
|||||||
* rtm32/pe
|
* rtm32/pe
|
||||||
* tmt/adam
|
* tmt/adam
|
||||||
* vmlinuz/386 [bootable Linux kernel]
|
* vmlinuz/386 [bootable Linux kernel]
|
||||||
|
* vmlinux/386
|
||||||
* watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay)
|
* watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay)
|
||||||
* win32/pe
|
* win32/pe (exe and dll)
|
||||||
|
* arm/pe (exe and dll)
|
||||||
|
* linux/elfamd64
|
||||||
|
* linux/elfppc32
|
||||||
|
* mach/elfppc32
|
||||||
|
|
||||||
- portable: UPX is written in portable endian-neutral C++
|
- portable: UPX is written in portable endian-neutral C++
|
||||||
|
|
||||||
@@ -133,6 +138,13 @@ B<--help>: prints the help
|
|||||||
|
|
||||||
B<--version>: print the version of B<UPX>
|
B<--version>: print the version of B<UPX>
|
||||||
|
|
||||||
|
B<--exact>: when compressing, require to be able to get a byte-identical file
|
||||||
|
after decompression with option B<-d>. [NOTE: this is work in progress and is
|
||||||
|
not supported for all formats yet. If you do care, as a workaround you can
|
||||||
|
compress and then decompress your program a first time - any further
|
||||||
|
compress-decompress steps should then yield byte-identical results
|
||||||
|
as compared to the first decompressed version.]
|
||||||
|
|
||||||
[ ...to be written... - type `B<upx --help>' for now ]
|
[ ...to be written... - type `B<upx --help>' for now ]
|
||||||
|
|
||||||
|
|
||||||
@@ -167,38 +179,13 @@ Note that compression level B<--best> can be somewhat slow for large
|
|||||||
files, but you definitely should use it when releasing a final version
|
files, but you definitely should use it when releasing a final version
|
||||||
of your program.
|
of your program.
|
||||||
|
|
||||||
Quick start for achieving the best compression ratio:
|
Quick info for achieving the best compression ratio:
|
||||||
|
|
||||||
=over 4
|
|
||||||
|
|
||||||
Try B<upx --brute myfile.exe>.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
Details for achieving the best compression ratio:
|
|
||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
=item *
|
=item *
|
||||||
|
|
||||||
Use the compression level B<--best>.
|
Try B<upx --brute myfile.exe> or even B<upx --ultra-brute myfile.exe>.
|
||||||
|
|
||||||
=item *
|
|
||||||
|
|
||||||
Try one or both of the options B<--all-methods> and B<--all-filters>.
|
|
||||||
|
|
||||||
=item *
|
|
||||||
|
|
||||||
Try the option B<--crp-ms=NUMBER>. This uses more memory during compression
|
|
||||||
to achieve a (slightly) better compression ratio.
|
|
||||||
|
|
||||||
NUMBER must be a decimal value from 10000 to 999999, inclusive.
|
|
||||||
The default value is 10000 (ten thousand).
|
|
||||||
|
|
||||||
=item *
|
|
||||||
|
|
||||||
Info: the option B<--brute> is an abbrevation for the options
|
|
||||||
B<S<--best> S<--all-methods> S<--all-filters> S<--crp-ms=999999>>.
|
|
||||||
|
|
||||||
=item *
|
=item *
|
||||||
|
|
||||||
@@ -214,7 +201,7 @@ For win32/pe programs there's B<--strip-relocs=0>. See notes below.
|
|||||||
|
|
||||||
=head1 OVERLAY HANDLING OPTIONS
|
=head1 OVERLAY HANDLING OPTIONS
|
||||||
|
|
||||||
Info: An "overlay" means auxillary data atached after the logical end of
|
Info: An "overlay" means auxiliary data attached after the logical end of
|
||||||
an executable, and it often contains application specific data
|
an executable, and it often contains application specific data
|
||||||
(this is a common practice to avoid an extra data file, though
|
(this is a common practice to avoid an extra data file, though
|
||||||
it would be better to use resource sections).
|
it would be better to use resource sections).
|
||||||
@@ -224,9 +211,6 @@ copies the overlay after the compressed image. This works with some
|
|||||||
files, but doesn't work with others, depending on how an application
|
files, but doesn't work with others, depending on how an application
|
||||||
actually accesses this overlayed data.
|
actually accesses this overlayed data.
|
||||||
|
|
||||||
Since version 0.90 UPX defaults to B<--overlay=copy> for
|
|
||||||
all executable formats.
|
|
||||||
|
|
||||||
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||||
|
|
||||||
--overlay=strip Strip any overlay from the program instead of
|
--overlay=strip Strip any overlay from the program instead of
|
||||||
@@ -338,9 +322,6 @@ Extra options available for this executable format:
|
|||||||
|
|
||||||
=head2 NOTES FOR DOS/SYS
|
=head2 NOTES FOR DOS/SYS
|
||||||
|
|
||||||
You can only compress plain sys files, sys/exe (two in one)
|
|
||||||
combos are not supported.
|
|
||||||
|
|
||||||
Compressed programs only work on a 286+.
|
Compressed programs only work on a 286+.
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
@@ -368,7 +349,7 @@ Extra options available for this executable format:
|
|||||||
First of all, it is recommended to use B<UPX> *instead* of B<strip>. strip has
|
First of all, it is recommended to use B<UPX> *instead* of B<strip>. strip has
|
||||||
the very bad habit of replacing your stub with its own (outdated) version.
|
the very bad habit of replacing your stub with its own (outdated) version.
|
||||||
Additionally B<UPX> corrects a bug/feature in strip v2.8.x: it
|
Additionally B<UPX> corrects a bug/feature in strip v2.8.x: it
|
||||||
will fix the 4 KByte aligment of the stub.
|
will fix the 4 KByte alignment of the stub.
|
||||||
|
|
||||||
B<UPX> includes the full functionality of stubify. This means it will
|
B<UPX> includes the full functionality of stubify. This means it will
|
||||||
automatically stubify your COFF files. Use the option B<--coff> to
|
automatically stubify your COFF files. Use the option B<--coff> to
|
||||||
@@ -403,7 +384,7 @@ Extra options available for this executable format:
|
|||||||
Introduction
|
Introduction
|
||||||
|
|
||||||
Linux/386 support in UPX consists of 3 different executable formats,
|
Linux/386 support in UPX consists of 3 different executable formats,
|
||||||
one optimized for ELF excutables ("linux/elf386"), one optimized
|
one optimized for ELF executables ("linux/elf386"), one optimized
|
||||||
for shell scripts ("linux/sh386"), and one generic format
|
for shell scripts ("linux/sh386"), and one generic format
|
||||||
("linux/386").
|
("linux/386").
|
||||||
|
|
||||||
@@ -431,14 +412,14 @@ General user's overview
|
|||||||
or network I/O.
|
or network I/O.
|
||||||
|
|
||||||
Depending on the statistics of usage and access, and the relative
|
Depending on the statistics of usage and access, and the relative
|
||||||
speeds of CPU, RAM, swap space, /tmp, and filesystem storage, then
|
speeds of CPU, RAM, swap space, /tmp, and file system storage, then
|
||||||
invoking and running a compressed executable can be faster than
|
invoking and running a compressed executable can be faster than
|
||||||
directly running the corresponding uncompressed program.
|
directly running the corresponding uncompressed program.
|
||||||
The operating system might perfrom fewer expensive I/O operations
|
The operating system might perform fewer expensive I/O operations
|
||||||
to invoke the compressed program. Paging to or from swap space
|
to invoke the compressed program. Paging to or from swap space
|
||||||
or /tmp might be faster than paging from the general filesystem.
|
or /tmp might be faster than paging from the general file system.
|
||||||
``Medium-sized'' programs which access about 1/3 to 1/2 of their
|
``Medium-sized'' programs which access about 1/3 to 1/2 of their
|
||||||
stored program bytes can do particulary well with compression.
|
stored program bytes can do particularly well with compression.
|
||||||
Small programs tend not to benefit as much because the absolute
|
Small programs tend not to benefit as much because the absolute
|
||||||
savings is less. Big programs tend not to benefit proportionally
|
savings is less. Big programs tend not to benefit proportionally
|
||||||
because each invocation may use only a small fraction of the program,
|
because each invocation may use only a small fraction of the program,
|
||||||
@@ -447,7 +428,7 @@ General user's overview
|
|||||||
then compression may win anyway.
|
then compression may win anyway.
|
||||||
|
|
||||||
Currently, executables compressed by UPX do not share RAM at runtime
|
Currently, executables compressed by UPX do not share RAM at runtime
|
||||||
in the way that executables mapped from a filesystem do. As a
|
in the way that executables mapped from a file system do. As a
|
||||||
result, if the same program is run simultaneously by more than one
|
result, if the same program is run simultaneously by more than one
|
||||||
process, then using the compressed version will require more RAM and/or
|
process, then using the compressed version will require more RAM and/or
|
||||||
swap space. So, shell programs (bash, csh, etc.) and ``make''
|
swap space. So, shell programs (bash, csh, etc.) and ``make''
|
||||||
@@ -536,7 +517,7 @@ The linux/elf386 format decompresses directly into RAM,
|
|||||||
uses only one exec, does not use space in /tmp,
|
uses only one exec, does not use space in /tmp,
|
||||||
and does not use /proc.
|
and does not use /proc.
|
||||||
|
|
||||||
Linux/elf386 is automatically selected for Linux ELF exectuables.
|
Linux/elf386 is automatically selected for Linux ELF executables.
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
|
||||||
@@ -625,7 +606,7 @@ Extra options available for this executable format:
|
|||||||
Please read the general Linux description first.
|
Please read the general Linux description first.
|
||||||
|
|
||||||
The generic linux/386 format decompresses to /tmp and needs
|
The generic linux/386 format decompresses to /tmp and needs
|
||||||
/proc filesystem support. It starts the decompressed program
|
/proc file system support. It starts the decompressed program
|
||||||
via the execve() syscall.
|
via the execve() syscall.
|
||||||
|
|
||||||
Linux/386 is only selected if the specialized linux/elf386
|
Linux/386 is only selected if the specialized linux/elf386
|
||||||
@@ -637,11 +618,11 @@ How it works:
|
|||||||
|
|
||||||
For files which are not ELF and not a script for a known "-c" shell,
|
For files which are not ELF and not a script for a known "-c" shell,
|
||||||
UPX uses kernel execve(), which first requires decompressing to a
|
UPX uses kernel execve(), which first requires decompressing to a
|
||||||
temporary file in the filesystem. Interestingly -
|
temporary file in the file system. Interestingly -
|
||||||
because of the good memory management of the Linux kernel - this
|
because of the good memory management of the Linux kernel - this
|
||||||
often does not introduce a noticable delay, and in fact there
|
often does not introduce a noticeable delay, and in fact there
|
||||||
will be no disk access at all if you have enough free memory as
|
will be no disk access at all if you have enough free memory as
|
||||||
the entire process takes places within the filesystem buffers.
|
the entire process takes places within the file system buffers.
|
||||||
|
|
||||||
A compressed executable consists of the UPX stub and an overlay
|
A compressed executable consists of the UPX stub and an overlay
|
||||||
which contains the original program in a compressed form.
|
which contains the original program in a compressed form.
|
||||||
@@ -667,7 +648,7 @@ Specific drawbacks:
|
|||||||
decompression, but you still need it for the full execution time
|
decompression, but you still need it for the full execution time
|
||||||
of the program.
|
of the program.
|
||||||
|
|
||||||
- You must have /proc filesystem support as the stub wants to open
|
- You must have /proc file system support as the stub wants to open
|
||||||
/proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
/proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
||||||
cannot compress programs that are used during the boot sequence
|
cannot compress programs that are used during the boot sequence
|
||||||
before /proc is mounted.
|
before /proc is mounted.
|
||||||
@@ -679,7 +660,7 @@ Specific drawbacks:
|
|||||||
|
|
||||||
- Because of temporary decompression to disk the decompression speed
|
- Because of temporary decompression to disk the decompression speed
|
||||||
is not as fast as with the other executable formats. Still, I can see
|
is not as fast as with the other executable formats. Still, I can see
|
||||||
no noticable delay when starting programs like my ~3 MB emacs (which
|
no noticeable delay when starting programs like my ~3 MB emacs (which
|
||||||
is less than 1 MB when compressed :-).
|
is less than 1 MB when compressed :-).
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
@@ -695,24 +676,28 @@ Extra options available for this executable format:
|
|||||||
This is the executable format used by the Sony PlayStation (PSone),
|
This is the executable format used by the Sony PlayStation (PSone),
|
||||||
a Mips R3000 based gaming console which is popular since the late '90s.
|
a Mips R3000 based gaming console which is popular since the late '90s.
|
||||||
Support of this format is very similar to the Atari one, because of
|
Support of this format is very similar to the Atari one, because of
|
||||||
nostalgic feelings of one of the authors, but this format maybe serves
|
nostalgic feelings of one of the authors.
|
||||||
a practical purpose ;-).
|
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression,
|
||||||
|
until further notice.
|
||||||
|
|
||||||
Maximum uncompressed size: ~1998848 bytes.
|
Maximum uncompressed size: ~1.89 / ~7.60 Mbytes.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
- UPX creates as default a 'CD-Rom only' PS1/PS2 compatible executable.
|
- UPX creates as default a suitable executable for CD-Mastering
|
||||||
For transfer between client/target use options below.
|
and console transfer. For a CD-Master main executable you could also try
|
||||||
|
the special option "--boot-only" as described below.
|
||||||
|
It has been reported that upx packed executables are fully compatible with
|
||||||
|
the Sony PlayStation 2 (PS2, PStwo) and Sony PlayStation Portable (PSP) in
|
||||||
|
Sony PlayStation (PSone) emulation mode.
|
||||||
|
|
||||||
- Normally the packed files use the same memory areas like the uncompressed
|
- Normally the packed files use the same memory areas like the uncompressed
|
||||||
versions, so they will not override other memory areas while unpacking.
|
versions, so they will not override other memory areas while unpacking.
|
||||||
If this isn't possible UPX will abort showing a 'packed data overlap'
|
If this isn't possible UPX will abort showing a 'packed data overlap'
|
||||||
error. With the "--force" option UPX will set a few 'bytes higher' loading
|
error. With the "--force" option UPX will relocate the loading address
|
||||||
offset for the packed file, but this isn't a real problem if it is a
|
for the packed file, but this isn't a real problem if it is a single or
|
||||||
single or boot-only executable.
|
the main executable.
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
|
|
||||||
@@ -721,21 +706,23 @@ Extra options available for this executable format:
|
|||||||
the compression ratio in some cases, but usually
|
the compression ratio in some cases, but usually
|
||||||
the default method gives the best results anyway.
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
--console-run This enables client/target transfer compatibility.
|
--8-bit Uses 8 bit size compression [default: 32 bit]
|
||||||
This format also run from a CD, except the "--no-align"
|
|
||||||
option is used. Upto 2024 bytes larger files
|
--8mb-ram PSone has 8 MB ram available [default: 2 MB]
|
||||||
than [default] will be the result, also a
|
|
||||||
slower decompression speed can be expected.
|
--boot-only This format is for main exes and CD-Mastering only !
|
||||||
|
It may slightly improve the compression ratio,
|
||||||
|
decompression routines are faster than default ones.
|
||||||
|
But it cannot be used for console transfer !
|
||||||
|
|
||||||
--no-align This option disables CD mode 2 data sector format
|
--no-align This option disables CD mode 2 data sector format
|
||||||
alignment, and enables "--console-run".
|
alignment. May slightly improves the compression ratio,
|
||||||
This will slightly improve the compression ratio,
|
|
||||||
but the compressed executable will not boot from a CD.
|
but the compressed executable will not boot from a CD.
|
||||||
So use it for client/target transfer only!.
|
Use it for console transfer only !
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 NOTES FOR RTM32/PE
|
=head2 NOTES FOR RTM32/PE and ARM/PE
|
||||||
|
|
||||||
Same as win32/pe.
|
Same as win32/pe.
|
||||||
|
|
||||||
@@ -779,7 +766,7 @@ Benefits:
|
|||||||
- Better compression (but note that the kernel was already compressed,
|
- Better compression (but note that the kernel was already compressed,
|
||||||
so the improvement is not as large as with other formats).
|
so the improvement is not as large as with other formats).
|
||||||
Still, the bytes saved may be essential for special needs like
|
Still, the bytes saved may be essential for special needs like
|
||||||
bootdisks.
|
boot disks.
|
||||||
|
|
||||||
For example, this is what I get for my 2.2.16 kernel:
|
For example, this is what I get for my 2.2.16 kernel:
|
||||||
1589708 vmlinux
|
1589708 vmlinux
|
||||||
@@ -826,13 +813,14 @@ Extra options available for this executable format:
|
|||||||
=head2 NOTES FOR WIN32/PE
|
=head2 NOTES FOR WIN32/PE
|
||||||
|
|
||||||
The PE support in B<UPX> is quite stable now, but probably there are
|
The PE support in B<UPX> is quite stable now, but probably there are
|
||||||
still some incompabilities with some files.
|
still some incompatibilities with some files.
|
||||||
|
|
||||||
Because of the way B<UPX> (and other packers for this format) works, you
|
Because of the way B<UPX> (and other packers for this format) works, you
|
||||||
can see increased memory usage of your compressed files. If you start
|
can see increased memory usage of your compressed files because the whole
|
||||||
several instances of huge compressed programs you're wasting memory
|
program is loaded into memory at startup.
|
||||||
because the common segements of the program won't get shared
|
If you start several instances of huge compressed programs you're
|
||||||
across the instances.
|
wasting memory because the common segments of the program won't
|
||||||
|
get shared across the instances.
|
||||||
On the other hand if you're compressing only smaller programs, or
|
On the other hand if you're compressing only smaller programs, or
|
||||||
running only one instance of larger programs, then this penalty is
|
running only one instance of larger programs, then this penalty is
|
||||||
smaller, but it's still there.
|
smaller, but it's still there.
|
||||||
@@ -840,12 +828,19 @@ smaller, but it's still there.
|
|||||||
If you're running executables from network, then compressed programs
|
If you're running executables from network, then compressed programs
|
||||||
will load faster, and require less bandwidth during execution.
|
will load faster, and require less bandwidth during execution.
|
||||||
|
|
||||||
DLLs are supported.
|
DLLs are supported. But UPX compressed DLLs can not share common data and
|
||||||
|
code when they got used by multiple applications. So compressing msvcrt.dll
|
||||||
|
is a waste of memory, but compressing the dll plugins of a particular
|
||||||
|
application may be a better idea.
|
||||||
|
|
||||||
Screensavers are supported, with the restriction that the filename
|
Screensavers are supported, with the restriction that the filename
|
||||||
must end in ".scr" (as screensavers are handled slightly different
|
must end with ".scr" (as screensavers are handled slightly different
|
||||||
than normal exe files).
|
than normal exe files).
|
||||||
|
|
||||||
|
UPX compressed PE files have some minor memory overhead (usually in the
|
||||||
|
10 - 30 kbytes range) which can be seen by specifying the "-i" command
|
||||||
|
line switch during compression.
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
|
|
||||||
--compress-exports=0 Don't compress the export section.
|
--compress-exports=0 Don't compress the export section.
|
||||||
@@ -862,16 +857,30 @@ Extra options available for this executable format:
|
|||||||
--compress-icons=1 Compress all but the first icon.
|
--compress-icons=1 Compress all but the first icon.
|
||||||
--compress-icons=2 Compress all icons which are not in the
|
--compress-icons=2 Compress all icons which are not in the
|
||||||
first icon directory. [DEFAULT]
|
first icon directory. [DEFAULT]
|
||||||
|
--compress-icons=3 Compress all icons.
|
||||||
|
|
||||||
--compress-resources=0 Don't compress any resources at all.
|
--compress-resources=0 Don't compress any resources at all.
|
||||||
|
|
||||||
|
--keep-resource=list Don't compress resources specified by the list.
|
||||||
|
The members of the list are separated by commas.
|
||||||
|
A list member has the following format: I<type[/name]>.
|
||||||
|
I<Type> is the type of the resource. Standard types
|
||||||
|
must be specified as decimal numbers, user types can be
|
||||||
|
specified by decimal IDs or strings. I<Name> is the
|
||||||
|
identifier of the resource. It can be a decimal number
|
||||||
|
or a string. For example:
|
||||||
|
|
||||||
|
--keep-resource=2/MYBITMAP,5,6/12345
|
||||||
|
|
||||||
|
UPX won't compress the named bitmap resource "MYBITMAP",
|
||||||
|
it leaves every dialog (5) resource uncompressed, and
|
||||||
|
it won't touch the string table resource with identifier
|
||||||
|
12345.
|
||||||
|
|
||||||
--force Force compression even when there is an
|
--force Force compression even when there is an
|
||||||
unexpected value in a header field.
|
unexpected value in a header field.
|
||||||
Use with care.
|
Use with care.
|
||||||
|
|
||||||
--strip-loadconf=0 Don't strip Structured Exception Handling load config [DEFAULT].
|
|
||||||
--strip-loadconf=1 Strip Structured Exception Handling load config.
|
|
||||||
|
|
||||||
--strip-relocs=0 Don't strip relocation records.
|
--strip-relocs=0 Don't strip relocation records.
|
||||||
--strip-relocs=1 Strip relocation records. [DEFAULT]
|
--strip-relocs=1 Strip relocation records. [DEFAULT]
|
||||||
This option only works on executables with base
|
This option only works on executables with base
|
||||||
@@ -924,13 +933,13 @@ Please report all bugs immediately to the authors.
|
|||||||
|
|
||||||
=head1 COPYRIGHT
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2004 John F. Reiser
|
Copyright (C) 2000-2007 John F. Reiser
|
||||||
|
|
||||||
Copyright (C) 2002-2004 Jens Medoch
|
Copyright (C) 2002-2007 Jens Medoch
|
||||||
|
|
||||||
This program may be used freely, and you are welcome to
|
This program may be used freely, and you are welcome to
|
||||||
redistribute it under certain conditions.
|
redistribute it under certain conditions.
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
The GNU bfd binary file descriptor package, part of the GNU binutils package,
|
|
||||||
contains code to recognize an Elf file by looking at fields in the file header.
|
|
||||||
Many programs (such as gdb, size, objdump, objcopy, strip and others) use bfd.
|
|
||||||
Unfortunately, bfd has been overly strict. In releases
|
|
||||||
binutils-2.9.1.0.4, binutils-2.9.1.0.23, binutils-2.9.5.0.0,
|
|
||||||
binutils-2.10.1,
|
|
||||||
gdb-4.17, gdb-5.0,
|
|
||||||
and probably others,
|
|
||||||
bfd does not recognize a file with zero in Elf32_Ehdr.e_shoff, .e_shentsize,
|
|
||||||
or .e_shnum, even though the operating system kernel does not care, and many
|
|
||||||
bfd clients would work just fine in these cases.
|
|
||||||
|
|
||||||
Because of its desire to create small size compressed executables, UPX
|
|
||||||
generates and uses Elf files with zero in .e_shoff, .e_shentsizes, and .e_shnum.
|
|
||||||
As a result, many widely-distributed instances of gdb, size, objdump, etc.,
|
|
||||||
refuse to work on UPX-packed executables.
|
|
||||||
|
|
||||||
Here is a patch to bfd/elfcode.h which enables many bfd clients to work
|
|
||||||
with UPX-packed executables. The last two lines of the patch are
|
|
||||||
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
|
|
||||||
--- elfcode.h.orig Mon Jun 16 11:45:32 1997
|
|
||||||
+++ elfcode.h Sat Apr 22 10:18:56 2000
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* ELF executable support for BFD.
|
|
||||||
- Copyright 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
|
|
||||||
+ Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Written by Fred Fish @ Cygnus Support, from information published
|
|
||||||
in "UNIX System V Release 4, Programmers Guide: ANSI C and
|
|
||||||
@@ -517,14 +517,14 @@
|
|
||||||
elf_debug_file (i_ehdrp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- /* If there is no section header table, we're hosed. */
|
|
||||||
- if (i_ehdrp->e_shoff == 0)
|
|
||||||
+ /* If there is no section header table, and relocatable, then we're hosed. */
|
|
||||||
+ if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
|
|
||||||
goto got_wrong_format_error;
|
|
||||||
|
|
||||||
/* As a simple sanity check, verify that the what BFD thinks is the
|
|
||||||
size of each section header table entry actually matches the size
|
|
||||||
- recorded in the file. */
|
|
||||||
- if (i_ehdrp->e_shentsize != sizeof (x_shdr))
|
|
||||||
+ recorded in the file, but only if there are any sections. */
|
|
||||||
+ if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
|
|
||||||
goto got_wrong_format_error;
|
|
||||||
|
|
||||||
ebd = get_elf_backend_data (abfd);
|
|
||||||
@@ -579,6 +579,7 @@
|
|
||||||
/* Allocate space for a copy of the section header table in
|
|
||||||
internal form, seek to the section header table in the file,
|
|
||||||
read it in, and convert it to internal form. */
|
|
||||||
+ if (i_ehdrp->e_shnum!=0) {
|
|
||||||
i_shdrp = ((Elf_Internal_Shdr *)
|
|
||||||
bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
|
|
||||||
elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
|
|
||||||
@@ -609,6 +610,7 @@
|
|
||||||
if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
|
|
||||||
goto got_no_match;
|
|
||||||
}
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Read in the program headers. */
|
|
||||||
if (i_ehdrp->e_phnum == 0)
|
|
||||||
@@ -644,6 +646,7 @@
|
|
||||||
bfd_section_from_shdr with it (since this particular strtab is
|
|
||||||
used to find all of the ELF section names.) */
|
|
||||||
|
|
||||||
+ if (i_ehdrp->e_shstrndx != 0) {
|
|
||||||
shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
|
|
||||||
if (!shstrtab)
|
|
||||||
goto got_no_match;
|
|
||||||
@@ -657,6 +660,7 @@
|
|
||||||
if (! bfd_section_from_shdr (abfd, shindex))
|
|
||||||
goto got_no_match;
|
|
||||||
}
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Let the backend double check the format and override global
|
|
||||||
information. */
|
|
||||||
@@ -930,7 +934,7 @@
|
|
||||||
{
|
|
||||||
Elf_Internal_Shdr *hdr;
|
|
||||||
Elf_Internal_Shdr *verhdr;
|
|
||||||
- long symcount; /* Number of external ELF symbols */
|
|
||||||
+ unsigned long symcount; /* Number of external ELF symbols */
|
|
||||||
elf_symbol_type *sym; /* Pointer to current bfd symbol */
|
|
||||||
elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
|
|
||||||
Elf_Internal_Sym i_sym;
|
|
||||||
@@ -978,7 +982,7 @@
|
|
||||||
sym = symbase = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- long i;
|
|
||||||
+ unsigned long i;
|
|
||||||
|
|
||||||
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
|
|
||||||
return -1;
|
|
||||||
-3172
File diff suppressed because it is too large
Load Diff
@@ -1,24 +0,0 @@
|
|||||||
GNUmakefile
|
|
||||||
*.0??
|
|
||||||
*.d
|
|
||||||
*.dat
|
|
||||||
*.idb
|
|
||||||
*.img
|
|
||||||
*.map
|
|
||||||
*.raw
|
|
||||||
*.rc
|
|
||||||
*.rel
|
|
||||||
*.res
|
|
||||||
*.pdb
|
|
||||||
*.upx
|
|
||||||
.gdbinit
|
|
||||||
.Attic
|
|
||||||
.deps
|
|
||||||
B
|
|
||||||
compress_nrv.*
|
|
||||||
upx
|
|
||||||
upx_nrv
|
|
||||||
upx_nrv.*
|
|
||||||
upx_ucl
|
|
||||||
upx_ucl.*
|
|
||||||
version1*.h
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
ifeq ($(DEPS_DONE),)
|
|
||||||
DEPS_DONE := 1
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // automated dependencies
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
ifeq ($(DEPMODE),gcc)
|
|
||||||
EXTRA_CFLAGS += -Wp,-MMD,.deps/$(*F).d
|
|
||||||
EXTRA_CXXFLAGS += -Wp,-MMD,.deps/$(*F).d
|
|
||||||
HAVE_DEPS := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(DEPMODE),linux-intelc)
|
|
||||||
EXTRA_CFLAGS += -MMD -MF.deps/$(*F).d
|
|
||||||
EXTRA_CXXFLAGS += -MMD -MF.deps/$(*F).d
|
|
||||||
HAVE_DEPS := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(DEPMODE),linux-pgi)
|
|
||||||
## NOTE: -MMD does not work...
|
|
||||||
EXTRA_CFLAGS += -MD.deps/$(*F).d
|
|
||||||
EXTRA_CXXFLAGS += -MD.deps/$(*F).d
|
|
||||||
HAVE_DEPS := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(HAVE_DEPS),1)
|
|
||||||
ifeq ($(strip $(wildcard .deps)),)
|
|
||||||
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
|
||||||
else
|
|
||||||
DEPS_FILES := $(wildcard .deps/*.d)
|
|
||||||
ifneq ($(strip $(DEPS_FILES)),)
|
|
||||||
include $(DEPS_FILES)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
endif # DEPS_DONE
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
DEPMODE := gcc
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // defaults for gcc
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
CXX = g++
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS_W =
|
|
||||||
CFLAGS_M =
|
|
||||||
CFLAGS_O =
|
|
||||||
CXXFLAGS_W =
|
|
||||||
CXXFLAGS_M =
|
|
||||||
CXXFLAGS_O =
|
|
||||||
|
|
||||||
CFLAGS = $(call __mkflags,CFLAGS_W) $(call __mkflags,CFLAGS_M) $(call __mkflags,CFLAGS_O)
|
|
||||||
CXXFLAGS = $(call __mkflags,CXXFLAGS_W) $(call __mkflags,CXXFLAGS_M) $(call __mkflags,CXXFLAGS_O)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# cflags
|
|
||||||
#
|
|
||||||
|
|
||||||
##CFLAGS_WERROR = -Werror
|
|
||||||
CFLAGS_WERROR =
|
|
||||||
CFLAGS_W = $(CFLAGS_WERROR) -Wall -W -Wbad-function-cast -Wcast-align -Wcast-qual -Winline -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wshadow -Wwrite-strings
|
|
||||||
CXXFLAGS_W = $(CFLAGS_WERROR) -Wall -W -Wcast-align -Wcast-qual -Winline -Woverloaded-virtual -Wpointer-arith -Wshadow -Wsign-promo -Wsynth -Wwrite-strings
|
|
||||||
|
|
||||||
##CFLAGS_M += -fno-builtin
|
|
||||||
##CFLAGS_M += -malign-functions=0 -malign-jumps=0 -malign-loops=0
|
|
||||||
CXXFLAGS_M = $(CFLAGS_M)
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS_O = -g -O0
|
|
||||||
else
|
|
||||||
##CFLAGS_O = -Os -fstrict-aliasing
|
|
||||||
CFLAGS_O = -O2 -fstrict-aliasing
|
|
||||||
##CFLAGS_O = -O2 -fno-strict-aliasing
|
|
||||||
endif
|
|
||||||
CXXFLAGS_O = $(CFLAGS_O) -fconserve-space
|
|
||||||
##CXXFLAGS += -fasynchronous-exceptions
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# cxxflags for g++ 3.2 or better
|
|
||||||
|
|
||||||
##CXXFLAGS_W += -Wdisabled-optimization -Wpacked
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# ldflags
|
|
||||||
#
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
LDFLAGS += -g
|
|
||||||
else
|
|
||||||
LDFLAGS += -s
|
|
||||||
endif
|
|
||||||
LDFLAGS += -Wl,-Map,$T.map
|
|
||||||
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# vi:nowrap
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
UDIR := $($(U)DIR)
|
|
||||||
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/include)),) # { include
|
|
||||||
DEFS += -DWITH_$(U)
|
|
||||||
INCLUDES += -I$(UDIR)/include
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/debug/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/debug/src/.libs
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/$(release)/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/$(release)/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/$(target)/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/$(target)/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/release/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/release/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR))),)
|
|
||||||
LIBDIRS += $(UDIR)
|
|
||||||
DOS_LIBDIRS := $(DOS_LIBDIRS);$(UDIR)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
LDLIBS += -l$(u)
|
|
||||||
DOS_LDLIBS += $(u).lib
|
|
||||||
|
|
||||||
|
|
||||||
DEFS := $(DEFS)
|
|
||||||
INCLUDES := $(INCLUDES)
|
|
||||||
LIBDIRS := $(LIBDIRS)
|
|
||||||
LDLIBS := $(LDLIBS)
|
|
||||||
DOS_LDLIBS := $(DOS_LDLIBS)
|
|
||||||
|
|
||||||
endif # } include
|
|
||||||
+95
-70
@@ -1,86 +1,111 @@
|
|||||||
#
|
#
|
||||||
# UPX Makefile (GNU make) - works with unix/win32/djgpp2
|
# UPX Makefile - needs GNU make 3.81 or better
|
||||||
#
|
|
||||||
# usage:
|
|
||||||
# `make target=linux' # linux
|
|
||||||
# `make target=dos32-djggp2' # dos32 - djggp2
|
|
||||||
# `make target=win32-cygwin' # win32 - cygwin
|
|
||||||
# `make target=win32-mingw32' # win32 - mingw32
|
|
||||||
# `make target=win32-rsxnt' # win32 - rsxnt
|
|
||||||
# `make target=win32-bc' # win32 - Borland C++
|
|
||||||
# `make target=win32-dm' # win32 - Digital Mars C++
|
|
||||||
# `make target=win32-ic' # win32 - Intel C++
|
|
||||||
# `make target=win32-vc' # win32 - Visual C++
|
|
||||||
# `make target=win32-wc' # win32 - Watcom C++
|
|
||||||
# `make target=cross-amd64-linux' # x86_64-linux cross compiler
|
|
||||||
# `make target=cross-mingw32' # i586-mingw32msvc cross compiler
|
|
||||||
# `make target=cross-mint' # m68k-atari-mint cross compiler
|
|
||||||
# `make target=gcc' # generic gcc
|
|
||||||
#
|
|
||||||
# you can also set the `UPX_MAKE_TARGET' environment variable.
|
|
||||||
#
|
#
|
||||||
|
|
||||||
|
MAKEFLAGS += -rR
|
||||||
|
.SUFFIXES:
|
||||||
|
export SHELL = /bin/sh
|
||||||
|
override e = $($1) $(EXTRA_$1) $(upx_$1) $($(basename $(notdir $@)).$1)
|
||||||
|
|
||||||
# configuration section
|
ifneq ($(findstring $(firstword $(MAKE_VERSION)),3.77 3.78 3.78.1 3.79 3.79.1 3.80),)
|
||||||
|
$(error GNU make 3.81 or better is required)
|
||||||
ifeq ($(strip $(UCLDIR)),)
|
|
||||||
# change this to reflect where the UCL library is
|
|
||||||
UCLDIR = $(HOME)/local/src/ucl-1.02
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
## you can set the default target here
|
ifndef srcdir
|
||||||
##target =
|
srcdir := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
|
||||||
|
srcdir := $(shell echo '$(srcdir)' | sed 's,/*$$,,')
|
||||||
|
endif
|
||||||
|
ifndef top_srcdir
|
||||||
|
top_srcdir := $(srcdir)/..
|
||||||
|
endif
|
||||||
|
include $(wildcard $(top_srcdir)/Makevars.global ./Makevars.local)
|
||||||
|
ifneq ($(srcdir),.)
|
||||||
|
##$(info Info: using VPATH . $(srcdir))
|
||||||
|
VPATH := . $(srcdir)
|
||||||
|
endif
|
||||||
|
|
||||||
DEBUG = 0
|
ifeq ($(CXX),)
|
||||||
|
CXX = g++
|
||||||
|
endif
|
||||||
|
ifneq ($(findstring $(firstword $(CXX)),g++),)
|
||||||
|
USE_GNUC ?= 1
|
||||||
|
endif
|
||||||
|
ifeq ($(USE_GNUC),1)
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
CXXFLAGS += -O0 -g
|
||||||
|
else
|
||||||
|
CXXFLAGS += -O2
|
||||||
|
endif
|
||||||
|
CXXFLAGS += -Wall -W -Wcast-align -Wcast-qual -Wpointer-arith -Wwrite-strings -Werror
|
||||||
|
##CXXFLAGS += -Wshadow
|
||||||
|
endif
|
||||||
|
CPPFLAGS += $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
|
||||||
|
CXXLD ?= $(CXX)
|
||||||
|
|
||||||
srcdir = .
|
exeext ?= .out
|
||||||
top_srcdir = ..
|
libext ?= .a
|
||||||
|
objext ?= .o
|
||||||
|
|
||||||
|
upx_SOURCES := $(wildcard $(srcdir)/*.cpp)
|
||||||
|
upx_OBJECTS := $(notdir $(upx_SOURCES:.cpp=$(objext)))
|
||||||
|
|
||||||
|
# we need UCL and zlib - you can set envvar UPX_UCLDIR
|
||||||
|
ifneq ($(wildcard $(UPX_UCLDIR)/include/ucl/ucl.h),)
|
||||||
|
INCLUDES += -I$(UPX_UCLDIR)/include
|
||||||
|
LIBS += $(addprefix -L,$(dir $(wildcard $(UPX_UCLDIR)/libucl$(libext) $(UPX_UCLDIR)/src/.libs/libucl$(libext))))
|
||||||
|
endif
|
||||||
|
LIBS += -lucl -lz
|
||||||
|
# you should set envvar UPX_LZMADIR to point to your unpacked LZMA SDK
|
||||||
|
include $(top_srcdir)/src/stub/src/c/Makevars.lzma
|
||||||
|
ifneq ($(UPX_LZMA_VERSION),)
|
||||||
|
DEFS += -DWITH_LZMA=$(UPX_LZMA_VERSION)
|
||||||
|
INCLUDES += -I$(UPX_LZMADIR)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
##### You should not have to change anything below this line. #####
|
all: upx$(exeext) | .depend
|
||||||
|
.DELETE_ON_ERROR: upx$(exeext) $(upx_OBJECTS) .depend
|
||||||
|
|
||||||
|
upx$(exeext): $(upx_OBJECTS) $(upx_DEPENDENCIES)
|
||||||
|
$($(notdir $@).PRE_LINK_STEP)
|
||||||
|
$(strip $(CXXLD) $(call e,CPPFLAGS) $(call e,CXXFLAGS) $(call e,LDFLAGS) -o $@ $(upx_OBJECTS) $(call e,LDADD) $(call e,LIBS))
|
||||||
|
$($(notdir $@).POST_LINK_STEP)
|
||||||
|
|
||||||
|
%.o : %.cpp | .depend
|
||||||
|
$(strip $(CXX) $(call e,CPPFLAGS) $(call e,CXXFLAGS) -o $@ -c $<)
|
||||||
|
|
||||||
|
.depend: $(wildcard $(srcdir)/*.cpp $(srcdir)/*.h) $(MAKEFILE_LIST)
|
||||||
|
@rm -f $@
|
||||||
|
ifeq ($(USE_GNUC),1)
|
||||||
|
@echo "Updating $@"
|
||||||
|
@$(strip $(CXX) $(call e,CPPFLAGS) -MM) $(filter %.cpp,$^) > $@
|
||||||
|
else
|
||||||
|
touch $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
ifeq ($(USE_GNUC),1)
|
||||||
# // object files
|
##compress_lzma$(objext) : CXXFLAGS += -O3 -fomit-frame-pointer
|
||||||
# ************************************************************************/
|
compress_lzma$(objext) : CXXFLAGS += -Wno-cast-qual
|
||||||
|
compress_lzma$(objext) : CXXFLAGS += -Wno-shadow
|
||||||
# these use exceptions & RTTI
|
ifeq ($(UPX_LZMA_VERSION),0x443)
|
||||||
OBJECTS1 = \
|
compress_lzma$(objext) : CXXFLAGS += -Wno-non-virtual-dtor
|
||||||
compress$o except$o file$o lefile$o \
|
compress_lzma$(objext) : CXXFLAGS += -Wno-unused
|
||||||
filter$o linker$o mem$o msg$o stdcxx$o work$o ui$o \
|
endif
|
||||||
packer$o packerf$o packhead$o packmast$o \
|
# needed for gcc-4.3:
|
||||||
p_com$o p_djgpp2$o p_elks$o p_exe$o \
|
compress_lzma$(objext) : CXXFLAGS += -Wno-error
|
||||||
p_lx_elf$o p_lx_exc$o p_lx_sep$o p_lx_sh$o \
|
endif
|
||||||
p_ps1$o p_sys$o p_tmt$o p_tos$o \
|
|
||||||
p_unix$o p_vmlinz$o p_vmlinx$o p_w16ne$o p_w32pe$o p_wcle$o
|
|
||||||
|
|
||||||
# no exceptions or RTTI
|
|
||||||
OBJECTS2 = \
|
|
||||||
filteri$o help$o main$o mygetopt$o snprintf$o util$o \
|
|
||||||
c_init$o c_file$o c_none$o c_screen$o \
|
|
||||||
s_object$o s_djgpp2$o s_vcsa$o s_win32$o
|
|
||||||
|
|
||||||
# pure C sources
|
|
||||||
OBJECTS3 =
|
|
||||||
|
|
||||||
OBJECTS = $(OBJECTS1) $(OBJECTS2) $(OBJECTS3)
|
|
||||||
LIBS =
|
|
||||||
RESOURCES =
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
mostlyclean clean distclean maintainer-clean:
|
||||||
# // main
|
rm -f *.d *.map *.o *.obj *.res .depend upx.exe upx.out upx.ttp upx$(exeext)
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
override WITH_ZLIB = 1
|
.PHONY: all mostlyclean clean distclean maintainer-clean
|
||||||
|
|
||||||
include $(srcdir)/Makefile.bld
|
ifeq ($(MAKECMDGOALS),mostlyclean)
|
||||||
|
else ifeq ($(MAKECMDGOALS),clean)
|
||||||
|
else ifeq ($(MAKECMDGOALS),distclean)
|
||||||
# /***********************************************************************
|
else ifeq ($(MAKECMDGOALS),maintainer-clean)
|
||||||
# // dependencies
|
else
|
||||||
# ************************************************************************/
|
-include .depend
|
||||||
|
endif
|
||||||
include $(srcdir)/Makedefs.dep
|
|
||||||
|
|
||||||
# vi:nowrap
|
|
||||||
|
|||||||
@@ -1,720 +0,0 @@
|
|||||||
# /***********************************************************************
|
|
||||||
# // perpare setup
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .a .c .cpp .exe .lib .o .obj .rc .res .ttp
|
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(srcdir),)
|
|
||||||
srcdir = .
|
|
||||||
endif
|
|
||||||
|
|
||||||
VPATH = $(srcdir)
|
|
||||||
|
|
||||||
|
|
||||||
# auto-detect the target unless given on the commandline
|
|
||||||
ifeq ($(strip $(target)),)
|
|
||||||
# try environment variable UPX_MAKE_TARGET
|
|
||||||
target := $(UPX_MAKE_TARGET)
|
|
||||||
endif
|
|
||||||
ifeq ($(strip $(target)),)
|
|
||||||
ifneq ($(strip $(wildcard /usr/include/linux)),)
|
|
||||||
target = linux
|
|
||||||
endif
|
|
||||||
##ifneq ($(strip $(wildcard /platform/sun4?/kernel/unix)),)
|
|
||||||
##target = sparc-sun-solaris
|
|
||||||
##endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(target)),)
|
|
||||||
include please_specify_a_target
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# util var for use in the rules - basename of the current target
|
|
||||||
override T = $(basename $@)
|
|
||||||
|
|
||||||
# expand "VAR" into "$(VAR) $(EXTRA_VAR) $(UPX_EXTRA_VAR)"
|
|
||||||
override __mkflags = $(strip $($(1)) $(EXTRA_$(1)) $(UPX_EXTRA_$(1)))
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // compiler defaults
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
CC_SRC = $<
|
|
||||||
CXX_SRC = $<
|
|
||||||
CC_COMPILE = $(CC) $(CCARCH) $(call __mkflags,DEFS) $(call __mkflags,INCLUDES) $(call __mkflags,CFLAGS) $(CFLAGS_OUTPUT) -c $(CC_SRC)
|
|
||||||
CXX_COMPILE = $(CXX) $(CXXARCH) $(call __mkflags,DEFS) $(call __mkflags,INCLUDES) $(call __mkflags,CXXFLAGS) $(CXXFLAGS_OUTPUT) -c $(CXX_SRC)
|
|
||||||
CXX_LINK_EXE = $(CXXLD) $(CXXLDARCH) $(call __mkflags,LDFLAGS) $(LINK_EXE_OUTPUT) $^ $(call __mkflags,LDLIBS)
|
|
||||||
STUBEDIT_EXE =
|
|
||||||
STUBIFY_EXE =
|
|
||||||
CHMOD_EXE =
|
|
||||||
|
|
||||||
o = .o
|
|
||||||
a = .a
|
|
||||||
e =
|
|
||||||
DEFS =
|
|
||||||
INCLUDES =
|
|
||||||
LIBDIRS =
|
|
||||||
DOS_LDLIBS =
|
|
||||||
DOS_LIBDIRS =
|
|
||||||
|
|
||||||
# CC defaults
|
|
||||||
CC = INVALID_TARGET_CC
|
|
||||||
CCARCH =
|
|
||||||
CFLAGS =
|
|
||||||
CFLAGS_OUTPUT =
|
|
||||||
|
|
||||||
# CXX defaults
|
|
||||||
CXX = $(CC)
|
|
||||||
CXXARCH = $(CCARCH)
|
|
||||||
CXXFLAGS = $(CFLAGS)
|
|
||||||
CXXFLAGS_OUTPUT = $(CFLAGS_OUTPUT)
|
|
||||||
|
|
||||||
# CXXLD defaults
|
|
||||||
CXXLD = $(CXX)
|
|
||||||
CXXLDARCH = $(CXXARCH)
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT =
|
|
||||||
LDLIBS =
|
|
||||||
LINK_EXE_LDFLAGS =
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
DEFS += -DDEBUG
|
|
||||||
## DEFS += -DTESTING
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // compression libraries
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
DOS_LDLIBS += zlib.lib
|
|
||||||
ZLIBDIR:=$(strip $(subst \,/,$(ZLIBDIR)))
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR))),)
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR)/include/zlib.h)),)
|
|
||||||
INCLUDES += -I$(ZLIBDIR)/include
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR)/src/zlib.h)),)
|
|
||||||
INCLUDES += -I$(ZLIBDIR)/src
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR)/zlib.h)),)
|
|
||||||
INCLUDES += -I$(ZLIBDIR)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
UCLDIR:=$(strip $(subst \,/,$(UCLDIR)))
|
|
||||||
NRVDIR:=$(strip $(subst \,/,$(NRVDIR)))
|
|
||||||
u = ucl
|
|
||||||
U = UCL
|
|
||||||
upx_exe_tail =
|
|
||||||
include $(srcdir)/Makedefs.inc
|
|
||||||
ifneq ($(strip $(wildcard $(NRVDIR)/include/nrv)),)
|
|
||||||
u = nrv
|
|
||||||
U = NRV
|
|
||||||
upx_exe_tail := _$(u)
|
|
||||||
include $(srcdir)/Makedefs.inc
|
|
||||||
endif
|
|
||||||
upx_exe = upx$(upx_exe_tail)$(e)
|
|
||||||
|
|
||||||
override tmp := -Wl,--rpath,
|
|
||||||
LDRPATH := $(addprefix $(tmp),$(LIBDIRS))
|
|
||||||
LIBDIRS += .
|
|
||||||
LDLIBDIRS := $(addprefix -L,$(LIBDIRS))
|
|
||||||
|
|
||||||
##LDFLAGS += $(LDRPATH)
|
|
||||||
LDFLAGS += $(LDLIBDIRS)
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // compiler settings
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
###
|
|
||||||
### generic gcc
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),gcc)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux - gcc
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
override arch := $(shell uname -m | sed -e 's/^i[3456789]86$$/i386/')
|
|
||||||
ifeq ($(arch),i386)
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
endif
|
|
||||||
DEFS += -D_FILE_OFFSET_BITS=64
|
|
||||||
LDLIBS += -lmcheck
|
|
||||||
##CFLAGS_WERROR = -Werror
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
else
|
|
||||||
##LDFLAGS += -static
|
|
||||||
STUBEDIT_EXE = objcopy -S -R .comment -R .note $@
|
|
||||||
ifeq ($(arch),i386)
|
|
||||||
## STUBIFY_EXE = perl $(srcdir)/stub/scripts/brandelf.pl $@
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
CHMOD_EXE = chmod 755 $@
|
|
||||||
endif # linux
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux/i386 - Borland C++ 5.7 (Kylix 3)
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux-bc57)
|
|
||||||
##DEPMODE := linux-XXX ## FIXME
|
|
||||||
CC = bc++ -q -3
|
|
||||||
CFLAGS = -w '-w!'
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS += -ls
|
|
||||||
LINK_EXE_OUTPUT = -e$@
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
# warning: do not use option `-d' --> incorrect string merging will happen
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -dc
|
|
||||||
else
|
|
||||||
CFLAGS += -O2 -dc
|
|
||||||
endif
|
|
||||||
# transform `-lxx -lyy' into `libxx.a libyy.a'
|
|
||||||
LDLIBS := $(shell echo "$(LDLIBS)" | perl -pe 's/-l(.+?)\b/lib\1.a/g')
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux/i386 - Intel C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux-intelc)
|
|
||||||
DEPMODE := linux-intelc
|
|
||||||
CC = icc
|
|
||||||
CXX = icpc
|
|
||||||
CCARCH += -march=i386 -mcpu=i686 -nolib_inline
|
|
||||||
DEFS += -D_FILE_OFFSET_BITS=64
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
CFLAGS = $(CFLAGS_WERROR)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -g -O0
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
LDFLAGS += -Wl,-Map,$T.map
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux/i386 - Portland Group PGI C++ 5.x
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux-pgi)
|
|
||||||
DEPMODE := linux-pgi
|
|
||||||
CC = pgcc
|
|
||||||
CXX = pgCC
|
|
||||||
CCARCH += -tp=p6
|
|
||||||
DEFS += -D_FILE_OFFSET_BITS=64
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
##CFLAGS += -Minform=info
|
|
||||||
CXXFLAGS = $(CFLAGS) -tused
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Linux cross compilers
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),cross-amd64-linux)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
CC = x86_64-linux-gcc
|
|
||||||
CXX = x86_64-linux-g++
|
|
||||||
LDLIBS += -lmcheck
|
|
||||||
endif # cross-amd64-linux
|
|
||||||
|
|
||||||
ifeq ($(target),cross-m68k-linux)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
CC = m68k-linux-gcc
|
|
||||||
CXX = m68k-linux-g++
|
|
||||||
##LDLIBS += -lmcheck
|
|
||||||
endif # cross-m68k-linux
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### sparc-sun-solaris2.8
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),sparc-sun-solaris)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Atari cross compilers
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),cross-mint)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .ttp
|
|
||||||
CC = m68k-atari-mint-gcc
|
|
||||||
CXX = m68k-atari-mint-g++
|
|
||||||
CCARCH += -m68000
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),cross-mint-m68040)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .ttp
|
|
||||||
CC = m68k-atari-mint-gcc
|
|
||||||
CXX = m68k-atari-mint-g++
|
|
||||||
CCARCH += -m68040
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),cross-mint-m68020-60)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .ttp
|
|
||||||
CC = m68k-atari-mint-gcc
|
|
||||||
CXX = m68k-atari-mint-g++
|
|
||||||
CCARCH += -m68020-60 -m68881
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### dos32 - djgpp2 / emx
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),dos32-djgpp2)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CXX = gxx
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
CFLAGS_WERROR = -Werror
|
|
||||||
STUBEDIT_EXE = stubedit $@ bufsize=0xfc00
|
|
||||||
ifneq ($(strip $(wildcard $(DJDIR)/bin/mfxdjstubify.ex[eE])),)
|
|
||||||
ifneq ($(strip $(wildcard $(DJDIR)/bin/cwsdstub.ex[eE])),)
|
|
||||||
STUBIFY_EXE = mfxdjstubify -v -s $(DJDIR)/bin/cwsdstub.exe $@
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),dos32-emx)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CXX = gcc
|
|
||||||
CFLAGS_O = -O2
|
|
||||||
CCARCH += -mno-probe
|
|
||||||
LDFLAGS = -L. -s
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - cygwin / mingw32 / rsxnt
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-cygwin)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
##CXX = g++-2
|
|
||||||
e = .exe
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
LDLIBS += -lwinmm
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),win32-mingw32)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
LDLIBS += -lwinmm
|
|
||||||
endif
|
|
||||||
|
|
||||||
# mingw32 cross compiler
|
|
||||||
ifeq ($(target),cross-mingw32)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CC = i586-mingw32msvc-gcc
|
|
||||||
CXX = i586-mingw32msvc-g++
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
LDLIBS += -lwinmm
|
|
||||||
endif
|
|
||||||
|
|
||||||
# rsxnt (g++ 2.8.1)
|
|
||||||
ifeq ($(target),win32-rsxnt)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CXX = gcc
|
|
||||||
CFLAGS_O = -O2
|
|
||||||
CCARCH += -Zwin32 -Zsys -mno-probe
|
|
||||||
LDFLAGS = -L. -s
|
|
||||||
STUBEDIT_EXE = pestack -s1024 -c1024 $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Borland C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-bc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = bcc32 -3
|
|
||||||
ifeq ($(UPX_BROKEN_INCLUDES),1)
|
|
||||||
ifneq ($(srcdir),.)
|
|
||||||
INCLUDES += -I$(srcdir)
|
|
||||||
endif
|
|
||||||
INCLUDES += -I$(srcdir)/acc
|
|
||||||
ifneq ($(strip $(wildcard $(srcdir)/filter)),)
|
|
||||||
INCLUDES += -I$(srcdir)/filter
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
CFLAGS = -w -w-inl -g1
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS = -ls
|
|
||||||
LINK_EXE_OUTPUT = -e$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -d
|
|
||||||
else
|
|
||||||
CFLAGS += -O2 -d
|
|
||||||
endif
|
|
||||||
endif # win32-bc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Digital Mars C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-dm)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = dmc -mn
|
|
||||||
CFLAGS = -w- -wx
|
|
||||||
CXXFLAGS = $(CFLAGS) -Aa -Ab -Ae -Ar
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS = -L/map
|
|
||||||
LINK_EXE_OUTPUT = -o$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -o- -g -s
|
|
||||||
else
|
|
||||||
CFLAGS += -o
|
|
||||||
endif
|
|
||||||
endif # win32-dm
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Intel C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-ic)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = icl -nologo
|
|
||||||
CFLAGS = -W3 -WX
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,2)
|
|
||||||
# statically link libcmt.lib
|
|
||||||
CC += -MT
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win32-ic
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Metrowerks C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-mwerks)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = mwcc -gccinc
|
|
||||||
CFLAGS = -w on
|
|
||||||
CXXFLAGS = $(CFLAGS)
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LDFLAGS = -lwinmm.lib -map $T.map
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -opt full
|
|
||||||
else
|
|
||||||
CFLAGS +=
|
|
||||||
endif
|
|
||||||
endif # win32-mwerks
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Symantec C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-sc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = sc -mn
|
|
||||||
CFLAGS = -w- -wx
|
|
||||||
CXXFLAGS = $(CFLAGS) -EH -ER
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS = -L/map
|
|
||||||
LINK_EXE_OUTPUT = -o$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -o- -g -s
|
|
||||||
else
|
|
||||||
CFLAGS += -o
|
|
||||||
endif
|
|
||||||
endif # win32-sc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Visual C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-vc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = cl -nologo
|
|
||||||
CFLAGS = -W4 -WX
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,1)
|
|
||||||
# statically link libcmt.lib
|
|
||||||
CC += -MT
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
##LINK_EXE_LDFLAGS += /opt:nowin98
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win32-vc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Watcom C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-wc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = wcl386 -zq -bt=nt -mf -5r
|
|
||||||
##CC = wcl386 -zq -bt=dos -l=CauseWay -mf -5r
|
|
||||||
CFLAGS = -zc -w5 -we
|
|
||||||
CXXFLAGS = $(CFLAGS) -xs -xr
|
|
||||||
CFLAGS_OUTPUT = -fo=$@
|
|
||||||
LDFLAGS = -k0x100000 -fm
|
|
||||||
LINK_EXE_OUTPUT = -fe=$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
CC_SRC = $(subst /,\\,$<)
|
|
||||||
CXX_SRC = $(subst /,\\,$<)
|
|
||||||
INCLUDES := $(strip $(subst /,\\,$(INCLUDES)))
|
|
||||||
ifeq (1,2)
|
|
||||||
WCL386 := $(INCLUDES)
|
|
||||||
export WCL386
|
|
||||||
INCLUDES :=
|
|
||||||
endif
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS +=
|
|
||||||
else
|
|
||||||
# note: it seems that the optimizer is generating bad code with `-ox'
|
|
||||||
CFLAGS += -olr
|
|
||||||
endif
|
|
||||||
endif # win32-wc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win64 - Intel C++ [Itanium]
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win64-ic)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = ecl -nologo
|
|
||||||
CFLAGS = -W3
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,2)
|
|
||||||
# statically link libcmt.lib
|
|
||||||
CC += -MT
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win64-ic
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win64 - Visual C++ [AMD64 or Itanium]
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win64-vc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = cl -nologo
|
|
||||||
CFLAGS = -W4 -Wall
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,1)
|
|
||||||
# statically link libcmt.lib
|
|
||||||
CC += -MT
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win64-vc
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // malloc debuggers and memory checkers - obsolete, use valgrind
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
# compile in extra valgrind support
|
|
||||||
DEFS += -DWITH_VALGRIND
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
LDLIBS += -lefence
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
DEFS += -DWITH_DMALLOC
|
|
||||||
LDLIBS += -ldmalloc
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
DEFS += -DWITH_GC -DLINUX_THREADS -D_REENTRANT
|
|
||||||
LDLIBS += -lgc -lpthread
|
|
||||||
# only needed when using -static:
|
|
||||||
##LDFLAGS += -Wl,-defsym,_DYNAMIC=0
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // main targets
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
-include ./Makefile.local
|
|
||||||
|
|
||||||
all: $(upx_exe)
|
|
||||||
|
|
||||||
$(upx_exe): $(OBJECTS) $(LIBS) $(RESOURCES)
|
|
||||||
$(strip $(CXX_LINK_EXE))
|
|
||||||
$(strip $(STUBEDIT_EXE))
|
|
||||||
$(strip $(STUBIFY_EXE))
|
|
||||||
$(strip $(CHMOD_EXE))
|
|
||||||
|
|
||||||
mostlyclean:
|
|
||||||
-rm -f *.d *.err *.i *.log *.map gdb-trans*
|
|
||||||
|
|
||||||
clean: mostlyclean
|
|
||||||
-rm -f *.a *.lib *.o *.obj *.res *.tds tags TAGS ID
|
|
||||||
-rm -f *.idb *.pdb
|
|
||||||
-rm -f $(upx_exe) upx upx.exe upx.ttp upx_nrv upx_nrv.exe upx_nrv.ttp upx_ucl upx_ucl.exe upx_ucl.ttp
|
|
||||||
-rm -rf .deps _deps
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
|
|
||||||
maintainer-clean: distclean
|
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // rules
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
%$o : %.c
|
|
||||||
$(strip $(CC_COMPILE))
|
|
||||||
|
|
||||||
%$o : %.cpp
|
|
||||||
$(strip $(CXX_COMPILE))
|
|
||||||
|
|
||||||
%.res : %.rc
|
|
||||||
rc -l 0x409 -fo$@ $<
|
|
||||||
|
|
||||||
|
|
||||||
# vi:nowrap
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
GNUmakefile
|
|
||||||
@@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Possible configuration values:
|
|
||||||
*
|
|
||||||
* ACC_CONFIG_NO_HEADER
|
|
||||||
* ACC_CONFIG_HEADER if given, then use this as <config.h>
|
|
||||||
* ACC_CONFIG_INCLUDE include path to acc_ files
|
|
||||||
*
|
|
||||||
* ACC_CONFIG_PREFER___INT64 [acc_type.h]
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_H_INCLUDED
|
|
||||||
#define __ACC_H_INCLUDED 1
|
|
||||||
|
|
||||||
#define ACC_VERSION 20040715L
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_INCLUDE)
|
|
||||||
# define ACC_CONFIG_INCLUDE(file) file
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__CYGWIN32__) && !defined(__CYGWIN__)
|
|
||||||
# define __CYGWIN__ __CYGWIN32__
|
|
||||||
#endif
|
|
||||||
#if defined(__IBMCPP__) && !defined(__IBMC__)
|
|
||||||
# define __IBMC__ __IBMCPP__
|
|
||||||
#endif
|
|
||||||
#if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER)
|
|
||||||
# define __INTEL_COMPILER __ICL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1 && defined(__INTERIX) && defined(__GNUC__) && !defined(_ALL_SOURCE)
|
|
||||||
# define _ALL_SOURCE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* disable pedantic warnings for undefined preprocessing symbols */
|
|
||||||
#if defined(__INTEL_COMPILER) && defined(__linux__)
|
|
||||||
# pragma warning(disable: 193)
|
|
||||||
#endif
|
|
||||||
#if defined(__KEIL__) && defined(__C166__)
|
|
||||||
# pragma warning disable = 322
|
|
||||||
#elif 0 && defined(__C251__)
|
|
||||||
# pragma warning disable = 322
|
|
||||||
#endif
|
|
||||||
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__MWERKS__)
|
|
||||||
# if (_MSC_VER >= 1300)
|
|
||||||
# pragma warning(disable: 4668)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if 0 && defined(__WATCOMC__)
|
|
||||||
# if (__WATCOMC__ < 1060)
|
|
||||||
# pragma warning 203 9
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_init.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_os.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_cc.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_arch.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_mm.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_defs.h")
|
|
||||||
|
|
||||||
#if defined(ACC_CONFIG_NO_HEADER)
|
|
||||||
#elif defined(ACC_CONFIG_HEADER)
|
|
||||||
# include ACC_CONFIG_HEADER
|
|
||||||
#else
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_auto.h")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_type.h")
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CPU architecture - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_ARCH_UNKNOWN [default]
|
|
||||||
* ACC_ARCH_ALPHA
|
|
||||||
* ACC_ARCH_AMD64 aka x86-64 or ia32e
|
|
||||||
* ACC_ARCH_C166
|
|
||||||
* ACC_ARCH_IA16 Intel Architecture (8088, 8086, 80186, 80286)
|
|
||||||
* ACC_ARCH_IA32 Intel Architecture (80386+)
|
|
||||||
* ACC_ARCH_IA64 Intel Architecture (Itanium)
|
|
||||||
* ACC_ARCH_M68K Motorola 680x0
|
|
||||||
* ACC_ARCH_MCS251
|
|
||||||
* ACC_ARCH_MCS51
|
|
||||||
* ACC_ARCH_PPC64 Power PC
|
|
||||||
* ACC_ARCH_SPARC64
|
|
||||||
*
|
|
||||||
* Optionally define one of:
|
|
||||||
* ACC_ENDIAN_LITTLE_ENDIAN
|
|
||||||
* ACC_ENDIAN_BIG_ENDIAN
|
|
||||||
*
|
|
||||||
* Note that this list is not exhaustive - actually we only really care
|
|
||||||
* about architectures which allow unaligned memory access at reasonable
|
|
||||||
* speed (for the moment this means IA16, IA32 and AMD64).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# define ACC_ARCH_IA16 1
|
|
||||||
# define ACC_INFO_ARCH "ia16"
|
|
||||||
#elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64)
|
|
||||||
# define ACC_ARCH_AMD64 1
|
|
||||||
# define ACC_INFO_ARCH "amd64"
|
|
||||||
#elif (UINT_MAX <= ACC_0xffffL) && defined(__AVR__)
|
|
||||||
# define ACC_ARCH_AVR 1
|
|
||||||
# define ACC_INFO_ARCH "avr"
|
|
||||||
#elif (UINT_MAX == ACC_0xffffL) && defined(__C166__)
|
|
||||||
# define ACC_ARCH_C166 1
|
|
||||||
# define ACC_INFO_ARCH "c166"
|
|
||||||
#elif (UINT_MAX == ACC_0xffffL) && defined(__C251__)
|
|
||||||
# define ACC_ARCH_MCS251 1
|
|
||||||
# define ACC_INFO_ARCH "mcs-251"
|
|
||||||
#elif (UINT_MAX == ACC_0xffffL) && defined(__C51__)
|
|
||||||
# define ACC_ARCH_MCS51 1
|
|
||||||
# define ACC_INFO_ARCH "mcs-51"
|
|
||||||
#elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386)
|
|
||||||
# define ACC_ARCH_IA32 1
|
|
||||||
# define ACC_INFO_ARCH "ia32"
|
|
||||||
#elif (ACC_CC_ZORTECHC && defined(__I86__))
|
|
||||||
# define ACC_ARCH_IA32 1
|
|
||||||
# define ACC_INFO_ARCH "ia32"
|
|
||||||
#elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64)
|
|
||||||
# define ACC_ARCH_IA64 1
|
|
||||||
# define ACC_INFO_ARCH "ia64"
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC) && defined(_I386)
|
|
||||||
# define ACC_ARCH_IA32 1
|
|
||||||
# define ACC_INFO_ARCH "ia32"
|
|
||||||
#elif (ACC_OS_DOS32 || ACC_OS_OS2)
|
|
||||||
# error "missing define for CPU architecture"
|
|
||||||
#elif (ACC_OS_WIN32)
|
|
||||||
# error "missing define for CPU architecture"
|
|
||||||
#elif (ACC_OS_WIN64)
|
|
||||||
/* # error "missing define for CPU architecture" */
|
|
||||||
#elif (ACC_OS_TOS) || defined(__m68000__)
|
|
||||||
# define ACC_ARCH_M68K 1
|
|
||||||
# define ACC_INFO_ARCH "m68k"
|
|
||||||
#elif defined(__alpha__) || defined(__alpha)
|
|
||||||
# define ACC_ARCH_ALPHA 1
|
|
||||||
# define ACC_INFO_ARCH "alpha"
|
|
||||||
#elif defined(__ppc64__) || defined(__ppc64)
|
|
||||||
# define ACC_ARCH_PPC64 1
|
|
||||||
# define ACC_INFO_ARCH "ppc64"
|
|
||||||
#elif defined(__sparc64__) || defined(__sparc64)
|
|
||||||
# define ACC_ARCH_SPARC64 1
|
|
||||||
# define ACC_INFO_ARCH "sparc64"
|
|
||||||
#else
|
|
||||||
# define ACC_ARCH_UNKNOWN 1
|
|
||||||
# define ACC_INFO_ARCH "unknown"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA16 || ACC_ARCH_IA32)
|
|
||||||
# define ACC_ENDIAN_LITTLE_ENDIAN 1
|
|
||||||
# define ACC_INFO_ENDIAN "little-endian"
|
|
||||||
#elif (ACC_ARCH_M68K)
|
|
||||||
# define ACC_ENDIAN_BIG_ENDIAN 1
|
|
||||||
# define ACC_INFO_ENDIAN "big-endian"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_ARCH_IA16)
|
|
||||||
# if (UINT_MAX != ACC_0xffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (ACC_ARCH_IA32)
|
|
||||||
# if (UINT_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,660 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Possible configuration values:
|
|
||||||
*
|
|
||||||
* ACC_CONFIG_AUTO_NO_HEADERS
|
|
||||||
* ACC_CONFIG_AUTO_NO_FUNCTIONS
|
|
||||||
* ACC_CONFIG_AUTO_NO_SIZES
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for <stdint.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_HEADERS)
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
|
|
||||||
# if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1))
|
|
||||||
# define HAVE_STDINT_H 1
|
|
||||||
# endif
|
|
||||||
#elif defined(__dietlibc__)
|
|
||||||
# undef HAVE_STDINT_H /* incomplete */
|
|
||||||
#elif (ACC_CC_BORLANDC) && (__BORLANDC__ >= 0x560)
|
|
||||||
# undef HAVE_STDINT_H /* broken & incomplete */
|
|
||||||
#elif (ACC_CC_DMC) && (__DMC__ >= 0x825)
|
|
||||||
# define HAVE_STDINT_H 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_STDINT_H
|
|
||||||
# include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_HEADERS) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for header files
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_HEADERS)
|
|
||||||
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
|
|
||||||
#define HAVE_ASSERT_H 1
|
|
||||||
#define HAVE_CTYPE_H 1
|
|
||||||
#define HAVE_DIRENT_H 1
|
|
||||||
#define HAVE_ERRNO_H 1
|
|
||||||
#define HAVE_FCNTL_H 1
|
|
||||||
#define HAVE_LIMITS_H 1
|
|
||||||
#define HAVE_MALLOC_H 1
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
#define HAVE_SETJMP_H 1
|
|
||||||
#define HAVE_SIGNAL_H 1
|
|
||||||
#define HAVE_STDARG_H 1
|
|
||||||
#define HAVE_STDDEF_H 1
|
|
||||||
#define HAVE_STDIO_H 1
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
#define HAVE_TIME_H 1
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
#define HAVE_UTIME_H 1
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
#define HAVE_SYS_TIME_H 1
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
|
|
||||||
#undef HAVE_ALLOCA_H
|
|
||||||
#undef HAVE_CONIO_H
|
|
||||||
#undef HAVE_DIRECT_H
|
|
||||||
#undef HAVE_DOS_H
|
|
||||||
#undef HAVE_IO_H
|
|
||||||
#undef HAVE_SHARE_H
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
#undef HAVE_SYS_UTIME_H
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_POSIX)
|
|
||||||
# define HAVE_STRINGS_H 1
|
|
||||||
# if (ACC_OS_POSIX_FREEBSD || ACC_OS_POSIX_MACOSX || ACC_OS_POSIX_OPENBSD)
|
|
||||||
# undef HAVE_MALLOC_H /* deprecated */
|
|
||||||
# elif (ACC_OS_POSIX_HPUX || ACC_OS_POSIX_INTERIX)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# endif
|
|
||||||
# if (ACC_OS_POSIX_MACOSX && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
/* FIXME ??? */
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_CYGWIN)
|
|
||||||
# define HAVE_IO_H 1
|
|
||||||
#elif (ACC_OS_EMX)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# define HAVE_IO_H 1
|
|
||||||
#elif (ACC_OS_TOS && ACC_CC_GNUC)
|
|
||||||
# if !defined(__MINT__)
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_FCNTL_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* DOS, OS/2 & Windows */
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
|
|
||||||
#define HAVE_CONIO_H 1
|
|
||||||
#define HAVE_DIRECT_H 1
|
|
||||||
#define HAVE_DOS_H 1
|
|
||||||
#define HAVE_IO_H 1
|
|
||||||
#define HAVE_SHARE_H 1
|
|
||||||
|
|
||||||
#if (ACC_CC_AZTECC)
|
|
||||||
# undef HAVE_CONIO_H
|
|
||||||
# undef HAVE_DIRECT_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#elif (ACC_CC_BORLANDC)
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# undef HAVE_DIRENT_H /* pulls in <windows.h>; use <dir.h> instead */
|
|
||||||
# endif
|
|
||||||
# if (__BORLANDC__ < 0x0400)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_DMC)
|
|
||||||
# undef HAVE_DIRENT_H /* not working */
|
|
||||||
# undef HAVE_UNISTD_H /* not working */
|
|
||||||
# define HAVE_SYS_DIRENT_H 1
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
#elif (ACC_CC_IBMC && ACC_OS_OS2)
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_CC_INTELC || ACC_CC_MSC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_CC_LCC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__MINGW32__)
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#elif (ACC_CC_PACIFICC)
|
|
||||||
# undef HAVE_DIRECT_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_FCNTL_H
|
|
||||||
# undef HAVE_IO_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PELLESC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# if (__POCC__ < 280)
|
|
||||||
# else
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PGI) && defined(__MINGW32__)
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
#elif (ACC_CC_SYMANTECC)
|
|
||||||
# undef HAVE_DIRENT_H /* opendir() not implemented in libc */
|
|
||||||
# undef HAVE_UNISTD_H /* not working */
|
|
||||||
# if (__SC__ < 0x700)
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_TOPSPEEDC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H /* useless */
|
|
||||||
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# undef HAVE_DIRENT_H /* pulls in <windows.h>; use <dir.h> instead */
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0200)
|
|
||||||
# undef HAVE_SIGNAL_H /* not working */
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0400)
|
|
||||||
# undef HAVE_DIRECT_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_WATCOMC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
# if (__WATCOMC__ < 950)
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_ZORTECHC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* DOS, OS/2 & Windows */
|
|
||||||
|
|
||||||
|
|
||||||
#if (HAVE_SYS_TIME_H && HAVE_TIME_H)
|
|
||||||
# define TIME_WITH_SYS_TIME 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_HEADERS) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for library functions
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_FUNCTIONS)
|
|
||||||
|
|
||||||
#define HAVE_ACCESS 1
|
|
||||||
#define HAVE_ALLOCA 1
|
|
||||||
#define HAVE_ATEXIT 1
|
|
||||||
#define HAVE_ATOI 1
|
|
||||||
#define HAVE_ATOL 1
|
|
||||||
#define HAVE_CHMOD 1
|
|
||||||
#define HAVE_CHOWN 1
|
|
||||||
#define HAVE_CTIME 1
|
|
||||||
#define HAVE_DIFFTIME 1
|
|
||||||
#define HAVE_FILENO 1
|
|
||||||
#define HAVE_FSTAT 1
|
|
||||||
#define HAVE_GETTIMEOFDAY 1
|
|
||||||
#define HAVE_GMTIME 1
|
|
||||||
#define HAVE_LOCALTIME 1
|
|
||||||
#define HAVE_LONGJMP 1
|
|
||||||
#define HAVE_LSTAT 1
|
|
||||||
#define HAVE_MEMCMP 1
|
|
||||||
#define HAVE_MEMCPY 1
|
|
||||||
#define HAVE_MEMMOVE 1
|
|
||||||
#define HAVE_MEMSET 1
|
|
||||||
#define HAVE_MKTIME 1
|
|
||||||
#define HAVE_QSORT 1
|
|
||||||
#define HAVE_RAISE 1
|
|
||||||
#define HAVE_SETJMP 1
|
|
||||||
#define HAVE_SIGNAL 1
|
|
||||||
#define HAVE_SNPRINTF 1
|
|
||||||
#define HAVE_STAT 1
|
|
||||||
#define HAVE_STRCHR 1
|
|
||||||
#define HAVE_STRDUP 1
|
|
||||||
#define HAVE_STRERROR 1
|
|
||||||
#define HAVE_STRFTIME 1
|
|
||||||
#define HAVE_STRRCHR 1
|
|
||||||
#define HAVE_STRSTR 1
|
|
||||||
#define HAVE_TIME 1
|
|
||||||
#define HAVE_UMASK 1
|
|
||||||
#define HAVE_UTIME 1
|
|
||||||
#define HAVE_VSNPRINTF 1
|
|
||||||
|
|
||||||
#if (ACC_OS_BEOS || ACC_OS_CYGWIN || ACC_OS_POSIX || ACC_OS_QNX)
|
|
||||||
# define HAVE_STRCASECMP 1
|
|
||||||
# define HAVE_STRNCASECMP 1
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
# define HAVE_STRCASECMP 1
|
|
||||||
# define HAVE_STRNCASECMP 1
|
|
||||||
#else
|
|
||||||
# define HAVE_STRICMP 1
|
|
||||||
# define HAVE_STRNICMP 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_POSIX)
|
|
||||||
# if (ACC_CC_TINYC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# elif defined(__dietlibc__)
|
|
||||||
# endif
|
|
||||||
# if (ACC_OS_POSIX_MACOSX && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
/* FIXME ??? */
|
|
||||||
# undef HAVE_CHOWN
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_CYGWIN)
|
|
||||||
# if (ACC_CC_GNUC < 0x025a00ul)
|
|
||||||
# undef HAVE_GETTIMEOFDAY
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
# endif
|
|
||||||
# if (ACC_CC_GNUC < 0x025f00ul)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_EMX)
|
|
||||||
# undef HAVE_CHOWN
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
#elif (ACC_OS_TOS && ACC_CC_GNUC)
|
|
||||||
# if !defined(__MINT__)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_ACCESS
|
|
||||||
# undef HAVE_CHMOD
|
|
||||||
# undef HAVE_CHOWN
|
|
||||||
# undef HAVE_FSTAT
|
|
||||||
# undef HAVE_GETTIMEOFDAY
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_UMASK
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* DOS, OS/2 & Windows */
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
|
|
||||||
#undef HAVE_CHOWN
|
|
||||||
#undef HAVE_GETTIMEOFDAY
|
|
||||||
#undef HAVE_LSTAT
|
|
||||||
#undef HAVE_UMASK
|
|
||||||
|
|
||||||
#if (ACC_CC_AZTECC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_DIFFTIME /* difftime() is in the math library */
|
|
||||||
# undef HAVE_FSTAT
|
|
||||||
# undef HAVE_STRDUP /* missing in 5.2a */
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_UTIME /* struct utimbuf is missing */
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_BORLANDC)
|
|
||||||
# if (__BORLANDC__ < 0x0400)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# endif
|
|
||||||
# if ((__BORLANDC__ < 0x0410) && ACC_OS_WIN16)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# if (__BORLANDC__ < 0x0550)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_DMC)
|
|
||||||
# if (ACC_OS_WIN16)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_IBMC)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_INTELC)
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#elif (ACC_CC_LCC)
|
|
||||||
# define utime _utime
|
|
||||||
#elif (ACC_CC_MSC)
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# undef HAVE_STRFTIME
|
|
||||||
# endif
|
|
||||||
# if (_MSC_VER < 700)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
# if ((_MSC_VER < 800) && ACC_OS_WIN16)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# if (ACC_ARCH_IA16) && defined(__cplusplus)
|
|
||||||
# undef HAVE_LONGJMP
|
|
||||||
# undef HAVE_SETJMP
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__MINGW32__)
|
|
||||||
# if (ACC_CC_GNUC < 0x025f00ul)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
# if (__MSL__ < 0x8000ul)
|
|
||||||
# undef HAVE_CHMOD /* <unix.h> which in turn pulls in <windows.h> */
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_STRNICMP
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# if defined(__cplusplus)
|
|
||||||
# undef HAVE_STAT
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_PACIFICC)
|
|
||||||
# undef HAVE_ACCESS
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_CHMOD
|
|
||||||
# undef HAVE_DIFFTIME
|
|
||||||
# undef HAVE_FSTAT
|
|
||||||
# undef HAVE_MKTIME
|
|
||||||
# undef HAVE_RAISE
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_STRFTIME
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PELLESC)
|
|
||||||
# if (__POCC__ < 280)
|
|
||||||
# define alloca _alloca
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PGI) && defined(__MINGW32__)
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_SYMANTECC)
|
|
||||||
# if (ACC_OS_WIN16 && (ACC_MM_MEDIUM || ACC_MM_LARGE || ACC_MM_HUGE))
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# if (__SC__ < 0x600)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
# if (__SC__ < 0x700)
|
|
||||||
# undef HAVE_DIFFTIME /* difftime() is broken */
|
|
||||||
# undef HAVE_UTIME /* struct utimbuf is missing */
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_TOPSPEEDC)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# if (__TURBOC__ < 0x0200)
|
|
||||||
# undef HAVE_RAISE
|
|
||||||
# undef HAVE_SIGNAL
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0295)
|
|
||||||
# undef HAVE_MKTIME
|
|
||||||
# undef HAVE_STRFTIME
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0400)
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_WATCOMC)
|
|
||||||
# if (__WATCOMC__ < 1100)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# elif (__WATCOMC__ < 1200)
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_ZORTECHC)
|
|
||||||
# if (ACC_OS_WIN16 && (ACC_MM_MEDIUM || ACC_MM_LARGE || ACC_MM_HUGE))
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# undef HAVE_DIFFTIME /* difftime() is broken */
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_UTIME /* struct utimbuf is missing */
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* DOS, OS/2 & Windows */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_FUNCTIONS) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for sizes
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_SIZES)
|
|
||||||
|
|
||||||
#define SIZEOF_SHORT (__ACC_SHORT_BIT / 8)
|
|
||||||
#define SIZEOF_INT (__ACC_INT_BIT / 8)
|
|
||||||
#define SIZEOF_LONG (__ACC_LONG_BIT / 8)
|
|
||||||
|
|
||||||
#if (ACC_OS_WIN64) /* LLP64 programming model */
|
|
||||||
# define SIZEOF_PTRDIFF_T 8
|
|
||||||
# define SIZEOF_SIZE_T 8
|
|
||||||
# define SIZEOF_VOID_P 8
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# define SIZEOF_SIZE_T 2
|
|
||||||
# if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
# define SIZEOF_VOID_P 2
|
|
||||||
# elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
# define SIZEOF_VOID_P 4
|
|
||||||
# else
|
|
||||||
# error "ACC_MM"
|
|
||||||
# endif
|
|
||||||
# if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
# define SIZEOF_PTRDIFF_T 2
|
|
||||||
# elif (ACC_MM_COMPACT || ACC_MM_LARGE)
|
|
||||||
# if (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# define SIZEOF_PTRDIFF_T 4
|
|
||||||
# else
|
|
||||||
# define SIZEOF_PTRDIFF_T 2
|
|
||||||
# endif
|
|
||||||
# elif (ACC_MM_HUGE)
|
|
||||||
# define SIZEOF_PTRDIFF_T 4
|
|
||||||
# else
|
|
||||||
# error "ACC_MM"
|
|
||||||
# endif
|
|
||||||
#elif (ACC_ARCH_AVR || ACC_ARCH_C166 || ACC_ARCH_MCS51 || ACC_ARCH_MCS251)
|
|
||||||
# define SIZEOF_PTRDIFF_T 2
|
|
||||||
# define SIZEOF_SIZE_T 2
|
|
||||||
# define SIZEOF_VOID_P 2
|
|
||||||
#else
|
|
||||||
# define SIZEOF_PTRDIFF_T SIZEOF_LONG
|
|
||||||
# define SIZEOF_SIZE_T SIZEOF_LONG
|
|
||||||
# define SIZEOF_VOID_P SIZEOF_LONG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(SIZEOF_CHAR_P) && (SIZEOF_VOID_P > 0)
|
|
||||||
# define SIZEOF_CHAR_P SIZEOF_VOID_P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if ((SIZEOF_LONG) > 0 && (SIZEOF_LONG) < 8)
|
|
||||||
#if (ACC_ARCH_IA16 && ACC_CC_DMC)
|
|
||||||
#elif (ACC_CC_GNUC)
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif ((ACC_OS_WIN32 || ACC_OS_WIN64) && ACC_CC_MSC && (_MSC_VER >= 1400))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_OS_WIN64)
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_DMC))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_SYMANTECC && (__SC__ >= 0x700)))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_INTELC && defined(__linux__)))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_MWERKS || ACC_CC_PELLESC || ACC_CC_PGI))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_INTELC || ACC_CC_MSC))
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0520)))
|
|
||||||
/* INFO: unsigned __int64 is somewhat broken in 0x0520; fixed in 0x0530 */
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_WATCOMC && (__WATCOMC__ >= 1100)))
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64))
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif 1 && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus) && defined(ACC_CC_GNUC)
|
|
||||||
# if (ACC_CC_GNUC < 0x020800ul)
|
|
||||||
# undef SIZEOF_LONG_LONG
|
|
||||||
# undef SIZEOF_UNSIGNED_LONG_LONG
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_SIZES) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// misc
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(HAVE_SIGNAL) && !defined(RETSIGTYPE)
|
|
||||||
# define RETSIGTYPE void
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* C/C++ Compiler - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_CC_UNKNOWN [default]
|
|
||||||
* ACC_CC_GNUC
|
|
||||||
* ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(CIL) && defined(_GNUCC) && defined(__GNUC__)
|
|
||||||
# define ACC_CC_CILLY 1
|
|
||||||
# define ACC_INFO_CC "Cilly"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__INTEL_COMPILER)
|
|
||||||
# define ACC_CC_INTELC 1
|
|
||||||
# define ACC_INFO_CC "Intel C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__INTEL_COMPILER)
|
|
||||||
#elif defined(__POCC__)
|
|
||||||
# define ACC_CC_PELLESC 1
|
|
||||||
# define ACC_INFO_CC "Pelles C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__POCC__)
|
|
||||||
#elif defined(__GNUC__) && defined(__VERSION__)
|
|
||||||
# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
|
||||||
# define ACC_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__)
|
|
||||||
# elif defined(__GNUC_MINOR__)
|
|
||||||
# define ACC_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100)
|
|
||||||
# else
|
|
||||||
# define ACC_CC_GNUC (__GNUC__ * 0x10000L)
|
|
||||||
# endif
|
|
||||||
# define ACC_INFO_CC "gcc"
|
|
||||||
# define ACC_INFO_CCVER __VERSION__
|
|
||||||
#elif defined(__AZTEC_C__)
|
|
||||||
# define ACC_CC_AZTECC 1
|
|
||||||
# define ACC_INFO_CC "Aztec C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__AZTEC_C__)
|
|
||||||
#elif defined(__BORLANDC__)
|
|
||||||
# define ACC_CC_BORLANDC 1
|
|
||||||
# define ACC_INFO_CC "Borland C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__BORLANDC__)
|
|
||||||
#elif defined(__DMC__)
|
|
||||||
# define ACC_CC_DMC 1
|
|
||||||
# define ACC_INFO_CC "Digital Mars C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__DMC__)
|
|
||||||
#elif defined(__DECC)
|
|
||||||
# define ACC_CC_DECC 1
|
|
||||||
# define ACC_INFO_CC "DEC C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__DECC)
|
|
||||||
#elif defined(__HIGHC__)
|
|
||||||
# define ACC_CC_HIGHC 1
|
|
||||||
# define ACC_INFO_CC "MetaWare High C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__IBMC__)
|
|
||||||
# define ACC_CC_IBMC 1
|
|
||||||
# define ACC_INFO_CC "IBM C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__IBMC__)
|
|
||||||
#elif defined(__KEIL__) && defined(__C166__)
|
|
||||||
# define ACC_CC_KEILC 1
|
|
||||||
# define ACC_INFO_CC "Keil C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__C166__)
|
|
||||||
#elif defined(__LCC__)
|
|
||||||
# define ACC_CC_LCC 1
|
|
||||||
# define ACC_INFO_CC "lcc"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
# define ACC_CC_MSC 1
|
|
||||||
# define ACC_INFO_CC "Microsoft C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(_MSC_VER)
|
|
||||||
#elif defined(__MWERKS__)
|
|
||||||
# define ACC_CC_MWERKS 1
|
|
||||||
# define ACC_INFO_CC "Metrowerks C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__MWERKS__)
|
|
||||||
#elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386)
|
|
||||||
# define ACC_CC_NDPC 1
|
|
||||||
# define ACC_INFO_CC "Microway NDP C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__PACIFIC__)
|
|
||||||
# define ACC_CC_PACIFICC 1
|
|
||||||
# define ACC_INFO_CC "Pacific C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__PACIFIC__)
|
|
||||||
#elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__))
|
|
||||||
# define ACC_CC_PGI 1
|
|
||||||
# define ACC_INFO_CC "Portland Group PGI C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__PUREC__)
|
|
||||||
# define ACC_CC_PUREC 1
|
|
||||||
# define ACC_INFO_CC "Pure C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__PUREC__)
|
|
||||||
#elif defined(__SC__)
|
|
||||||
# define ACC_CC_SYMANTECC 1
|
|
||||||
# define ACC_INFO_CC "Symantec C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__SC__)
|
|
||||||
#elif defined(__SUNPRO_C)
|
|
||||||
# define ACC_CC_SUNPROC 1
|
|
||||||
# define ACC_INFO_CC "Sun C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__TINYC__)
|
|
||||||
# define ACC_CC_TINYC 1
|
|
||||||
# define ACC_INFO_CC "Tiny C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__TINYC__)
|
|
||||||
#elif defined(__TSC__)
|
|
||||||
# define ACC_CC_TOPSPEEDC 1
|
|
||||||
# define ACC_INFO_CC "TopSpeed C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__TSC__)
|
|
||||||
#elif defined(__WATCOMC__)
|
|
||||||
# define ACC_CC_WATCOMC 1
|
|
||||||
# define ACC_INFO_CC "Watcom C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__WATCOMC__)
|
|
||||||
#elif defined(__TURBOC__)
|
|
||||||
# define ACC_CC_TURBOC 1
|
|
||||||
# define ACC_INFO_CC "Turbo C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__TURBOC__)
|
|
||||||
#elif defined(__ZTC__)
|
|
||||||
# define ACC_CC_ZORTECHC 1
|
|
||||||
# define ACC_INFO_CC "Zortech C"
|
|
||||||
# if (__ZTC__ == 0x310)
|
|
||||||
# define ACC_INFO_CCVER "0x310"
|
|
||||||
# else
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__ZTC__)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define ACC_CC_UNKNOWN 1
|
|
||||||
# define ACC_INFO_CC "unknown"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,455 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACCCHK_ASSERT)
|
|
||||||
# define ACCCHK_ASSERT(expr) ACC_COMPILE_TIME_ASSERT(expr)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* compile-time sign */
|
|
||||||
#if !defined(ACCCHK_ASSERT_SIGN_T)
|
|
||||||
# define ACCCHK_ASSERT_SIGN_T(type,relop) \
|
|
||||||
ACCCHK_ASSERT( (type) (-1) relop (type) 0 ) \
|
|
||||||
ACCCHK_ASSERT( (type) (~(type)0) relop (type) 0 ) \
|
|
||||||
ACCCHK_ASSERT( (type) (~(type)0) == (type) (-1) )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ACCCHK_IS_SIGNED_T)
|
|
||||||
# define ACCCHK_ASSERT_IS_SIGNED_T(type) ACCCHK_ASSERT_SIGN_T(type,<)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ACCCHK_IS_UNSIGNED_T)
|
|
||||||
# if (ACC_BROKEN_INTEGRAL_PROMOTION)
|
|
||||||
# define ACCCHK_ASSERT_IS_UNSIGNED_T(type) \
|
|
||||||
ACCCHK_ASSERT( (type) (-1) > (type) 0 )
|
|
||||||
# else
|
|
||||||
# define ACCCHK_ASSERT_IS_UNSIGNED_T(type) ACCCHK_ASSERT_SIGN_T(type,>)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check preprocessor
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_0xffffffffL - ACC_UINT32L_C(4294967294) != 1)
|
|
||||||
# error "preprocessor error 1"
|
|
||||||
#endif
|
|
||||||
#if (ACC_0xffffffffL - ACC_UINT32L_C(0xfffffffd) != 2)
|
|
||||||
# error "preprocessor error 2"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define ACCCHK_VAL 1
|
|
||||||
#define ACCCHK_TMP1 ACCCHK_VAL
|
|
||||||
#undef ACCCHK_VAL
|
|
||||||
#define ACCCHK_VAL 2
|
|
||||||
#define ACCCHK_TMP2 ACCCHK_VAL
|
|
||||||
#if (ACCCHK_TMP1 != 2)
|
|
||||||
# error "preprocessor error 3a"
|
|
||||||
#endif
|
|
||||||
#if (ACCCHK_TMP2 != 2)
|
|
||||||
# error "preprocessor error 3b"
|
|
||||||
#endif
|
|
||||||
#undef ACCCHK_VAL
|
|
||||||
#if (ACCCHK_TMP2)
|
|
||||||
# error "preprocessor error 3c"
|
|
||||||
#endif
|
|
||||||
#if (ACCCHK_TMP2 + 0 != 0)
|
|
||||||
# error "preprocessor error 3d"
|
|
||||||
#endif
|
|
||||||
#undef ACCCHK_TMP1
|
|
||||||
#undef ACCCHK_TMP2
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check basic arithmetics
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(1 == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(__ACC_INT_MAX(2) == 1)
|
|
||||||
ACCCHK_ASSERT(__ACC_INT_MAX(8) == 127)
|
|
||||||
ACCCHK_ASSERT(__ACC_INT_MAX(16) == 32767)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(2) == 3)
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(16) == 0xffffU)
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(32) == 0xffffffffUL)
|
|
||||||
#if !defined(ACC_BROKEN_INTEGRAL_PROMOTION)
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(__ACC_INT_BIT) == ~(0u))
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(__ACC_LONG_BIT) == ~(0ul))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check basic types
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(signed char)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned char)
|
|
||||||
ACCCHK_ASSERT(sizeof(signed char) == sizeof(char))
|
|
||||||
ACCCHK_ASSERT(sizeof(unsigned char) == sizeof(char))
|
|
||||||
ACCCHK_ASSERT(sizeof(char) == 1)
|
|
||||||
#if (ACC_CC_CILLY)
|
|
||||||
/* CIL is broken */
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(char) == sizeof((char)0))
|
|
||||||
#endif
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
ACCCHK_ASSERT(sizeof('\0') == sizeof(char))
|
|
||||||
#else
|
|
||||||
# if (ACC_CC_DMC)
|
|
||||||
/* Digital Mars C is broken */
|
|
||||||
# else
|
|
||||||
ACCCHK_ASSERT(sizeof('\0') == sizeof(int))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if defined(acc_alignof)
|
|
||||||
ACCCHK_ASSERT(acc_alignof(char) == 1)
|
|
||||||
ACCCHK_ASSERT(acc_alignof(signed char) == 1)
|
|
||||||
ACCCHK_ASSERT(acc_alignof(unsigned char) == 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(short)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned short)
|
|
||||||
ACCCHK_ASSERT(sizeof(short) == sizeof(unsigned short))
|
|
||||||
ACCCHK_ASSERT(sizeof(short) >= 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(short) >= sizeof(char))
|
|
||||||
#if (ACC_CC_CILLY)
|
|
||||||
/* CIL is broken */
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(short) == sizeof((short)0))
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_SHORT > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(short) == SIZEOF_SHORT)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(int)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned int)
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == sizeof(unsigned int))
|
|
||||||
ACCCHK_ASSERT(sizeof(int) >= 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(int) >= sizeof(short))
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == sizeof(0))
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == sizeof((int)0))
|
|
||||||
#if (SIZEOF_INT > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == SIZEOF_INT)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(long)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned long)
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == sizeof(unsigned long))
|
|
||||||
ACCCHK_ASSERT(sizeof(long) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(long) >= sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == sizeof(0L))
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == sizeof((long)0))
|
|
||||||
#if (SIZEOF_LONG > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == SIZEOF_LONG)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(size_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) >= sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == sizeof(sizeof(0))) /* sizeof() returns size_t */
|
|
||||||
#if (SIZEOF_SIZE_T > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == SIZEOF_SIZE_T)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(ptrdiff_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) >= sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) >= sizeof(size_t))
|
|
||||||
#if !defined(ACC_BROKEN_SIZEOF)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == sizeof((char*)0 - (char*)0))
|
|
||||||
# if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
ACCCHK_ASSERT(4 == sizeof((char __huge*)0 - (char __huge*)0))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_PTRDIFF_T > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == SIZEOF_PTRDIFF_T)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) >= sizeof(char*))
|
|
||||||
#if (SIZEOF_VOID_P > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == SIZEOF_VOID_P)
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_CHAR_P > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(char*) == SIZEOF_CHAR_P)
|
|
||||||
#endif
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
ACCCHK_ASSERT(4 == sizeof(void __huge*))
|
|
||||||
ACCCHK_ASSERT(4 == sizeof(char __huge*))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check arithmetics
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCCHK_ASSERT((((1u << 15) + 1) >> 15) == 1)
|
|
||||||
ACCCHK_ASSERT((((1ul << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
#if (ACC_CC_TURBOC && (__TURBOC__ < 0x0150))
|
|
||||||
/* TC 1.0 bug, probably due to ACC_BROKEN_INTEGRAL_PROMOTION ?? */
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT((1 << (8*SIZEOF_INT-1)) < 0)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((1u << (8*SIZEOF_INT-1)) > 0)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT((1l << (8*SIZEOF_LONG-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((1ul << (8*SIZEOF_LONG-1)) > 0)
|
|
||||||
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32e_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32e_t) == SIZEOF_ACC_INT32E_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32e_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32e_t) == sizeof(acc_uint32e_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int32e_t)1 << 30) + 1) >> 30) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT32E_C(1) << 30) + 1) >> 30) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint32e_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint32e_t)1 << 31) + 1) >> 31) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT32E_C(1) << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT( (acc_int32e_t) (1 + ~(acc_int32e_t)0) == 0)
|
|
||||||
#if defined(ACCCHK_CONFIG_PEDANTIC)
|
|
||||||
/* compiler may warn about overflow */
|
|
||||||
ACCCHK_ASSERT( (acc_uint32e_t)(1 + ~(acc_uint32e_t)0) == 0)
|
|
||||||
#endif /* ACCCHK_CONFIG_PEDANTIC */
|
|
||||||
|
|
||||||
#if (SIZEOF_ACC_INT32E_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32E_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32E_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32E_C(0)) == SIZEOF_ACC_INT32E_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32E_C(0)) == SIZEOF_ACC_INT32E_T)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((ACC_INT32E_C(1) << (8*SIZEOF_ACC_INT32E_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32E_C(1) << (8*SIZEOF_ACC_INT32E_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT((ACC_INT32E_C(1) << (int)(8*sizeof(ACC_INT32E_C(1))-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32E_C(1) << (int)(8*sizeof(ACC_UINT32E_C(1))-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32E_C(2147483647) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32E_C(-2147483647) -1 < 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32E_C(4294967295) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32E_C(4294967295) == ACC_0xffffffffL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) >= sizeof(int))
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) >= sizeof(acc_int32e_t))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) == SIZEOF_ACC_INT32L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32l_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) == sizeof(acc_uint32l_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int32l_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int32l_t)1 << 30) + 1) >> 30) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT32L_C(1) << 30) + 1) >> 30) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint32l_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint32l_t)1 << 31) + 1) >> 31) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT32L_C(1) << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
#if (SIZEOF_ACC_INT32L_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32L_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32L_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32L_C(0)) == SIZEOF_ACC_INT32L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32L_C(0)) == SIZEOF_ACC_INT32L_T)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((ACC_INT32L_C(1) << (8*SIZEOF_ACC_INT32L_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32L_C(1) << (8*SIZEOF_ACC_INT32L_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT((ACC_INT32L_C(1) << (int)(8*sizeof(ACC_INT32L_C(1))-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32L_C(1) << (int)(8*sizeof(ACC_UINT32L_C(1))-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32L_C(2147483647) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32L_C(-2147483647) -1 < 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32L_C(4294967295) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32L_C(4294967295) == ACC_0xffffffffL)
|
|
||||||
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(int))
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(acc_int32e_t))
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(acc_int32l_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(acc_int32l_t))
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) == SIZEOF_ACC_INT32F_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32f_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32f_t) >= sizeof(acc_uint32l_t))
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) == sizeof(acc_uint32f_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int32f_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int32f_t)1 << 30) + 1) >> 30) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT32F_C(1) << 30) + 1) >> 30) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint32f_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint32f_t)1 << 31) + 1) >> 31) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT32F_C(1) << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
#if (SIZEOF_ACC_INT32F_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32F_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32F_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32F_C(0)) == SIZEOF_ACC_INT32F_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32F_C(0)) == SIZEOF_ACC_INT32F_T)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((ACC_INT32F_C(1) << (8*SIZEOF_ACC_INT32F_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32F_C(1) << (8*SIZEOF_ACC_INT32F_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT((ACC_INT32F_C(1) << (int)(8*sizeof(ACC_INT32F_C(1))-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32F_C(1) << (int)(8*sizeof(ACC_UINT32F_C(1))-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32F_C(2147483647) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32F_C(-2147483647) -1 < 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32F_C(4294967295) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32F_C(4294967295) == ACC_0xffffffffL)
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(acc_int64l_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int64l_t) >= 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int64l_t) == SIZEOF_ACC_INT64L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint64l_t) >= 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int64l_t) == sizeof(acc_uint64l_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int64l_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int64l_t)1 << 62) + 1) >> 62) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT64L_C(1) << 62) + 1) >> 62) == 1)
|
|
||||||
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0530))
|
|
||||||
/* Borland C is broken */
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint64l_t)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT64L_C(18446744073709551615) > 0)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint64l_t)1 << 63) + 1) >> 63) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT64L_C(1) << 63) + 1) >> 63) == 1)
|
|
||||||
|
|
||||||
#if defined(ACCCHK_CONFIG_PEDANTIC)
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0560))
|
|
||||||
/* Borland C is broken */
|
|
||||||
#elif (SIZEOF_ACC_INT64L_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT64L_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT64L_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT64L_C(0)) == SIZEOF_ACC_INT64L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT64L_C(0)) == SIZEOF_ACC_INT64L_T)
|
|
||||||
#endif
|
|
||||||
#endif /* ACCCHK_CONFIG_PEDANTIC */
|
|
||||||
ACCCHK_ASSERT((ACC_INT64L_C(1) << (8*SIZEOF_ACC_INT64L_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT64L_C(1) << (8*SIZEOF_ACC_INT64L_T-1)) > 0)
|
|
||||||
#if (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020600ul))
|
|
||||||
/* avoid pedantic warning */
|
|
||||||
ACCCHK_ASSERT(ACC_INT64L_C(9223372036854775807) > ACC_INT64L_C(0))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(ACC_INT64L_C(9223372036854775807) > 0)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT(ACC_INT64L_C(-9223372036854775807) - 1 < 0)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT( ACC_INT64L_C(9223372036854775807) % 2147483629l == 721)
|
|
||||||
ACCCHK_ASSERT( ACC_INT64L_C(9223372036854775807) % 2147483647l == 1)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT64L_C(9223372036854775807) % 2147483629ul == 721)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT64L_C(9223372036854775807) % 2147483647ul == 1)
|
|
||||||
#endif /* acc_int64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_intptr_t)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uintptr_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) >= sizeof(void *))
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == SIZEOF_ACC_INTPTR_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(acc_uintptr_t))
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check memory model ACC_MM
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_MM_FLAT)
|
|
||||||
#if 0
|
|
||||||
/* this is not a valid assumption -- disabled */
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == sizeof(void (*)(void)))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 2)
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == 4)
|
|
||||||
#endif
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_COMPACT)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 2)
|
|
||||||
#elif (ACC_MM_MEDIUM || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 4)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check ACC_ARCH and ACC_OS
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_ARCH_IA16)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
|
|
||||||
#elif (ACC_ARCH_IA32 || ACC_ARCH_M68K)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
|
|
||||||
#elif (ACC_ARCH_AMD64 || ACC_ARCH_IA64)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_WIN32)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 4)
|
|
||||||
#elif (ACC_OS_WIN64)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 8)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check promotion rules
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_NDPC)
|
|
||||||
/* NDP C is broken */
|
|
||||||
#else
|
|
||||||
/* check that the compiler correctly casts signed to unsigned */
|
|
||||||
ACCCHK_ASSERT( (int) ((unsigned char) ((signed char) -1)) == 255)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_CC_KEILC)
|
|
||||||
/* Keil C is broken */
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
/* NDP C is broken */
|
|
||||||
#elif !defined(ACC_BROKEN_INTEGRAL_PROMOTION) && (SIZEOF_INT > 1)
|
|
||||||
/* check that the compiler correctly promotes integrals */
|
|
||||||
ACCCHK_ASSERT( (((unsigned char)128) << (int)(8*sizeof(int)-8)) < 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACCCHKR_FUNCNAME)
|
|
||||||
# define __ACCCHKR_FUNCNAME(f) accchkr_ ## f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(ACCCHKR_ASSERT)
|
|
||||||
|
|
||||||
#if 0 || defined(ACCCHKR_CONFIG_DEBUG)
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
static int __ACCCHKR_FUNCNAME(assert_fail)(const char* s, unsigned l)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "ACCCHKR assertion failed in line %u: `%s'\n", l, s);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#define ACCCHKR_ASSERT(expr) ((expr) ? 1 : __ACCCHKR_FUNCNAME(assert_fail)(#expr,__LINE__))
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define ACCCHKR_ASSERT(expr) ((expr) ? 1 : 0)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* avoid inlining */
|
|
||||||
static int __ACCCHKR_FUNCNAME(schedule_insns_bug)(void);
|
|
||||||
static int __ACCCHKR_FUNCNAME(strength_reduce_bug)(int*);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// main entry
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static int __ACCCHKR_FUNCNAME(check)(int r)
|
|
||||||
{
|
|
||||||
#if defined(ACC_ENDIAN_BIG_ENDIAN)
|
|
||||||
{
|
|
||||||
union { long l; unsigned char c[sizeof(long)]; } u;
|
|
||||||
u.l = 0; u.c[sizeof(long)-1] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l == 128);
|
|
||||||
u.l = 0; u.c[0] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l < 0);
|
|
||||||
ACC_UNUSED(u);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(ACC_ENDIAN_LITTLE_ENDIAN)
|
|
||||||
{
|
|
||||||
union { long l; unsigned char c[sizeof(long)]; } u;
|
|
||||||
u.l = 0; u.c[0] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l == 128);
|
|
||||||
u.l = 0; u.c[sizeof(long)-1] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l < 0);
|
|
||||||
ACC_UNUSED(u);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check for the gcc schedule-insns optimization bug */
|
|
||||||
if (r == 1)
|
|
||||||
{
|
|
||||||
r &= ACCCHKR_ASSERT(!__ACCCHKR_FUNCNAME(schedule_insns_bug()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for the gcc strength-reduce optimization bug */
|
|
||||||
if (r == 1)
|
|
||||||
{
|
|
||||||
static int x[3];
|
|
||||||
static unsigned xn = 3;
|
|
||||||
register unsigned j;
|
|
||||||
|
|
||||||
for (j = 0; j < xn; j++)
|
|
||||||
x[j] = (int)j - 3;
|
|
||||||
r &= ACCCHKR_ASSERT(!__ACCCHKR_FUNCNAME(strength_reduce_bug(x)));
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static int __ACCCHKR_FUNCNAME(schedule_insns_bug)(void)
|
|
||||||
{
|
|
||||||
const int a[] = {1, 2, 0}; const int* b;
|
|
||||||
b = a; return (*b) ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int __ACCCHKR_FUNCNAME(strength_reduce_bug)(int* x)
|
|
||||||
{
|
|
||||||
#if 0 && (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
ACC_UNUSED(x); return 0;
|
|
||||||
#else
|
|
||||||
return x[0] != -3 || x[1] != -2 || x[2] != -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_CXX_H_INCLUDED
|
|
||||||
#define __ACC_CXX_H_INCLUDED 1
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// exception specification
|
|
||||||
// ACC_CXX_NOTHROW
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_NOTHROW)
|
|
||||||
#elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020800ul))
|
|
||||||
#elif (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0450))
|
|
||||||
#elif (ACC_CC_HIGHC)
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER < 1100))
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
#elif (ACC_CC_WATCOMC && !defined(_CPPUNWIND))
|
|
||||||
#elif (ACC_CC_ZORTECHC)
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_NOTHROW throw()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ACC_CXX_NOTHROW)
|
|
||||||
# define ACC_CXX_NOTHROW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// disable dynamic allocation of an object - private helpers
|
|
||||||
// __ACC_CXX_DO_NEW
|
|
||||||
// __ACC_CXX_DO_DELETE
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__ACC_CXX_DO_NEW)
|
|
||||||
#elif (ACC_CC_NDPC || ACC_CC_PGI)
|
|
||||||
# define __ACC_CXX_DO_NEW { return 0; }
|
|
||||||
#else
|
|
||||||
# define __ACC_CXX_DO_NEW ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* need an implementation in case a class has virtual members */
|
|
||||||
#if defined(__ACC_CXX_DO_DELETE)
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# define __ACC_CXX_DO_DELETE { }
|
|
||||||
#else
|
|
||||||
# define __ACC_CXX_DO_DELETE ACC_CXX_NOTHROW { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// disable dynamic allocation of an object
|
|
||||||
// ACC_CXX_DISABLE_NEW_DELETE
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
#undef __ACC_CXX_HAVE_ARRAY_NEW
|
|
||||||
#undef __ACC_CXX_HAVE_PLACEMENT_NEW
|
|
||||||
#undef __ACC_CXX_HAVE_PLACEMENT_DELETE
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0450))
|
|
||||||
#elif (ACC_CC_MSC && ACC_MM_HUGE)
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER < 1100))
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
#elif (ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
#elif (ACC_CC_WATCOMC && (__WATCOMC__ < 1100))
|
|
||||||
#else
|
|
||||||
# define __ACC_CXX_HAVE_ARRAY_NEW 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACC_CXX_HAVE_ARRAY_NEW)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_NEW 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACC_CXX_HAVE_PLACEMENT_NEW)
|
|
||||||
# if (ACC_CC_GNUC >= 0x030000ul)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# elif (ACC_CC_INTELC)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER >= 1200))
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# elif (ACC_CC_PGI)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_DISABLE_NEW_DELETE)
|
|
||||||
#elif defined(new) || defined(delete)
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x025b00ul))
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif (ACC_CC_HIGHC)
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif !defined(__ACC_CXX_HAVE_ARRAY_NEW)
|
|
||||||
/* for old compilers use `protected' instead of `private' */
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE \
|
|
||||||
protected: static void operator delete(void*) __ACC_CXX_DO_DELETE \
|
|
||||||
protected: static void* operator new(size_t) __ACC_CXX_DO_NEW \
|
|
||||||
private:
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE \
|
|
||||||
protected: static void operator delete(void*) __ACC_CXX_DO_DELETE \
|
|
||||||
static void operator delete[](void*) __ACC_CXX_DO_DELETE \
|
|
||||||
private: static void* operator new(size_t) __ACC_CXX_DO_NEW \
|
|
||||||
static void* operator new[](size_t) __ACC_CXX_DO_NEW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Assist the compiler by defining a unique location for vtables and RTTI.
|
|
||||||
// Every class which has virtual member functions or derives from a class
|
|
||||||
// with virtual members should put this macro at the very top of its
|
|
||||||
// class declaration.
|
|
||||||
// ACC_CXX_TRIGGER_FUNCTION
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_TRIGGER_FUNCTION)
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_TRIGGER_FUNCTION \
|
|
||||||
protected: virtual const void* acc_cxx_trigger_function() const; \
|
|
||||||
private:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_TRIGGER_FUNCTION_IMPL)
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_TRIGGER_FUNCTION_IMPL(klass) \
|
|
||||||
const void* klass::acc_cxx_trigger_function() const { return 0; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// acc_alignof() / acc_inline
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_CILLY || ACC_CC_GNUC || ACC_CC_PGI)
|
|
||||||
# define acc_alignof(e) __alignof__(e)
|
|
||||||
#elif (ACC_CC_INTELC && (__INTEL_COMPILER >= 700))
|
|
||||||
# define acc_alignof(e) __alignof__(e)
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 1300))
|
|
||||||
# define acc_alignof(e) __alignof(e)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_CC_TURBOC && (__TURBOC__ <= 0x0295))
|
|
||||||
#elif defined(__cplusplus)
|
|
||||||
# define acc_inline inline
|
|
||||||
#elif (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0550))
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_CILLY || ACC_CC_GNUC || ACC_CC_PGI)
|
|
||||||
# define acc_inline __inline__
|
|
||||||
#elif (ACC_CC_DMC)
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_INTELC)
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 900))
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
|
||||||
# define acc_inline inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// ACC_UNUSED / ACC_UNUSED_FUNC
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_UNUSED)
|
|
||||||
# if (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0600))
|
|
||||||
# define ACC_UNUSED(var) ((void) &var)
|
|
||||||
# elif (ACC_CC_BORLANDC || ACC_CC_HIGHC || ACC_CC_NDPC || ACC_CC_TURBOC)
|
|
||||||
# define ACC_UNUSED(var) if (&var) ; else
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER < 900))
|
|
||||||
# define ACC_UNUSED(var) if (&var) ; else
|
|
||||||
# elif (ACC_CC_GNUC)
|
|
||||||
# define ACC_UNUSED(var) ((void) var)
|
|
||||||
# elif (ACC_CC_KEILC)
|
|
||||||
# define ACC_UNUSED(var)
|
|
||||||
# else
|
|
||||||
# define ACC_UNUSED(var) ((void) &var)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ACC_UNUSED_FUNC)
|
|
||||||
# if (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0600))
|
|
||||||
# define ACC_UNUSED_FUNC(func) ((void) func)
|
|
||||||
# elif (ACC_CC_BORLANDC || ACC_CC_NDPC || ACC_CC_TURBOC)
|
|
||||||
# define ACC_UNUSED_FUNC(func) if (func) ; else
|
|
||||||
# elif (ACC_CC_GNUC == 0x030400ul) && defined(__llvm__)
|
|
||||||
# define ACC_UNUSED_FUNC(func) ((void) &func)
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER < 900))
|
|
||||||
# define ACC_UNUSED_FUNC(func) if (func) ; else
|
|
||||||
# elif (ACC_CC_MSC)
|
|
||||||
# define ACC_UNUSED_FUNC(func) ((void) &func)
|
|
||||||
# elif (ACC_CC_KEILC)
|
|
||||||
# define ACC_UNUSED_FUNC(func)
|
|
||||||
# else
|
|
||||||
# define ACC_UNUSED_FUNC(func) ((void) func)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// compile-time-assertions
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* This can be put into a header file but may get ignored by some compilers. */
|
|
||||||
#if !defined(ACC_COMPILE_TIME_ASSERT_HEADER)
|
|
||||||
# if (ACC_CC_AZTECC || ACC_CC_ZORTECHC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-!(e)];
|
|
||||||
# elif (ACC_CC_DMC || ACC_CC_SYMANTECC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1u-2*!(e)];
|
|
||||||
# elif (ACC_CC_TURBOC && (__TURBOC__ == 0x0295))
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-!(e)];
|
|
||||||
# else
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-2*!(e)];
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This must appear within a function body. */
|
|
||||||
#if !defined(ACC_COMPILE_TIME_ASSERT)
|
|
||||||
# if (ACC_CC_AZTECC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) {typedef int __acc_cta_t[1-!(e)];}
|
|
||||||
# elif (ACC_CC_DMC || ACC_CC_PACIFICC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break;
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER < 900))
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break;
|
|
||||||
# elif (ACC_CC_TURBOC && (__TURBOC__ == 0x0295))
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break;
|
|
||||||
# else
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) {typedef int __acc_cta_t[1-2*!(e)];}
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// macros
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACC_UINT_MAX)
|
|
||||||
# define __ACC_INT_MAX(b) ((((1l << ((b)-2)) - 1l) * 2l) + 1l)
|
|
||||||
# define __ACC_UINT_MAX(b) ((((1ul << ((b)-1)) - 1ul) * 2ul) + 1ul)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// get sizes of builtin integral types from <limits.h>
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACC_SHORT_BIT)
|
|
||||||
# if (USHRT_MAX == ACC_0xffffL)
|
|
||||||
# define __ACC_SHORT_BIT 16
|
|
||||||
# elif (USHRT_MAX == ACC_0xffffffffL)
|
|
||||||
# define __ACC_SHORT_BIT 32
|
|
||||||
# elif (USHRT_MAX == __ACC_UINT_MAX(64))
|
|
||||||
# define __ACC_SHORT_BIT 64
|
|
||||||
# elif (USHRT_MAX == __ACC_UINT_MAX(128))
|
|
||||||
# define __ACC_SHORT_BIT 128
|
|
||||||
# else
|
|
||||||
# error "check your compiler installation: USHRT_MAX"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__ACC_INT_BIT)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define __ACC_INT_BIT 16
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define __ACC_INT_BIT 32
|
|
||||||
# elif (UINT_MAX == __ACC_UINT_MAX(64))
|
|
||||||
# define __ACC_INT_BIT 64
|
|
||||||
# elif (UINT_MAX == __ACC_UINT_MAX(128))
|
|
||||||
# define __ACC_INT_BIT 128
|
|
||||||
# else
|
|
||||||
# error "check your compiler installation: UINT_MAX"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__ACC_LONG_BIT)
|
|
||||||
# if (ULONG_MAX == ACC_0xffffffffL)
|
|
||||||
# define __ACC_LONG_BIT 32
|
|
||||||
# elif (ULONG_MAX == __ACC_UINT_MAX(64))
|
|
||||||
# define __ACC_LONG_BIT 64
|
|
||||||
# elif (ULONG_MAX == __ACC_UINT_MAX(128))
|
|
||||||
# define __ACC_LONG_BIT 128
|
|
||||||
# else
|
|
||||||
# error "check your compiler installation: ULONG_MAX"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// acc_auto.h supplements
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_CYGWIN || (ACC_OS_EMX && defined(__RSXNT__)) || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (ACC_CC_WATCOMC && (__WATCOMC__ < 1000))
|
|
||||||
# elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
/* ancient pw32 version */
|
|
||||||
# elif ((ACC_OS_CYGWIN || defined(__MINGW32__)) && (ACC_CC_GNUC && (ACC_CC_GNUC < 0x025f00ul)))
|
|
||||||
/* ancient cygwin/mingw version */
|
|
||||||
# else
|
|
||||||
# define ACC_HAVE_WINDOWS_H 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_INCD_H_INCLUDED
|
|
||||||
#define __ACC_INCD_H_INCLUDED 1
|
|
||||||
|
|
||||||
/* default system includes */
|
|
||||||
/* see Autoconf:
|
|
||||||
* headers.m4, _AC_INCLUDES_DEFAULT_REQUIREMENTS ac_includes_default
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#if defined(HAVE_TIME_H) && defined(__MSL__) && defined(__cplusplus)
|
|
||||||
# include <time.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_SYS_TYPES_H
|
|
||||||
# include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_SYS_STAT_H
|
|
||||||
# include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
#if STDC_HEADERS
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <stddef.h>
|
|
||||||
#else
|
|
||||||
# if HAVE_STDLIB_H
|
|
||||||
# include <stdlib.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if HAVE_STRING_H
|
|
||||||
# if !STDC_HEADERS && HAVE_MEMORY_H
|
|
||||||
# include <memory.h>
|
|
||||||
# endif
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_STRINGS_H
|
|
||||||
# include <strings.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_INTTYPES_H
|
|
||||||
# include <inttypes.h>
|
|
||||||
#else
|
|
||||||
# if HAVE_STDINT_H
|
|
||||||
# include <stdint.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_INCE_H_INCLUDED
|
|
||||||
#define __ACC_INCE_H_INCLUDED 1
|
|
||||||
|
|
||||||
/* extra system includes */
|
|
||||||
|
|
||||||
#if defined(HAVE_STDARG_H)
|
|
||||||
# include <stdarg.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_CTYPE_H)
|
|
||||||
# include <ctype.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_ERRNO_H)
|
|
||||||
# include <errno.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_MALLOC_H)
|
|
||||||
# include <malloc.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_ALLOCA_H)
|
|
||||||
# include <alloca.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_FCNTL_H)
|
|
||||||
# include <fcntl.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_DIRENT_H)
|
|
||||||
# include <dirent.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SETJMP_H)
|
|
||||||
# include <setjmp.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SIGNAL_H)
|
|
||||||
# include <signal.h>
|
|
||||||
#endif
|
|
||||||
#if defined(TIME_WITH_SYS_TIME)
|
|
||||||
# include <sys/time.h>
|
|
||||||
# include <time.h>
|
|
||||||
#elif defined(HAVE_TIME_H)
|
|
||||||
# include <time.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_UTIME_H)
|
|
||||||
# include <utime.h>
|
|
||||||
#elif defined(HAVE_SYS_UTIME_H)
|
|
||||||
# include <sys/utime.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* DOS, OS/2 & Windows */
|
|
||||||
#if defined(HAVE_IO_H)
|
|
||||||
# include <io.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_DOS_H)
|
|
||||||
# include <dos.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_DIRECT_H)
|
|
||||||
# include <direct.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SHARE_H)
|
|
||||||
# include <share.h>
|
|
||||||
#endif
|
|
||||||
#if defined(ACC_CC_NDPC)
|
|
||||||
# include <os.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TOS */
|
|
||||||
#if defined(__TOS__) && (defined(__PUREC__) || defined(__TURBOC__))
|
|
||||||
# include <ext.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_INCI_H_INCLUDED
|
|
||||||
#define __ACC_INCI_H_INCLUDED 1
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// internal system includes
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# include <tos.h>
|
|
||||||
#elif (ACC_HAVE_WINDOWS_H)
|
|
||||||
# if 1 && !defined(WIN32_LEAN_AND_MEAN)
|
|
||||||
# define WIN32_LEAN_AND_MEAN 1
|
|
||||||
# endif
|
|
||||||
# if 1 && !defined(_WIN32_WINNT)
|
|
||||||
/* Restrict to a subset of Windows NT 4.0 header files */
|
|
||||||
# define _WIN32_WINNT 0x0400
|
|
||||||
# endif
|
|
||||||
# include <windows.h>
|
|
||||||
# if (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# include <dir.h>
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_WIN16)
|
|
||||||
# if (ACC_CC_AZTECC)
|
|
||||||
# include <model.h>
|
|
||||||
# include <stat.h>
|
|
||||||
# elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# include <alloc.h>
|
|
||||||
# include <dir.h>
|
|
||||||
# elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# include <sys/exceptn.h>
|
|
||||||
# elif (ACC_CC_PACIFICC)
|
|
||||||
# include <unixio.h>
|
|
||||||
# include <stat.h>
|
|
||||||
# include <sys.h>
|
|
||||||
# elif (ACC_CC_WATCOMC)
|
|
||||||
# include <i86.h>
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_OS216)
|
|
||||||
# if (ACC_CC_WATCOMC)
|
|
||||||
# include <i86.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# if defined(FP_OFF)
|
|
||||||
# define ACC_FP_OFF(x) FP_OFF(x)
|
|
||||||
# elif defined(_FP_OFF)
|
|
||||||
# define ACC_FP_OFF(x) _FP_OFF(x)
|
|
||||||
# else
|
|
||||||
# define ACC_FP_OFF(x) (((const unsigned __far*)&(x))[0])
|
|
||||||
# endif
|
|
||||||
# if defined(FP_SEG)
|
|
||||||
# define ACC_FP_SEG(x) FP_SEG(x)
|
|
||||||
# elif defined(_FP_SEG)
|
|
||||||
# define ACC_FP_SEG(x) _FP_SEG(x)
|
|
||||||
# else
|
|
||||||
# define ACC_FP_SEG(x) (((const unsigned __far*)&(x))[1])
|
|
||||||
# endif
|
|
||||||
# if defined(MK_FP)
|
|
||||||
# define ACC_MK_FP(s,o) MK_FP(s,o)
|
|
||||||
# elif defined(_MK_FP)
|
|
||||||
# define ACC_MK_FP(s,o) _MK_FP(s,o)
|
|
||||||
# else
|
|
||||||
# define ACC_MK_FP(s,o) ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o)))
|
|
||||||
# endif
|
|
||||||
# if 0
|
|
||||||
# undef ACC_FP_OFF
|
|
||||||
# undef ACC_FP_SEG
|
|
||||||
# undef ACC_MK_FP
|
|
||||||
# define ACC_FP_OFF(x) (((const unsigned __far*)&(x))[0])
|
|
||||||
# define ACC_FP_SEG(x) (((const unsigned __far*)&(x))[1])
|
|
||||||
# define ACC_MK_FP(s,o) ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o)))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// preprocessor
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* workaround for preprocessor bugs in some compilers */
|
|
||||||
#if 0
|
|
||||||
#define ACC_0xffffL 0xfffful
|
|
||||||
#define ACC_0xffffffffL 0xfffffffful
|
|
||||||
#else
|
|
||||||
#define ACC_0xffffL 65535ul
|
|
||||||
#define ACC_0xffffffffL 4294967295ul
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* some things we cannot work around */
|
|
||||||
#if (ACC_0xffffL == ACC_0xffffffffL)
|
|
||||||
# error "your preprocessor is broken 1"
|
|
||||||
#endif
|
|
||||||
#if (16ul * 16384ul != 262144ul)
|
|
||||||
# error "your preprocessor is broken 2"
|
|
||||||
#endif
|
|
||||||
#if 0
|
|
||||||
#if (32767 >= 4294967295ul)
|
|
||||||
# error "your preprocessor is broken 3"
|
|
||||||
#endif
|
|
||||||
#if (65535u >= 4294967295ul)
|
|
||||||
# error "your preprocessor is broken 4"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// try to detect specific compilers
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (UINT_MAX == ACC_0xffffL)
|
|
||||||
#if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__)
|
|
||||||
# if !defined(MSDOS)
|
|
||||||
# define MSDOS 1
|
|
||||||
# endif
|
|
||||||
# if !defined(_MSDOS)
|
|
||||||
# define _MSDOS 1
|
|
||||||
# endif
|
|
||||||
#elif defined(__VERSION) && defined(MB_LEN_MAX)
|
|
||||||
# if (__VERSION == 520) && (MB_LEN_MAX == 1)
|
|
||||||
# if !defined(__AZTEC_C__)
|
|
||||||
# define __AZTEC_C__ __VERSION
|
|
||||||
# endif
|
|
||||||
# if !defined(__DOS__)
|
|
||||||
# define __DOS__ 1
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// fix incorrect and missing stuff
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Microsoft C does not correctly define ptrdiff_t for
|
|
||||||
* the 16-bit huge memory model.
|
|
||||||
*/
|
|
||||||
#if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ptrdiff_t long
|
|
||||||
# define _PTRDIFF_T_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Fix old compiler versions. */
|
|
||||||
#if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# undef __ACC_RENAME_A
|
|
||||||
# undef __ACC_RENAME_B
|
|
||||||
# if defined(__AZTEC_C__) && defined(__DOS__)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif defined(_MSC_VER) && defined(MSDOS)
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif (_MSC_VER < 700)
|
|
||||||
# define __ACC_RENAME_B 1
|
|
||||||
# endif
|
|
||||||
# elif defined(__TSC__) && defined(__OS2__)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif defined(__PACIFIC__) && defined(DOS)
|
|
||||||
# if !defined(__far)
|
|
||||||
# define __far far
|
|
||||||
# endif
|
|
||||||
# if !defined(__near)
|
|
||||||
# define __near near
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if defined(__ACC_RENAME_A)
|
|
||||||
# if !defined(__cdecl)
|
|
||||||
# define __cdecl cdecl
|
|
||||||
# endif
|
|
||||||
# if !defined(__far)
|
|
||||||
# define __far far
|
|
||||||
# endif
|
|
||||||
# if !defined(__huge)
|
|
||||||
# define __huge huge
|
|
||||||
# endif
|
|
||||||
# if !defined(__near)
|
|
||||||
# define __near near
|
|
||||||
# endif
|
|
||||||
# if !defined(__pascal)
|
|
||||||
# define __pascal pascal
|
|
||||||
# endif
|
|
||||||
# if !defined(__huge)
|
|
||||||
# define __huge huge
|
|
||||||
# endif
|
|
||||||
# elif defined(__ACC_RENAME_B)
|
|
||||||
# if !defined(__cdecl)
|
|
||||||
# define __cdecl _cdecl
|
|
||||||
# endif
|
|
||||||
# if !defined(__far)
|
|
||||||
# define __far _far
|
|
||||||
# endif
|
|
||||||
# if !defined(__huge)
|
|
||||||
# define __huge _huge
|
|
||||||
# endif
|
|
||||||
# if !defined(__near)
|
|
||||||
# define __near _near
|
|
||||||
# endif
|
|
||||||
# if !defined(__pascal)
|
|
||||||
# define __pascal _pascal
|
|
||||||
# endif
|
|
||||||
# elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__)
|
|
||||||
# if !defined(__cdecl)
|
|
||||||
# define __cdecl cdecl
|
|
||||||
# endif
|
|
||||||
# if !defined(__pascal)
|
|
||||||
# define __pascal pascal
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# undef __ACC_RENAME_A
|
|
||||||
# undef __ACC_RENAME_B
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (UINT_MAX == ACC_0xffffL)
|
|
||||||
#if defined(__AZTEC_C__) && defined(__DOS__)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
#elif defined(_MSC_VER) && defined(MSDOS)
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
# endif
|
|
||||||
# if (_MSC_VER < 700)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_PROMOTION 1
|
|
||||||
# define ACC_BROKEN_SIZEOF 1
|
|
||||||
# endif
|
|
||||||
#elif defined(__PACIFIC__) && defined(DOS)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
#elif defined(__TURBOC__) && defined(__MSDOS__)
|
|
||||||
# if (__TURBOC__ < 0x0150)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
# define ACC_BROKEN_INTEGRAL_PROMOTION 1
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0200)
|
|
||||||
# define ACC_BROKEN_SIZEOF 1
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0400) && defined(__cplusplus)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
# endif
|
|
||||||
#elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
# define ACC_BROKEN_SIZEOF 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if defined(__WATCOMC__) && (__WATCOMC__ < 900)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// ANSI C preprocessor macros (cpp)
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#define ACC_CPP_STRINGIZE(x) #x
|
|
||||||
#define ACC_CPP_MACRO_EXPAND(x) ACC_CPP_STRINGIZE(x)
|
|
||||||
|
|
||||||
/* concatenate */
|
|
||||||
#define ACC_CPP_CONCAT2(a,b) a ## b
|
|
||||||
#define ACC_CPP_CONCAT3(a,b,c) a ## b ## c
|
|
||||||
#define ACC_CPP_CONCAT4(a,b,c,d) a ## b ## c ## d
|
|
||||||
#define ACC_CPP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e
|
|
||||||
|
|
||||||
/* expand and concatenate (by using one level of indirection) */
|
|
||||||
#define ACC_CPP_ECONCAT2(a,b) ACC_CPP_CONCAT2(a,b)
|
|
||||||
#define ACC_CPP_ECONCAT3(a,b,c) ACC_CPP_CONCAT3(a,b,c)
|
|
||||||
#define ACC_CPP_ECONCAT4(a,b,c,d) ACC_CPP_CONCAT4(a,b,c,d)
|
|
||||||
#define ACC_CPP_ECONCAT5(a,b,c,d,e) ACC_CPP_CONCAT5(a,b,c,d,e)
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// stdc macros
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
# undef __STDC_CONSTANT_MACROS
|
|
||||||
# undef __STDC_LIMIT_MACROS
|
|
||||||
# define __STDC_CONSTANT_MACROS 1
|
|
||||||
# define __STDC_LIMIT_MACROS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// misc macros
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
# define ACC_EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define ACC_EXTERN_C extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(ACC_VERSION)
|
|
||||||
# if defined ACC_CONFIG_INCLUDE
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc.h")
|
|
||||||
# else
|
|
||||||
# include "acc.h"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_INCD_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_incd.h")
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_INCE_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_ince.h")
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_INCI_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_inci.h")
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_LIB_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_lib.h")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/bele.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hmemcpy.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hstring.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/halloc.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/dosalloc.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hfread.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hread.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/opendir.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/rand.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/misc.ch")
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* modules which use floating point are not included by default */
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/uclock.ch")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,526 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_LIB_H_INCLUDED
|
|
||||||
#define __ACC_LIB_H_INCLUDED 1
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__ACCLIB_FUNCNAME)
|
|
||||||
# define __ACCLIB_FUNCNAME(f) f
|
|
||||||
#endif
|
|
||||||
#if !defined(ACCLIB_EXTERN)
|
|
||||||
# define ACCLIB_EXTERN(r,f) extern r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__ACCLIB_CONST_CAST_RETURN)
|
|
||||||
#if (ACC_CC_GNUC)
|
|
||||||
# define __ACCLIB_CONST_CAST_RETURN(type,var) \
|
|
||||||
{ union { type a; const type b; } u; u.b = (var); return u.a; }
|
|
||||||
#else
|
|
||||||
# define __ACCLIB_CONST_CAST_RETURN(type,var) return (type) (var);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_WIN64)
|
|
||||||
# define acclib_handle_t acc_int64l_t
|
|
||||||
# define acclib_uhandle_t acc_uint64l_t
|
|
||||||
#elif (ACC_ARCH_IA32 && ACC_CC_MSC && (_MSC_VER >= 1300))
|
|
||||||
typedef __w64 long acclib_handle_t;
|
|
||||||
typedef __w64 unsigned long acclib_uhandle_t;
|
|
||||||
# define acclib_handle_t acclib_handle_t
|
|
||||||
# define acclib_uhandle_t acclib_uhandle_t
|
|
||||||
#else
|
|
||||||
# define acclib_handle_t long
|
|
||||||
# define acclib_uhandle_t unsigned long
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap <ctype.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_digit) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_islower) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_isupper) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_tolower) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_toupper) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_utolower) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_utoupper) (int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define acc_ascii_isdigit(c) (((unsigned)(c) - 48) < 10)
|
|
||||||
#define acc_ascii_islower(c) (((unsigned)(c) - 97) < 26)
|
|
||||||
#define acc_ascii_isupper(c) (((unsigned)(c) - 65) < 26)
|
|
||||||
#define acc_ascii_tolower(c) ((int)(c) + (acc_ascii_isupper(c) << 5))
|
|
||||||
#define acc_ascii_toupper(c) ((int)(c) - (acc_ascii_islower(c) << 5))
|
|
||||||
|
|
||||||
#define acc_ascii_utolower(c) acc_ascii_tolower((unsigned char)(c))
|
|
||||||
#define acc_ascii_utoupper(c) acc_ascii_toupper((unsigned char)(c))
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// huge pointer layer
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifndef acc_hsize_t
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
# define acc_hsize_t unsigned long
|
|
||||||
# define acc_hvoid_p void __huge *
|
|
||||||
# define acc_hchar_p char __huge *
|
|
||||||
# define acc_hchar_pp char __huge * __huge *
|
|
||||||
# define acc_hbyte_p unsigned char __huge *
|
|
||||||
#else
|
|
||||||
# define acc_hsize_t size_t
|
|
||||||
# define acc_hvoid_p void *
|
|
||||||
# define acc_hchar_p char *
|
|
||||||
# define acc_hchar_pp char **
|
|
||||||
# define acc_hbyte_p unsigned char *
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef ACC_FILE_P
|
|
||||||
#define ACC_FILE_P FILE *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* halloc */
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_halloc) (acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(void, acc_hfree) (acc_hvoid_p);
|
|
||||||
|
|
||||||
/* dos_alloc */
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216)
|
|
||||||
ACCLIB_EXTERN(void __far*, acc_dos_alloc) (unsigned long);
|
|
||||||
ACCLIB_EXTERN(int, acc_dos_free) (void __far*);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* string */
|
|
||||||
ACCLIB_EXTERN(int, acc_hmemcmp) (const acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemcpy) (acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemmove) (acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemset) (acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
|
|
||||||
/* string */
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrlen) (const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrcmp) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrncmp)(const acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_hstricmp) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_hstrnicmp)(const acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_hmemicmp) (const acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrstr) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstristr) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemmem) (const acc_hvoid_p, acc_hsize_t, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemimem) (const acc_hvoid_p, acc_hsize_t, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrcpy) (acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrcat) (acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrlcpy) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrlcat) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrscpy) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrscat) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrccpy) (acc_hchar_p, const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemccpy) (acc_hvoid_p, const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrchr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrrchr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrichr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrrichr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemchr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemrchr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemichr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemrichr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrrspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrcspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrrcspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrpbrk) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrrpbrk) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrsep) (acc_hchar_pp, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrrsep) (acc_hchar_pp, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrlwr) (acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrupr) (acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemlwr) (acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemupr) (acc_hvoid_p, acc_hsize_t);
|
|
||||||
|
|
||||||
/* stdio */
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hfread) (ACC_FILE_P, acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hfwrite) (ACC_FILE_P, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
|
|
||||||
/* io */
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
ACCLIB_EXTERN(long, acc_hread) (int, acc_hvoid_p, long);
|
|
||||||
ACCLIB_EXTERN(long, acc_hwrite) (int, const acc_hvoid_p, long);
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(long, acc_safe_hread) (int, acc_hvoid_p, long);
|
|
||||||
ACCLIB_EXTERN(long, acc_safe_hwrite) (int, const acc_hvoid_p, long);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap filename limits
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
/* maximum length of full pathname (excl. '\0') */
|
|
||||||
#if !defined(ACC_FN_PATH_MAX)
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
# define ACC_FN_PATH_MAX 143
|
|
||||||
#elif (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# define ACC_FN_PATH_MAX 259
|
|
||||||
#elif (ACC_OS_TOS)
|
|
||||||
# define ACC_FN_PATH_MAX 259
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ACC_FN_PATH_MAX)
|
|
||||||
/* arbitrary limit for acclib implementation */
|
|
||||||
# define ACC_FN_PATH_MAX 1024
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* maximum length of a filename (a single path component) (excl. '\0') */
|
|
||||||
#if !defined(ACC_FN_NAME_MAX)
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
# define ACC_FN_NAME_MAX 12
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# define ACC_FN_NAME_MAX 12
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
#elif (ACC_OS_DOS32)
|
|
||||||
# define ACC_FN_NAME_MAX 12
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ACC_FN_NAME_MAX)
|
|
||||||
# define ACC_FN_NAME_MAX ACC_FN_PATH_MAX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define ACC_FNMATCH_NOESCAPE 1
|
|
||||||
#define ACC_FNMATCH_PATHNAME 2
|
|
||||||
#define ACC_FNMATCH_PATHSTAR 4
|
|
||||||
#define ACC_FNMATCH_PERIOD 8
|
|
||||||
#define ACC_FNMATCH_ASCII_CASEFOLD 16
|
|
||||||
ACCLIB_EXTERN(int, acc_fnmatch) (const acc_hchar_p, const acc_hchar_p, int);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap <dirent.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#undef __ACCLIB_USE_OPENDIR
|
|
||||||
#if (HAVE_DIRENT_H || ACC_CC_WATCOMC)
|
|
||||||
# define __ACCLIB_USE_OPENDIR 1
|
|
||||||
# if (ACC_OS_DOS32 && defined(__BORLANDC__))
|
|
||||||
# elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# elif (ACC_OS_OS2 || ACC_OS_OS216)
|
|
||||||
# elif (ACC_OS_TOS && ACC_CC_GNUC)
|
|
||||||
# elif (ACC_OS_WIN32 && !defined(ACC_HAVE_WINDOWS_H))
|
|
||||||
# elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_TOS || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# undef __ACCLIB_USE_OPENDIR
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
#if defined(__ACCLIB_USE_OPENDIR)
|
|
||||||
void *u_dirp; /* private */
|
|
||||||
# if (ACC_CC_WATCOMC)
|
|
||||||
unsigned short f_time;
|
|
||||||
unsigned short f_date;
|
|
||||||
unsigned long f_size;
|
|
||||||
# endif
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
#elif (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
acclib_handle_t u_handle; /* private */
|
|
||||||
unsigned f_attr;
|
|
||||||
unsigned f_size_low;
|
|
||||||
unsigned f_size_high;
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_TOS || ACC_OS_WIN16)
|
|
||||||
char u_dta[21]; /* private */
|
|
||||||
unsigned char f_attr;
|
|
||||||
unsigned short f_time;
|
|
||||||
unsigned short f_date;
|
|
||||||
unsigned short f_size_low;
|
|
||||||
unsigned short f_size_high;
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
char u_dirp; /* private */
|
|
||||||
#else
|
|
||||||
void *u_dirp; /* private */
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
#endif
|
|
||||||
} acc_dir_t;
|
|
||||||
|
|
||||||
#ifndef acc_dir_p
|
|
||||||
#define acc_dir_p acc_dir_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(int, acc_opendir) (acc_dir_p, const char*);
|
|
||||||
ACCLIB_EXTERN(int, acc_readdir) (acc_dir_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_closedir) (acc_dir_p);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap misc
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_GNUC) && (defined(__CYGWIN__) || defined(__MINGW32__))
|
|
||||||
# define acc_alloca(x) __builtin_alloca((x))
|
|
||||||
#elif (ACC_CC_BORLANDC) && defined(__linux__)
|
|
||||||
/* FIXME: alloca does not work */
|
|
||||||
#elif (HAVE_ALLOCA)
|
|
||||||
# define acc_alloca(x) alloca((x))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0410))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0400))
|
|
||||||
# if (ACC_OS_WIN16) && (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
# else
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
# endif
|
|
||||||
#elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && (ACC_CC_DMC || ACC_CC_SYMANTECC))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16) && ACC_CC_MSC && (_MSC_VER >= 700))
|
|
||||||
# define acc_stackavail() _stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16) && ACC_CC_MSC)
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && ACC_CC_TURBOC && (__TURBOC__ >= 0x0450))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_TURBOC && (__TURBOC__ >= 0x0400))
|
|
||||||
ACC_EXTERN_C size_t __cdecl stackavail(void);
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && (ACC_CC_WATCOMC))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_ZORTECHC)
|
|
||||||
# define acc_stackavail() _chkstack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(acclib_handle_t, acc_get_osfhandle) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_isatty) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_mkdir) (const char*, unsigned);
|
|
||||||
ACCLIB_EXTERN(int, acc_response) (int*, char***);
|
|
||||||
ACCLIB_EXTERN(int, acc_set_binmode) (int, int);
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(acc_int32l_t, acc_muldiv32) (acc_int32l_t, acc_int32l_t, acc_int32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_umuldiv32) (acc_uint32l_t, acc_uint32l_t, acc_uint32l_t);
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(void, acc_wildargv) (int*, char***);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// uclock (real, i.e. "wall" clock)
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCLIB_EXTERN(int, acc_tsc_read) (acc_uint32e_t*);
|
|
||||||
ACCLIB_EXTERN(int, acc_tsc_read_add) (acc_uint32e_t*);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acclib_handle_t h;
|
|
||||||
int mode;
|
|
||||||
#if (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
double qpf;
|
|
||||||
#endif
|
|
||||||
} acc_uclock_handle_t;
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
union {
|
|
||||||
acc_uint32l_t t32;
|
|
||||||
#if !(ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
double td;
|
|
||||||
# if defined(acc_int64l_t)
|
|
||||||
acc_int64l_t t64;
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
} ticks;
|
|
||||||
#if (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
acc_int64l_t qpc;
|
|
||||||
#endif
|
|
||||||
} acc_uclock_t;
|
|
||||||
|
|
||||||
#ifndef acc_uclock_handle_p
|
|
||||||
#define acc_uclock_handle_p acc_uclock_handle_t *
|
|
||||||
#endif
|
|
||||||
#ifndef acc_uclock_p
|
|
||||||
#define acc_uclock_p acc_uclock_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(int, acc_uclock_open) (acc_uclock_handle_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_uclock_close) (acc_uclock_handle_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_uclock_read) (acc_uclock_handle_p, acc_uclock_p);
|
|
||||||
ACCLIB_EXTERN(double, acc_uclock_get_elapsed) (acc_uclock_handle_p, const acc_uclock_p, const acc_uclock_p);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// performance counters (virtual clock)
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_int64l_t)
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
void* h;
|
|
||||||
unsigned cpu_type, cpu_features, cpu_khz, cpu_nrctrs;
|
|
||||||
const char* cpu_name;
|
|
||||||
} acc_perfctr_handle_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
acc_uint64l_t tsc;
|
|
||||||
#if (ACC_OS_POSIX_LINUX)
|
|
||||||
acc_uint64l_t pmc[18];
|
|
||||||
#else
|
|
||||||
acc_uint64l_t pmc[1];
|
|
||||||
#endif
|
|
||||||
} acc_perfctr_clock_t;
|
|
||||||
|
|
||||||
#ifndef acc_perfctr_handle_p
|
|
||||||
#define acc_perfctr_handle_p acc_perfctr_handle_t *
|
|
||||||
#endif
|
|
||||||
#ifndef acc_perfctr_clock_p
|
|
||||||
#define acc_perfctr_clock_p acc_perfctr_clock_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(int, acc_perfctr_open) (acc_perfctr_handle_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_perfctr_close) (acc_perfctr_handle_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_perfctr_read) (acc_perfctr_handle_p, acc_perfctr_clock_p);
|
|
||||||
ACCLIB_EXTERN(double, acc_perfctr_get_elapsed) (acc_perfctr_handle_p, const acc_perfctr_clock_p, const acc_perfctr_clock_p);
|
|
||||||
ACCLIB_EXTERN(double, acc_perfctr_get_elapsed_tsc) (acc_perfctr_handle_p, acc_uint64l_t);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Big Endian / Little Endian
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(unsigned, acc_get_be16) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_be24) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_be32) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be16) (acc_hvoid_p, unsigned);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be24) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be32) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(unsigned, acc_get_le16) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_le24) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le16) (acc_hvoid_p, unsigned);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le24) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le32) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
ACCLIB_EXTERN(acc_uint64l_t, acc_get_be64) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be64) (acc_hvoid_p, acc_uint64l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le64) (acc_hvoid_p, acc_uint64l_t);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* inline versions */
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
# define ACC_GET_LE16(p) (* (const unsigned short *) (p))
|
|
||||||
# define ACC_GET_LE32(p) (* (const acc_uint32e_t *) (p))
|
|
||||||
# define ACC_SET_LE16(p,v) (* (unsigned short *) (p) = (unsigned short) (v))
|
|
||||||
# define ACC_SET_LE32(p,v) (* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v))
|
|
||||||
#endif
|
|
||||||
#if (ACC_ARCH_AMD64)
|
|
||||||
# define ACC_GET_LE64(p) (* (const acc_uint64l_t *) (p))
|
|
||||||
# define ACC_SET_LE64(p,v) (* (acc_uint64l_t *) (p) = (acc_uint64l_t) (v))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// getopt
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const char* name;
|
|
||||||
int has_arg;
|
|
||||||
int* flag;
|
|
||||||
int val;
|
|
||||||
} acc_getopt_longopt_t;
|
|
||||||
#ifndef acc_getopt_longopt_p
|
|
||||||
#define acc_getopt_longopt_p acc_getopt_longopt_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int go_argc;
|
|
||||||
char** go_argv;
|
|
||||||
const char* go_shortopts;
|
|
||||||
const acc_getopt_longopt_p longopts;
|
|
||||||
#if (ACC_BROKEN_CDECL_ALT_SYNTAX)
|
|
||||||
int __acc_cdecl_va (*go_error)(const char *, ...);
|
|
||||||
#else
|
|
||||||
int (__acc_cdecl_va *go_error)(const char *, ...);
|
|
||||||
#endif
|
|
||||||
} acc_getopt_t;
|
|
||||||
#ifndef acc_getopt_p
|
|
||||||
#define acc_getopt_p acc_getopt_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(void, acc_getopt_init) (acc_getopt_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_getopt) (acc_getopt_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_getopt_close)(acc_getopt_p);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// rand
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acc_uint32l_t seed;
|
|
||||||
} acc_rand31_t;
|
|
||||||
#ifndef acc_rand31_p
|
|
||||||
#define acc_rand31_p acc_rand31_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srand31) (acc_rand31_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand31) (acc_rand31_p);
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acc_uint64l_t seed;
|
|
||||||
} acc_rand48_t;
|
|
||||||
#ifndef acc_rand48_p
|
|
||||||
#define acc_rand48_p acc_rand48_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srand48) (acc_rand48_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand48) (acc_rand48_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand48_r32) (acc_rand48_p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acc_uint64l_t seed;
|
|
||||||
} acc_rand64_t;
|
|
||||||
#ifndef acc_rand64_p
|
|
||||||
#define acc_rand64_p acc_rand64_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srand64) (acc_rand64_p, acc_uint64l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand64) (acc_rand64_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand64_r32) (acc_rand64_p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
unsigned n;
|
|
||||||
acc_uint32l_t s[624];
|
|
||||||
} acc_randmt_t;
|
|
||||||
#ifndef acc_randmt_p
|
|
||||||
#define acc_randmt_p acc_randmt_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srandmt) (acc_randmt_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_randmt) (acc_randmt_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_randmt_r32) (acc_randmt_p);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Memory Model - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_MM_FLAT [default]
|
|
||||||
* ACC_MM_TINY
|
|
||||||
* ACC_MM_SMALL
|
|
||||||
* ACC_MM_MEDIUM
|
|
||||||
* ACC_MM_COMPACT
|
|
||||||
* ACC_MM_LARGE
|
|
||||||
* ACC_MM_HUGE
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
|
|
||||||
#if (UINT_MAX != ACC_0xffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
#endif
|
|
||||||
#if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM)
|
|
||||||
# define ACC_MM_HUGE 1
|
|
||||||
#elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM)
|
|
||||||
# define ACC_MM_MEDIUM 1
|
|
||||||
#elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM)
|
|
||||||
# define ACC_MM_COMPACT 1
|
|
||||||
#elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif (ACC_CC_AZTECC)
|
|
||||||
# if defined(_LARGE_CODE) && defined(_LARGE_DATA)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
# elif defined(_LARGE_CODE)
|
|
||||||
# define ACC_MM_MEDIUM 1
|
|
||||||
# elif defined(_LARGE_DATA)
|
|
||||||
# define ACC_MM_COMPACT 1
|
|
||||||
# else
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_ZORTECHC && defined(__VCM__))
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* ACC_HAVE_MM_HUGE_PTR ... working __huge pointers
|
|
||||||
* ACC_HAVE_MM_HUGE_ARRAY ... char __huge x[256*1024L] works */
|
|
||||||
#define ACC_HAVE_MM_HUGE_PTR 1
|
|
||||||
#define ACC_HAVE_MM_HUGE_ARRAY 1
|
|
||||||
|
|
||||||
#if (ACC_MM_TINY)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_CC_AZTECC || ACC_CC_PACIFICC || ACC_CC_ZORTECHC)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_PTR
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#elif (ACC_CC_MSC && defined(_QC))
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_PTR
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_TURBOC && (__TURBOC__ < 0x0295))
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#elif (ACC_CC_WATCOMC && (__WATCOMC__ >= 1200))
|
|
||||||
/* pointer arithmetics with __huge arrays seems broken in OpenWatcom 1.x */
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0200))
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif (ACC_CC_MSC || ACC_CC_TOPSPEEDC)
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif (ACC_CC_TURBOC && (__TURBOC__ >= 0x0295))
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif ((ACC_CC_AZTECC || ACC_CC_PACIFICC || ACC_CC_TURBOC) && ACC_OS_DOS16)
|
|
||||||
# define ACC_MM_AHSHIFT 12
|
|
||||||
#elif (ACC_CC_WATCOMC)
|
|
||||||
extern unsigned char _HShift;
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _HShift)
|
|
||||||
#else
|
|
||||||
# error "FIXME - implement ACC_MM_AHSHIFT"
|
|
||||||
#endif
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_ARCH_C166)
|
|
||||||
#if !defined(__MODEL__)
|
|
||||||
# error "FIXME - C166 __MODEL__"
|
|
||||||
#elif ((__MODEL__) == 0)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 1)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 2)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif ((__MODEL__) == 3)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif ((__MODEL__) == 4)
|
|
||||||
# define ACC_MM_XTINY 1
|
|
||||||
#elif ((__MODEL__) == 5)
|
|
||||||
# define ACC_MM_XSMALL 1
|
|
||||||
#else
|
|
||||||
# error "FIXME - C166 __MODEL__"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_ARCH_MCS251)
|
|
||||||
#if !defined(__MODEL__)
|
|
||||||
# error "FIXME - MCS251 __MODEL__"
|
|
||||||
#elif ((__MODEL__) == 0)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 2)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif ((__MODEL__) == 3)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif ((__MODEL__) == 4)
|
|
||||||
# define ACC_MM_XTINY 1
|
|
||||||
#elif ((__MODEL__) == 5)
|
|
||||||
# define ACC_MM_XSMALL 1
|
|
||||||
#else
|
|
||||||
# error "FIXME - MCS251 __MODEL__"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_ARCH_MCS51)
|
|
||||||
#if !defined(__MODEL__)
|
|
||||||
# error "FIXME - MCS51 __MODEL__"
|
|
||||||
#elif ((__MODEL__) == 1)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 2)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif ((__MODEL__) == 3)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif ((__MODEL__) == 4)
|
|
||||||
# define ACC_MM_XTINY 1
|
|
||||||
#elif ((__MODEL__) == 5)
|
|
||||||
# define ACC_MM_XSMALL 1
|
|
||||||
#else
|
|
||||||
# error "FIXME - MCS51 __MODEL__"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# define ACC_MM_FLAT 1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_MM_FLAT)
|
|
||||||
# define ACC_INFO_MM "flat"
|
|
||||||
#elif (ACC_MM_TINY)
|
|
||||||
# define ACC_INFO_MM "tiny"
|
|
||||||
#elif (ACC_MM_SMALL)
|
|
||||||
# define ACC_INFO_MM "small"
|
|
||||||
#elif (ACC_MM_MEDIUM)
|
|
||||||
# define ACC_INFO_MM "medium"
|
|
||||||
#elif (ACC_MM_COMPACT)
|
|
||||||
# define ACC_INFO_MM "compact"
|
|
||||||
#elif (ACC_MM_LARGE)
|
|
||||||
# define ACC_INFO_MM "large"
|
|
||||||
#elif (ACC_MM_HUGE)
|
|
||||||
# define ACC_INFO_MM "huge"
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,203 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Operating System - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_OS_POSIX [default]
|
|
||||||
* ACC_OS_AMIGAOS
|
|
||||||
* ACC_OS_BEOS
|
|
||||||
* ACC_OS_CYGWIN hybrid WIN32 and POSIX
|
|
||||||
* ACC_OS_DOS16 16-bit DOS (segmented memory model)
|
|
||||||
* ACC_OS_DOS32
|
|
||||||
* ACC_OS_EMX hybrid OS/2, DOS32, WIN32 (with RSX) and POSIX
|
|
||||||
* ACC_OS_MACCLASSIC Macintosh Classic
|
|
||||||
* ACC_OS_PALMOS
|
|
||||||
* ACC_OS_OS2 OS/2
|
|
||||||
* ACC_OS_OS216 16-bit OS/2 1.x (segmented memory model)
|
|
||||||
* ACC_OS_QNX
|
|
||||||
* ACC_OS_RISCOS
|
|
||||||
* ACC_OS_TOS Atari TOS / MiNT
|
|
||||||
* ACC_OS_VMS
|
|
||||||
* ACC_OS_WIN16 16-bit Windows 3.x (segmented memory model)
|
|
||||||
* ACC_OS_WIN32
|
|
||||||
* ACC_OS_WIN64 64-bit Windows (LLP64 programming model)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__CYGWIN__) && defined(__GNUC__)
|
|
||||||
# define ACC_OS_CYGWIN 1
|
|
||||||
# define ACC_INFO_OS "cygwin"
|
|
||||||
#elif defined(__EMX__) && defined(__GNUC__)
|
|
||||||
# define ACC_OS_EMX 1
|
|
||||||
# define ACC_INFO_OS "emx"
|
|
||||||
#elif defined(__BEOS__)
|
|
||||||
# define ACC_OS_BEOS 1
|
|
||||||
# define ACC_INFO_OS "beos"
|
|
||||||
#elif defined(__QNX__)
|
|
||||||
# define ACC_OS_QNX 1
|
|
||||||
# define ACC_INFO_OS "qnx"
|
|
||||||
#elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460)
|
|
||||||
# define ACC_OS_DOS32 1
|
|
||||||
# define ACC_INFO_OS "dos32"
|
|
||||||
#elif defined(__BORLANDC__) && defined(__DPMI16__)
|
|
||||||
# define ACC_OS_DOS16 1
|
|
||||||
# define ACC_INFO_OS "dos16"
|
|
||||||
#elif defined(__ZTC__) && defined(DOS386)
|
|
||||||
# define ACC_OS_DOS32 1
|
|
||||||
# define ACC_INFO_OS "dos32"
|
|
||||||
#elif defined(__OS2__) || defined(__OS2V2__)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_OS216 1
|
|
||||||
# define ACC_INFO_OS "os216"
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define ACC_OS_OS2 1
|
|
||||||
# define ACC_INFO_OS "os2"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64)
|
|
||||||
# define ACC_OS_WIN64 1
|
|
||||||
# define ACC_INFO_OS "win64"
|
|
||||||
#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__)
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
#elif defined(__MWERKS__) && defined(__INTEL__)
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
#elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_WIN16 1
|
|
||||||
# define ACC_INFO_OS "win16"
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS))
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_DOS16 1
|
|
||||||
# define ACC_INFO_OS "dos16"
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define ACC_OS_DOS32 1
|
|
||||||
# define ACC_INFO_OS "dos32"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__WATCOMC__)
|
|
||||||
# if defined(__NT__) && (UINT_MAX == ACC_0xffffL)
|
|
||||||
/* wcl: NT host defaults to DOS target */
|
|
||||||
# define ACC_OS_DOS16 1
|
|
||||||
# define ACC_INFO_OS "dos16"
|
|
||||||
# elif defined(__NT__) && (__WATCOMC__ < 1100)
|
|
||||||
/* wcl386: Watcom C 11 defines _WIN32 */
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
# else
|
|
||||||
# error "please specify a target using the -bt compiler option"
|
|
||||||
# endif
|
|
||||||
#elif defined(__palmos__)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_PALMOS 1
|
|
||||||
# define ACC_INFO_OS "palmos"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__TOS__) || defined(__atarist__)
|
|
||||||
# define ACC_OS_TOS 1
|
|
||||||
# define ACC_INFO_OS "tos"
|
|
||||||
#elif defined(macintosh) && !defined(__ppc__)
|
|
||||||
# define ACC_OS_MACCLASSIC 1
|
|
||||||
# define ACC_INFO_OS "macclassic"
|
|
||||||
#elif defined(__VMS)
|
|
||||||
# define ACC_OS_VMS 1
|
|
||||||
# define ACC_INFO_OS "vms"
|
|
||||||
#else
|
|
||||||
# define ACC_OS_POSIX 1
|
|
||||||
# define ACC_INFO_OS "posix"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_POSIX)
|
|
||||||
# if defined(_AIX) || defined(__AIX__) || defined(__aix__)
|
|
||||||
# define ACC_OS_POSIX_AIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "aix"
|
|
||||||
# elif defined(__FreeBSD__)
|
|
||||||
# define ACC_OS_POSIX_FREEBSD 1
|
|
||||||
# define ACC_INFO_OS_POSIX "freebsd"
|
|
||||||
# elif defined(__hpux__) || defined(__hpux)
|
|
||||||
# define ACC_OS_POSIX_HPUX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "hpux"
|
|
||||||
# elif defined(__INTERIX)
|
|
||||||
# define ACC_OS_POSIX_INTERIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "interix"
|
|
||||||
# elif defined(__IRIX__) || defined(__irix__)
|
|
||||||
# define ACC_OS_POSIX_IRIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "irix"
|
|
||||||
# elif defined(__linux__) || defined(__linux)
|
|
||||||
# define ACC_OS_POSIX_LINUX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "linux"
|
|
||||||
# elif defined(__APPLE__) || defined(__MACOS__)
|
|
||||||
# define ACC_OS_POSIX_MACOSX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "macosx"
|
|
||||||
# elif defined(__NetBSD__)
|
|
||||||
# define ACC_OS_POSIX_NETBSD 1
|
|
||||||
# define ACC_INFO_OS_POSIX "netbsd"
|
|
||||||
# elif defined(__OpenBSD__)
|
|
||||||
# define ACC_OS_POSIX_OPENBSD 1
|
|
||||||
# define ACC_INFO_OS_POSIX "openbsd"
|
|
||||||
# elif defined(__osf__)
|
|
||||||
# define ACC_OS_POSIX_OSF 1
|
|
||||||
# define ACC_INFO_OS_POSIX "osf"
|
|
||||||
# elif defined(__solaris__) || defined(__sun)
|
|
||||||
# if defined(__SVR4) || defined(__svr4__)
|
|
||||||
# define ACC_OS_POSIX_SOLARIS 1
|
|
||||||
# define ACC_INFO_OS_POSIX "solaris"
|
|
||||||
# else
|
|
||||||
# define ACC_OS_POSIX_SUNOS 1
|
|
||||||
# define ACC_INFO_OS_POSIX "sunos"
|
|
||||||
# endif
|
|
||||||
# elif defined(__ultrix__) || defined(__ultrix)
|
|
||||||
# define ACC_OS_POSIX_ULTRIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "ultrix"
|
|
||||||
# else
|
|
||||||
# define ACC_OS_POSIX_UNKNOWN 1
|
|
||||||
# define ACC_INFO_OS_POSIX "unknown"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# if (UINT_MAX != ACC_0xffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (UINT_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,321 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
//
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_GNUC >= 0x020800ul) /* 2.8.0 */
|
|
||||||
# define __acc_gnuc_extension__ __extension__
|
|
||||||
#else
|
|
||||||
# define __acc_gnuc_extension__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (SIZEOF_LONG_LONG > 0)
|
|
||||||
__acc_gnuc_extension__ typedef long long acc_llong_t;
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_UNSIGNED_LONG_LONG > 0)
|
|
||||||
__acc_gnuc_extension__ typedef unsigned long long acc_ullong_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (!(SIZEOF_SHORT > 0 && SIZEOF_INT > 0 && SIZEOF_LONG > 0))
|
|
||||||
# error "missing defines for sizes"
|
|
||||||
#endif
|
|
||||||
#if (!(SIZEOF_PTRDIFF_T > 0 && SIZEOF_SIZE_T > 0 && SIZEOF_VOID_P > 0 && SIZEOF_CHAR_P > 0))
|
|
||||||
# error "missing defines for sizes"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// some <stdint.h> types:
|
|
||||||
// required: least & fast: acc_int32l_t, acc_int32f_t
|
|
||||||
// optional: exact32 acc_int32e_t
|
|
||||||
// optional: least64 acc_int64l_t
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* acc_int32e_t is int32_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int32e_t)
|
|
||||||
#if (SIZEOF_INT == 4)
|
|
||||||
# define acc_int32e_t int
|
|
||||||
# define acc_uint32e_t unsigned int
|
|
||||||
# define ACC_INT32E_C(c) c
|
|
||||||
# define ACC_UINT32E_C(c) c##U
|
|
||||||
#elif (SIZEOF_LONG == 4)
|
|
||||||
# define acc_int32e_t long int
|
|
||||||
# define acc_uint32e_t unsigned long int
|
|
||||||
# define ACC_INT32E_C(c) c##L
|
|
||||||
# define ACC_UINT32E_C(c) c##UL
|
|
||||||
#elif (SIZEOF_SHORT == 4)
|
|
||||||
# define acc_int32e_t short int
|
|
||||||
# define acc_uint32e_t unsigned short int
|
|
||||||
# define ACC_INT32E_C(c) c
|
|
||||||
# define ACC_UINT32E_C(c) c##U
|
|
||||||
#elif (SIZEOF_LONG_LONG == 4 && SIZEOF_UNSIGNED_LONG_LONG == 4)
|
|
||||||
# define acc_int32e_t acc_llong_t
|
|
||||||
# define acc_uint32e_t acc_ullong_t
|
|
||||||
# define ACC_INT32E_C(c) c##LL
|
|
||||||
# define ACC_UINT32E_C(c) c##ULL
|
|
||||||
#elif (SIZEOF___INT32 == 4 && SIZEOF_UNSIGNED___INT32 == 4)
|
|
||||||
# define acc_int32e_t __int32
|
|
||||||
# define acc_uint32e_t unsigned __int32
|
|
||||||
# if (SIZEOF_INT > 4)
|
|
||||||
# define ACC_INT32E_C(c) c
|
|
||||||
# define ACC_UINT32E_C(c) c##U
|
|
||||||
# elif (SIZEOF_LONG > 4)
|
|
||||||
# define ACC_INT32E_C(c) c##L
|
|
||||||
# define ACC_UINT32E_C(c) c##UL
|
|
||||||
# else
|
|
||||||
# define ACC_INT32E_C(c) c##i32
|
|
||||||
# define ACC_UINT32E_C(c) c##ui32
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
/* no exact 32-bit integral type on this machine */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
# define SIZEOF_ACC_INT32E_T 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* acc_int32l_t is int_least32_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int32l_t)
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
# define acc_int32l_t acc_int32e_t
|
|
||||||
# define acc_uint32l_t acc_uint32e_t
|
|
||||||
# define ACC_INT32L_C(c) ACC_INT32E_C(c)
|
|
||||||
# define ACC_UINT32L_C(c) ACC_UINT32E_C(c)
|
|
||||||
# define SIZEOF_ACC_INT32L_T SIZEOF_ACC_INT32E_T
|
|
||||||
#elif (SIZEOF_INT > 4)
|
|
||||||
# define acc_int32l_t int
|
|
||||||
# define acc_uint32l_t unsigned int
|
|
||||||
# define ACC_INT32L_C(c) c
|
|
||||||
# define ACC_UINT32L_C(c) c##U
|
|
||||||
# define SIZEOF_ACC_INT32L_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG > 4)
|
|
||||||
# define acc_int32l_t long int
|
|
||||||
# define acc_uint32l_t unsigned long int
|
|
||||||
# define ACC_INT32L_C(c) c##L
|
|
||||||
# define ACC_UINT32L_C(c) c##UL
|
|
||||||
# define SIZEOF_ACC_INT32L_T SIZEOF_LONG
|
|
||||||
#else
|
|
||||||
# error "acc_int32l_t"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* acc_int32f_t is int_fast32_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int32f_t)
|
|
||||||
#if (SIZEOF_INT >= 4)
|
|
||||||
# define acc_int32f_t int
|
|
||||||
# define acc_uint32f_t unsigned int
|
|
||||||
# define ACC_INT32F_C(c) c
|
|
||||||
# define ACC_UINT32F_C(c) c##U
|
|
||||||
# define SIZEOF_ACC_INT32F_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG >= 4)
|
|
||||||
# define acc_int32f_t long int
|
|
||||||
# define acc_uint32f_t unsigned long int
|
|
||||||
# define ACC_INT32F_C(c) c##L
|
|
||||||
# define ACC_UINT32F_C(c) c##UL
|
|
||||||
# define SIZEOF_ACC_INT32F_T SIZEOF_LONG
|
|
||||||
#elif defined(acc_int32e_t)
|
|
||||||
# define acc_int32f_t acc_int32e_t
|
|
||||||
# define acc_uint32f_t acc_uint32e_t
|
|
||||||
# define ACC_INT32F_C(c) ACC_INT32E_C(c)
|
|
||||||
# define ACC_UINT32F_C(c) ACC_UINT32E_C(c)
|
|
||||||
# define SIZEOF_ACC_INT32F_T SIZEOF_ACC_INT32E_T
|
|
||||||
#else
|
|
||||||
# error "acc_int32f_t"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* acc_int64l_t is int_least64_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int64l_t)
|
|
||||||
#if (SIZEOF___INT64 >= 8 && SIZEOF_UNSIGNED___INT64 >= 8)
|
|
||||||
# if (ACC_CC_BORLANDC) && !defined(ACC_CONFIG_PREFER___INT64)
|
|
||||||
# define ACC_CONFIG_PREFER___INT64 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_INT >= 8)
|
|
||||||
# define acc_int64l_t int
|
|
||||||
# define acc_uint64l_t unsigned int
|
|
||||||
# define ACC_INT64L_C(c) c
|
|
||||||
# define ACC_UINT64L_C(c) c##U
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG >= 8)
|
|
||||||
# define acc_int64l_t long int
|
|
||||||
# define acc_uint64l_t unsigned long int
|
|
||||||
# define ACC_INT64L_C(c) c##L
|
|
||||||
# define ACC_UINT64L_C(c) c##UL
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF_LONG
|
|
||||||
#elif (SIZEOF_LONG_LONG >= 8 && SIZEOF_UNSIGNED_LONG_LONG >= 8) && !defined(ACC_CONFIG_PREFER___INT64)
|
|
||||||
# define acc_int64l_t acc_llong_t
|
|
||||||
# define acc_uint64l_t acc_ullong_t
|
|
||||||
# if (ACC_CC_BORLANDC)
|
|
||||||
# define ACC_INT64L_C(c) ((c) + 0ll)
|
|
||||||
# define ACC_UINT64L_C(c) ((c) + 0ull)
|
|
||||||
# else
|
|
||||||
# define ACC_INT64L_C(c) c##LL
|
|
||||||
# define ACC_UINT64L_C(c) c##ULL
|
|
||||||
# endif
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF_LONG_LONG
|
|
||||||
#elif (SIZEOF___INT64 >= 8 && SIZEOF_UNSIGNED___INT64 >= 8)
|
|
||||||
# define acc_int64l_t __int64
|
|
||||||
# define acc_uint64l_t unsigned __int64
|
|
||||||
# if (ACC_CC_BORLANDC)
|
|
||||||
# define ACC_INT64L_C(c) ((c) + 0i64)
|
|
||||||
# define ACC_UINT64L_C(c) ((c) + 0ui64)
|
|
||||||
# else
|
|
||||||
# define ACC_INT64L_C(c) c##i64
|
|
||||||
# define ACC_UINT64L_C(c) c##ui64
|
|
||||||
# endif
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF___INT64
|
|
||||||
#else
|
|
||||||
/* no least 64-bit integral type on this machine */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(acc_intptr_t)
|
|
||||||
#if (ACC_ARCH_IA32 && ACC_CC_MSC && (_MSC_VER >= 1300))
|
|
||||||
typedef __w64 int acc_intptr_t;
|
|
||||||
typedef __w64 unsigned int acc_uintptr_t;
|
|
||||||
# define acc_intptr_t acc_intptr_t
|
|
||||||
# define acc_uintptr_t acc_uintptr_t
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_INT >= SIZEOF_VOID_P)
|
|
||||||
# define acc_intptr_t int
|
|
||||||
# define acc_uintptr_t unsigned int
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG >= SIZEOF_VOID_P)
|
|
||||||
# define acc_intptr_t long
|
|
||||||
# define acc_uintptr_t unsigned long
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_LONG
|
|
||||||
#elif (SIZEOF_ACC_INT64L_T >= SIZEOF_VOID_P)
|
|
||||||
# define acc_intptr_t acc_int64l_t
|
|
||||||
# define acc_uintptr_t acc_uint64l_t
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_ACC_INT64L_T
|
|
||||||
#else
|
|
||||||
# error "acc_intptr_t"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* workaround for broken compilers */
|
|
||||||
#if (ACC_BROKEN_INTEGRAL_CONSTANTS)
|
|
||||||
# undef ACC_INT32E_C
|
|
||||||
# undef ACC_UINT32E_C
|
|
||||||
# undef ACC_INT32L_C
|
|
||||||
# undef ACC_UINT32L_C
|
|
||||||
# undef ACC_INT32F_C
|
|
||||||
# undef ACC_UINT32F_C
|
|
||||||
# if (SIZEOF_INT == 4)
|
|
||||||
# define ACC_INT32E_C(c) ((c) + 0)
|
|
||||||
# define ACC_UINT32E_C(c) ((c) + 0U)
|
|
||||||
# define ACC_INT32L_C(c) ((c) + 0)
|
|
||||||
# define ACC_UINT32L_C(c) ((c) + 0U)
|
|
||||||
# define ACC_INT32F_C(c) ((c) + 0)
|
|
||||||
# define ACC_UINT32F_C(c) ((c) + 0U)
|
|
||||||
# elif (SIZEOF_LONG == 4)
|
|
||||||
# define ACC_INT32E_C(c) ((c) + 0L)
|
|
||||||
# define ACC_UINT32E_C(c) ((c) + 0UL)
|
|
||||||
# define ACC_INT32L_C(c) ((c) + 0L)
|
|
||||||
# define ACC_UINT32L_C(c) ((c) + 0UL)
|
|
||||||
# define ACC_INT32F_C(c) ((c) + 0L)
|
|
||||||
# define ACC_UINT32F_C(c) ((c) + 0UL)
|
|
||||||
# else
|
|
||||||
# error "integral constants"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// calling conventions
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (ACC_CC_GNUC || ACC_CC_HIGHC || ACC_CC_NDPC || ACC_CC_PACIFICC)
|
|
||||||
# elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
# define __acc_cdecl __cdecl
|
|
||||||
# define __acc_cdecl_atexit
|
|
||||||
# define __acc_cdecl_main __cdecl
|
|
||||||
# if (ACC_OS_OS2 && (ACC_CC_DMC || ACC_CC_SYMANTECC))
|
|
||||||
# define __acc_cdecl_qsort __pascal
|
|
||||||
# elif (ACC_OS_OS2 && (ACC_CC_ZORTECHC))
|
|
||||||
# define __acc_cdecl_qsort _stdcall
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl_qsort __cdecl
|
|
||||||
# endif
|
|
||||||
# elif (ACC_CC_WATCOMC)
|
|
||||||
# define __acc_cdecl __cdecl
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl __cdecl
|
|
||||||
# define __acc_cdecl_atexit __cdecl
|
|
||||||
# define __acc_cdecl_main __cdecl
|
|
||||||
# define __acc_cdecl_qsort __cdecl
|
|
||||||
# endif
|
|
||||||
# if (ACC_CC_GNUC || ACC_CC_HIGHC || ACC_CC_NDPC || ACC_CC_PACIFICC || ACC_CC_WATCOMC)
|
|
||||||
# elif (ACC_OS_OS2 && (ACC_CC_DMC || ACC_CC_SYMANTECC))
|
|
||||||
# define __acc_cdecl_sighandler __pascal
|
|
||||||
# elif (ACC_OS_OS2 && (ACC_CC_ZORTECHC))
|
|
||||||
# define __acc_cdecl_sighandler _stdcall
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER >= 1400)) && defined(_M_CEE_PURE)
|
|
||||||
# define __acc_cdecl_sighandler __clrcall
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700))
|
|
||||||
# if defined(_DLL)
|
|
||||||
# define __acc_cdecl_sighandler _far _cdecl _loadds
|
|
||||||
# elif defined(_MT)
|
|
||||||
# define __acc_cdecl_sighandler _far _cdecl
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl_sighandler _cdecl
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl_sighandler __cdecl
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# define __acc_cdecl cdecl
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__acc_cdecl)
|
|
||||||
# define __acc_cdecl
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_atexit)
|
|
||||||
# define __acc_cdecl_atexit
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_main)
|
|
||||||
# define __acc_cdecl_main
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_qsort)
|
|
||||||
# define __acc_cdecl_qsort
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_sighandler)
|
|
||||||
# define __acc_cdecl_sighandler
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_va)
|
|
||||||
# define __acc_cdecl_va __acc_cdecl
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_BROKEN_CDECL_ALT_SYNTAX)
|
|
||||||
typedef void __acc_cdecl_sighandler (*acc_sighandler_t)(int);
|
|
||||||
#elif defined(RETSIGTYPE)
|
|
||||||
typedef RETSIGTYPE (__acc_cdecl_sighandler *acc_sighandler_t)(int);
|
|
||||||
#else
|
|
||||||
typedef void (__acc_cdecl_sighandler *acc_sighandler_t)(int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
fnmatch.ch
|
|
||||||
getopt.ch
|
|
||||||
perfctr.ch
|
|
||||||
@@ -1,250 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_BELE_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// be16 / be24 / be32
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(unsigned, acc_get_be16) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((unsigned)b[1]) | ((unsigned)b[0] << 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_be24) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[2]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[0] << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_be32) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[3]) | ((acc_uint32l_t)b[2] << 8) | ((acc_uint32l_t)b[1] << 16) | ((acc_uint32l_t)b[0] << 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be16) (acc_hvoid_p p, unsigned v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[1] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be24) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[2] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be32) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[3] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(unsigned, acc_get_le16) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
return (* (const unsigned short *) (p));
|
|
||||||
#else
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((unsigned)b[0]) | ((unsigned)b[1] << 8);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le24) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
return (* (const acc_uint32e_t *) (p));
|
|
||||||
#else
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16) | ((acc_uint32l_t)b[3] << 24);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// le16 / le24 / le32
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le16) (acc_hvoid_p p, unsigned v)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
(* (unsigned short *) (p) = (unsigned short) (v));
|
|
||||||
#else
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le24) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le32) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
(* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v));
|
|
||||||
#else
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// be64
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint64l_t, acc_get_be64) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
#if (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
return ((acc_uint64l_t)b[7]) | ((acc_uint64l_t)b[6] << 8) | ((acc_uint64l_t)b[5] << 16) | ((acc_uint64l_t)b[4] << 24) | ((acc_uint64l_t)b[3] << 32) | ((acc_uint64l_t)b[2] << 40) | ((acc_uint64l_t)b[1] << 48) | ((acc_uint64l_t)b[0] << 56);
|
|
||||||
#else
|
|
||||||
acc_uint32l_t v0, v1;
|
|
||||||
v1 = ((acc_uint32l_t)b[3]) | ((acc_uint32l_t)b[2] << 8) | ((acc_uint32l_t)b[1] << 16) | ((acc_uint32l_t)b[0] << 24);
|
|
||||||
b += 4;
|
|
||||||
v0 = ((acc_uint32l_t)b[3]) | ((acc_uint32l_t)b[2] << 8) | ((acc_uint32l_t)b[1] << 16) | ((acc_uint32l_t)b[0] << 24);
|
|
||||||
return ((acc_uint64l_t)v0) | ((acc_uint64l_t)v1 << 32);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be64) (acc_hvoid_p p, acc_uint64l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
#if (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
b[7] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[4] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((v >> 32) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 40) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 48) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 56) & 0xff);
|
|
||||||
#else
|
|
||||||
acc_uint32l_t x;
|
|
||||||
x = (acc_uint32l_t) (v >> 0);
|
|
||||||
b[7] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[4] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
x = (acc_uint32l_t) (v >> 32);
|
|
||||||
b[3] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* acc_uint64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// le64
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64)
|
|
||||||
return (* (const acc_uint64l_t *) (p));
|
|
||||||
#elif (ACC_ARCH_IA32)
|
|
||||||
const acc_uint32e_t* b = (const acc_uint32e_t*) p;
|
|
||||||
return ((acc_uint64l_t)b[0]) | ((acc_uint64l_t)b[1] << 32);
|
|
||||||
#elif (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint64l_t)b[0]) | ((acc_uint64l_t)b[1] << 8) | ((acc_uint64l_t)b[2] << 16) | ((acc_uint64l_t)b[3] << 24) | ((acc_uint64l_t)b[4] << 32) | ((acc_uint64l_t)b[5] << 40) | ((acc_uint64l_t)b[6] << 48) | ((acc_uint64l_t)b[7] << 56);
|
|
||||||
#else
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
acc_uint32l_t v0, v1;
|
|
||||||
v0 = ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16) | ((acc_uint32l_t)b[3] << 24);
|
|
||||||
b += 4;
|
|
||||||
v1 = ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16) | ((acc_uint32l_t)b[3] << 24);
|
|
||||||
return ((acc_uint64l_t)v0) | ((acc_uint64l_t)v1 << 32);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le64) (acc_hvoid_p p, acc_uint64l_t v)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64)
|
|
||||||
(* (acc_uint64l_t *) (p)) = v;
|
|
||||||
#elif (ACC_ARCH_IA32)
|
|
||||||
(((acc_uint32e_t *)(p))[0] = (acc_uint32e_t) (v >> 0));
|
|
||||||
(((acc_uint32e_t *)(p))[1] = (acc_uint32e_t) (v >> 32));
|
|
||||||
#elif (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
b[4] = (unsigned char) ((v >> 32) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((v >> 40) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((v >> 48) & 0xff);
|
|
||||||
b[7] = (unsigned char) ((v >> 56) & 0xff);
|
|
||||||
#else
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
acc_uint32l_t x;
|
|
||||||
x = (acc_uint32l_t) (v >> 0);
|
|
||||||
b[0] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
x = (acc_uint32l_t) (v >> 32);
|
|
||||||
b[4] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[7] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* acc_uint64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_DOSALLOC_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_OS216)
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosAllocHuge(unsigned short, unsigned short, unsigned short __far *, unsigned short, unsigned short);
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosFreeSeg(unsigned short);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// dos_alloc
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
#if !defined(ACC_CC_AZTECC)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void __far*, acc_dos_alloc) (unsigned long size)
|
|
||||||
{
|
|
||||||
void __far* p = 0;
|
|
||||||
union REGS ri, ro;
|
|
||||||
|
|
||||||
if ((long)size <= 0)
|
|
||||||
return p;
|
|
||||||
size = (size + 15) >> 4;
|
|
||||||
if (size > 0xffffu)
|
|
||||||
return p;
|
|
||||||
ri.x.ax = 0x4800;
|
|
||||||
ri.x.bx = (unsigned short) size;
|
|
||||||
int86(0x21, &ri, &ro);
|
|
||||||
if ((ro.x.cflag & 1) == 0) /* if carry flag not set */
|
|
||||||
p = (void __far*) ACC_MK_FP(ro.x.ax, 0);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_dos_free) (void __far* p)
|
|
||||||
{
|
|
||||||
union REGS ri, ro;
|
|
||||||
struct SREGS rs;
|
|
||||||
|
|
||||||
if (!p)
|
|
||||||
return 0;
|
|
||||||
if (ACC_FP_OFF(p) != 0)
|
|
||||||
return -1;
|
|
||||||
segread(&rs);
|
|
||||||
ri.x.ax = 0x4900;
|
|
||||||
rs.es = ACC_FP_SEG(p);
|
|
||||||
int86x(0x21, &ri, &ro, &rs);
|
|
||||||
if (ro.x.cflag & 1) /* if carry flag set */
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_OS216)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void __far*, acc_dos_alloc) (unsigned long size)
|
|
||||||
{
|
|
||||||
void __far* p = 0;
|
|
||||||
unsigned short sel = 0;
|
|
||||||
|
|
||||||
if ((long)size <= 0)
|
|
||||||
return p;
|
|
||||||
if (DosAllocHuge((unsigned short)(size >> 16), (unsigned short)size, &sel, 0, 0) == 0)
|
|
||||||
p = (void __far*) ACC_MK_FP(sel, 0);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_dos_free) (void __far* p)
|
|
||||||
{
|
|
||||||
if (!p)
|
|
||||||
return 0;
|
|
||||||
if (ACC_FP_OFF(p) != 0)
|
|
||||||
return -1;
|
|
||||||
if (DosFreeSeg(ACC_FP_SEG(p)) != 0)
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HALLOC_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
#if 1 && (ACC_OS_DOS16 && defined(BLX286))
|
|
||||||
# define __ACCLIB_HALLOC_USE_DAH 1
|
|
||||||
#elif 1 && (ACC_OS_DOS16 && defined(DOSX286))
|
|
||||||
# define __ACCLIB_HALLOC_USE_DAH 1
|
|
||||||
#elif 1 && (ACC_OS_OS216)
|
|
||||||
# define __ACCLIB_HALLOC_USE_DAH 1
|
|
||||||
#elif 1 && (ACC_OS_WIN16)
|
|
||||||
# define __ACCLIB_HALLOC_USE_GA 1
|
|
||||||
#elif 1 && (ACC_OS_DOS16) && (ACC_CC_BORLANDC) && defined(__DPMI16__)
|
|
||||||
# define __ACCLIB_HALLOC_USE_GA 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (__ACCLIB_HALLOC_USE_DAH)
|
|
||||||
#if 0 && (ACC_OS_OS216)
|
|
||||||
#include <os2.h>
|
|
||||||
#else
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosAllocHuge(unsigned short, unsigned short, unsigned short __far *, unsigned short, unsigned short);
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosFreeSeg(unsigned short);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACCLIB_HALLOC_USE_GA)
|
|
||||||
#if 0
|
|
||||||
#define STRICT 1
|
|
||||||
#include <windows.h>
|
|
||||||
#else
|
|
||||||
ACC_EXTERN_C const void __near* __far __pascal GlobalAlloc(unsigned, unsigned long);
|
|
||||||
ACC_EXTERN_C const void __near* __far __pascal GlobalFree(const void __near*);
|
|
||||||
ACC_EXTERN_C unsigned long __far __pascal GlobalHandle(unsigned);
|
|
||||||
ACC_EXTERN_C void __far* __far __pascal GlobalLock(const void __near*);
|
|
||||||
ACC_EXTERN_C int __far __pascal GlobalUnlock(const void __near*);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// halloc
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_halloc) (acc_hsize_t size)
|
|
||||||
{
|
|
||||||
acc_hvoid_p p = 0;
|
|
||||||
|
|
||||||
if (size <= 0)
|
|
||||||
return p;
|
|
||||||
|
|
||||||
#if 0 && defined(__palmos__)
|
|
||||||
p = MemPtrNew(size);
|
|
||||||
#elif !defined(ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
if (size < (size_t) -1)
|
|
||||||
p = malloc((size_t) size);
|
|
||||||
#else
|
|
||||||
if ((long)size <= 0)
|
|
||||||
return p;
|
|
||||||
{
|
|
||||||
#if (__ACCLIB_HALLOC_USE_DAH)
|
|
||||||
unsigned short sel = 0;
|
|
||||||
if (DosAllocHuge((unsigned short)(size >> 16), (unsigned short)size, &sel, 0, 0) == 0)
|
|
||||||
p = (acc_hvoid_p) ACC_MK_FP(sel, 0);
|
|
||||||
#elif (__ACCLIB_HALLOC_USE_GA)
|
|
||||||
const void __near* h = GlobalAlloc(2, size);
|
|
||||||
if (h) {
|
|
||||||
p = GlobalLock(h);
|
|
||||||
if (p && ACC_FP_OFF(p) != 0) {
|
|
||||||
GlobalUnlock(h);
|
|
||||||
p = 0;
|
|
||||||
}
|
|
||||||
if (!p)
|
|
||||||
GlobalFree(h);
|
|
||||||
}
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 700))
|
|
||||||
p = _halloc(size, 1);
|
|
||||||
#elif (ACC_CC_MSC || ACC_CC_WATCOMC)
|
|
||||||
p = halloc(size, 1);
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
p = farmalloc(size);
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
p = farmalloc(size);
|
|
||||||
#elif defined(ACC_CC_AZTECC)
|
|
||||||
p = lmalloc(size);
|
|
||||||
#else
|
|
||||||
if (size < (size_t) -1)
|
|
||||||
p = malloc((size_t) size);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_hfree) (acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
if (!p)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if 0 && defined(__palmos__)
|
|
||||||
MemPtrFree(p);
|
|
||||||
#elif !defined(ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
free(p);
|
|
||||||
#else
|
|
||||||
#if (__ACCLIB_HALLOC_USE_DAH)
|
|
||||||
if (ACC_FP_OFF(p) == 0)
|
|
||||||
DosFreeSeg((unsigned short) ACC_FP_SEG(p));
|
|
||||||
#elif (__ACCLIB_HALLOC_USE_GA)
|
|
||||||
if (ACC_FP_OFF(p) == 0) {
|
|
||||||
const void __near* h = (const void __near*) (unsigned) GlobalHandle(ACC_FP_SEG(p));
|
|
||||||
if (h) {
|
|
||||||
GlobalUnlock(h);
|
|
||||||
GlobalFree(h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 700))
|
|
||||||
_hfree(p);
|
|
||||||
#elif (ACC_CC_MSC || ACC_CC_WATCOMC)
|
|
||||||
hfree(p);
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
farfree((void __far*) p);
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
farfree((void __far*) p);
|
|
||||||
#elif defined(ACC_CC_AZTECC)
|
|
||||||
lfree(p);
|
|
||||||
#else
|
|
||||||
free(p);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HFREAD_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// huge pointer layer - stdio.h
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hfread) (ACC_FILE_P fp, acc_hvoid_p buf, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
unsigned char tmp[512];
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n = size - l > sizeof(tmp) ? sizeof(tmp) : (size_t) (size - l);
|
|
||||||
n = fread(tmp, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
__ACCLIB_FUNCNAME(acc_hmemcpy)((acc_hbyte_p)buf + l, tmp, (acc_hsize_t)n);
|
|
||||||
l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) buf;
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
n = ACC_FP_OFF(b); n = (n <= 1) ? 0x8000u : (0u - n);
|
|
||||||
if ((acc_hsize_t) n > size - l)
|
|
||||||
n = (size_t) (size - l);
|
|
||||||
n = fread((void __far*)b, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
return fread(buf, 1, size, fp);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hfwrite) (ACC_FILE_P fp, const acc_hvoid_p buf, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
unsigned char tmp[512];
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n = size - l > sizeof(tmp) ? sizeof(tmp) : (size_t) (size - l);
|
|
||||||
__ACCLIB_FUNCNAME(acc_hmemcpy)(tmp, (const acc_hbyte_p)buf + l, (acc_hsize_t)n);
|
|
||||||
n = fwrite(tmp, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) buf;
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
n = ACC_FP_OFF(b); n = (n <= 1) ? 0x8000u : (0u - n);
|
|
||||||
if ((acc_hsize_t) n > size - l)
|
|
||||||
n = (size_t) (size - l);
|
|
||||||
n = fwrite((void __far*)b, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
return fwrite(buf, 1, size, fp);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HMEMCPY_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// memcmp, memcpy, memmove, memset
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_hmemcmp) (const acc_hvoid_p s1, const acc_hvoid_p s2, acc_hsize_t len)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR) || !defined(HAVE_MEMCMP)
|
|
||||||
const acc_hbyte_p p1 = (const acc_hbyte_p) s1;
|
|
||||||
const acc_hbyte_p p2 = (const acc_hbyte_p) s2;
|
|
||||||
|
|
||||||
if (len > 0) do
|
|
||||||
{
|
|
||||||
int d = *p1 - *p2;
|
|
||||||
if (d != 0)
|
|
||||||
return d;
|
|
||||||
p1++; p2++;
|
|
||||||
} while (--len > 0);
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return memcmp(s1, s2, len);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemcpy) (acc_hvoid_p dest, const acc_hvoid_p src, acc_hsize_t len)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR) || !defined(HAVE_MEMCPY)
|
|
||||||
acc_hbyte_p p1 = (acc_hbyte_p) dest;
|
|
||||||
const acc_hbyte_p p2 = (const acc_hbyte_p) src;
|
|
||||||
|
|
||||||
if (len <= 0 || p1 == p2)
|
|
||||||
return dest;
|
|
||||||
do
|
|
||||||
*p1++ = *p2++;
|
|
||||||
while (--len > 0);
|
|
||||||
return dest;
|
|
||||||
#else
|
|
||||||
return memcpy(dest, src, len);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemmove) (acc_hvoid_p dest, const acc_hvoid_p src, acc_hsize_t len)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR) || !defined(HAVE_MEMMOVE)
|
|
||||||
acc_hbyte_p p1 = (acc_hbyte_p) dest;
|
|
||||||
const acc_hbyte_p p2 = (const acc_hbyte_p) src;
|
|
||||||
|
|
||||||
if (len <= 0 || p1 == p2)
|
|
||||||
return dest;
|
|
||||||
|
|
||||||
if (p1 < p2)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
*p1++ = *p2++;
|
|
||||||
while (--len > 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
p1 += len;
|
|
||||||
p2 += len;
|
|
||||||
do
|
|
||||||
*--p1 = *--p2;
|
|
||||||
while (--len > 0);
|
|
||||||
}
|
|
||||||
return dest;
|
|
||||||
#else
|
|
||||||
return memmove(dest, src, len);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemset) (acc_hvoid_p s, int c, acc_hsize_t len)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR) || !defined(HAVE_MEMSET)
|
|
||||||
acc_hbyte_p p = (acc_hbyte_p) s;
|
|
||||||
|
|
||||||
if (len > 0) do
|
|
||||||
*p++ = (unsigned char) c;
|
|
||||||
while (--len > 0);
|
|
||||||
return s;
|
|
||||||
#else
|
|
||||||
return memset(s, c, len);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HREAD_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// huge pointer layer - read/write
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(long, acc_hread) (int fd, acc_hvoid_p buf, long size)
|
|
||||||
{
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
unsigned char tmp[512];
|
|
||||||
long l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
int n = size - l > (long)sizeof(tmp) ? (int) sizeof(tmp) : (int) (size - l);
|
|
||||||
n = read(fd, tmp, n);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
if (n < 0)
|
|
||||||
return -1;
|
|
||||||
__ACCLIB_FUNCNAME(acc_hmemcpy)((acc_hbyte_p)buf + l, tmp, (acc_hsize_t)n);
|
|
||||||
l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) buf;
|
|
||||||
long l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
unsigned n;
|
|
||||||
n = ACC_FP_OFF(b); n = (n <= 1) ? 0x8000u : (0u - n);
|
|
||||||
if ((long) n > size - l)
|
|
||||||
n = (unsigned) (size - l);
|
|
||||||
n = read(fd, (void __far*)b, n);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
if (n == (unsigned)-1)
|
|
||||||
return -1;
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(long, acc_hwrite) (int fd, const acc_hvoid_p buf, long size)
|
|
||||||
{
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
unsigned char tmp[512];
|
|
||||||
long l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
int n = size - l > (long)sizeof(tmp) ? (int) sizeof(tmp) : (int) (size - l);
|
|
||||||
__ACCLIB_FUNCNAME(acc_hmemcpy)(tmp, (const acc_hbyte_p)buf + l, (acc_hsize_t)n);
|
|
||||||
n = write(fd, tmp, n);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
if (n < 0)
|
|
||||||
return -1;
|
|
||||||
l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) buf;
|
|
||||||
long l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
unsigned n;
|
|
||||||
n = ACC_FP_OFF(b); n = (n <= 1) ? 0x8000u : (0u - n);
|
|
||||||
if ((long) n > size - l)
|
|
||||||
n = (unsigned) (size - l);
|
|
||||||
n = write(fd, (void __far*)b, n);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
if (n == (unsigned)-1)
|
|
||||||
return -1;
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if (ACC_HAVE_MM_HUGE_PTR) */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HSREAD_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// huge pointer layer - safe read/write
|
|
||||||
// handles partial pipe writes and interrupted system calls
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(long, acc_safe_hread) (int fd, acc_hvoid_p buf, long size)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) buf;
|
|
||||||
long l = 0;
|
|
||||||
int saved_errno;
|
|
||||||
|
|
||||||
saved_errno = errno;
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
long n = size - l;
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
# define __ACCLIB_REQUIRE_HREAD_CH 1
|
|
||||||
errno = 0; n = acc_hread(fd, b, n);
|
|
||||||
#elif (ACC_OS_DOS32) && defined(__DJGPP__)
|
|
||||||
errno = 0; n = _read(fd, b, n);
|
|
||||||
#else
|
|
||||||
errno = 0; n = read(fd, b, n);
|
|
||||||
#endif
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
if (n < 0) {
|
|
||||||
#if defined(EINTR)
|
|
||||||
if (errno == (EINTR)) continue;
|
|
||||||
#endif
|
|
||||||
if (errno == 0) errno = 1;
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
errno = saved_errno;
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(long, acc_safe_hwrite) (int fd, const acc_hvoid_p buf, long size)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) buf;
|
|
||||||
long l = 0;
|
|
||||||
int saved_errno;
|
|
||||||
|
|
||||||
saved_errno = errno;
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
long n = size - l;
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
# define __ACCLIB_REQUIRE_HREAD_CH 1
|
|
||||||
errno = 0; n = acc_hwrite(fd, b, n);
|
|
||||||
#elif (ACC_OS_DOS32) && defined(__DJGPP__)
|
|
||||||
errno = 0; n = _write(fd, b, n);
|
|
||||||
#else
|
|
||||||
errno = 0; n = write(fd, b, n);
|
|
||||||
#endif
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
if (n < 0) {
|
|
||||||
#if defined(EINTR)
|
|
||||||
if (errno == (EINTR)) continue;
|
|
||||||
#endif
|
|
||||||
if (errno == 0) errno = 1;
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
errno = saved_errno;
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,566 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HSTRING_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strlen
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrlen) (const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
/* TODO: which one is the fastest generic version? */
|
|
||||||
#if 1
|
|
||||||
const acc_hchar_p start = s; while (*s) ++s;
|
|
||||||
return (acc_hsize_t) (s - start);
|
|
||||||
#elif 1
|
|
||||||
acc_hsize_t n = 0; while (*s) ++s, ++n; return n;
|
|
||||||
#elif 1
|
|
||||||
acc_hsize_t n = 0; while (s[n]) ++n; return n;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strcmp, strncmp, ascii_stricmp, ascii_strnicmp, ascii_memicmp
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_hstrcmp) (const acc_hchar_p p, const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
for ( ; *p; ++p, ++s) {
|
|
||||||
if (*p != *s)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return (unsigned char)*p - (unsigned char)*s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_hstrncmp) (const acc_hchar_p p, const acc_hchar_p s, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
for ( ; *p && n > 0; ++p, ++s, --n) {
|
|
||||||
if (*p != *s)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return (unsigned char)*p - (unsigned char)*s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_ascii_hstricmp) (const acc_hchar_p p, const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
for ( ; *p; ++p, ++s) {
|
|
||||||
if (*p != *s) {
|
|
||||||
int d = acc_ascii_utolower(*p) - acc_ascii_utolower(*s);
|
|
||||||
if (d != 0)
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return acc_ascii_utolower(*p) - acc_ascii_utolower(*s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_ascii_hstrnicmp) (const acc_hchar_p p, const acc_hchar_p s, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
for ( ; *p && n > 0; ++p, ++s, --n) {
|
|
||||||
if (*p != *s) {
|
|
||||||
int d = acc_ascii_utolower(*p) - acc_ascii_utolower(*s);
|
|
||||||
if (d != 0)
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return acc_ascii_utolower(*p) - acc_ascii_utolower(*s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_ascii_hmemicmp) (const acc_hvoid_p pp, const acc_hvoid_p ss, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p p = (const acc_hbyte_p) pp;
|
|
||||||
const acc_hbyte_p s = (const acc_hbyte_p) ss;
|
|
||||||
for ( ; n > 0; ++p, ++s, --n) {
|
|
||||||
if (*p != *s) {
|
|
||||||
int d = acc_ascii_utolower(*p) - acc_ascii_utolower(*s);
|
|
||||||
if (d != 0)
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return acc_ascii_utolower(*p) - acc_ascii_utolower(*s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strstr, ascii_stristr, memmem, ascii_memimem
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrstr) (const acc_hchar_p p, const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
acc_hsize_t pn = __ACCLIB_FUNCNAME(acc_hstrlen)(p);
|
|
||||||
acc_hsize_t sn = __ACCLIB_FUNCNAME(acc_hstrlen)(s);
|
|
||||||
return (acc_hchar_p) __ACCLIB_FUNCNAME(acc_hmemmem)(p, pn, s, sn);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstristr) (const acc_hchar_p p, const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
acc_hsize_t pn = __ACCLIB_FUNCNAME(acc_hstrlen)(p);
|
|
||||||
acc_hsize_t sn = __ACCLIB_FUNCNAME(acc_hstrlen)(s);
|
|
||||||
return (acc_hchar_p) __ACCLIB_FUNCNAME(acc_ascii_hmemimem)(p, pn, s, sn);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemmem) (const acc_hvoid_p p, acc_hsize_t pn, const acc_hvoid_p s, acc_hsize_t sn)
|
|
||||||
{
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
if (sn == 0) __ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
for ( ; pn >= sn; --pn) {
|
|
||||||
if (__ACCLIB_FUNCNAME(acc_hmemcmp)(p, s, sn) == 0)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
p = (const acc_hbyte_p)p + 1;
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemimem) (const acc_hvoid_p p, acc_hsize_t pn, const acc_hvoid_p s, acc_hsize_t sn)
|
|
||||||
{
|
|
||||||
if (sn == 0) __ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
for ( ; pn >= sn; --pn) {
|
|
||||||
if (__ACCLIB_FUNCNAME(acc_ascii_hmemicmp)(p, s, sn) == 0)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
p = (const acc_hbyte_p)p + 1;
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strcpy, strcat
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrcpy) (acc_hchar_p d, const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
acc_hchar_p dest = d;
|
|
||||||
while ((*d = *s) != 0) {
|
|
||||||
++d; ++s;
|
|
||||||
}
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrcat) (acc_hchar_p d, const acc_hchar_p s)
|
|
||||||
{
|
|
||||||
acc_hchar_p dest = d;
|
|
||||||
while (*d) ++d;
|
|
||||||
while ((*d = *s) != 0) {
|
|
||||||
++d; ++s;
|
|
||||||
}
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strlcpy, strlcat
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrlcpy) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
if (n != size) {
|
|
||||||
do {
|
|
||||||
if ((*d = *s) == 0) return n;
|
|
||||||
++d; ++s; ++n;
|
|
||||||
} while (n != size);
|
|
||||||
d[-1] = 0;
|
|
||||||
}
|
|
||||||
while (*s) ++s, ++n;
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrlcat) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
while (*d && n != size) ++d, ++n;
|
|
||||||
if (n != size) {
|
|
||||||
do {
|
|
||||||
if ((*d = *s) == 0) return n;
|
|
||||||
++d; ++s; ++n;
|
|
||||||
} while (n != size);
|
|
||||||
d[-1] = 0;
|
|
||||||
}
|
|
||||||
while (*s) ++s, ++n;
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strscpy, strscat
|
|
||||||
// (same as strlcpy/strlcat, but just return -1 in case of failure)
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_hstrscpy) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
if (n != size) {
|
|
||||||
do {
|
|
||||||
if ((*d = *s) == 0) return 0;
|
|
||||||
++d; ++s; ++n;
|
|
||||||
} while (n != size);
|
|
||||||
d[-1] = 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_hstrscat) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
while (*d && n != size) ++d, ++n;
|
|
||||||
if (n != size) {
|
|
||||||
do {
|
|
||||||
if ((*d = *s) == 0) return 0;
|
|
||||||
++d; ++s; ++n;
|
|
||||||
} while (n != size);
|
|
||||||
d[-1] = 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strccpy, memccpy
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrccpy) (acc_hchar_p d, const acc_hchar_p s, int c)
|
|
||||||
{
|
|
||||||
for (;;) {
|
|
||||||
if ((*d = *s) == 0) break;
|
|
||||||
if (*d++ == (char) c) return d;
|
|
||||||
++s;
|
|
||||||
}
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemccpy) (acc_hvoid_p d, const acc_hvoid_p s, int c, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
acc_hbyte_p a = (acc_hbyte_p) d;
|
|
||||||
const acc_hbyte_p p = (const acc_hbyte_p) s;
|
|
||||||
const acc_hbyte_p e = (const acc_hbyte_p) s + n;
|
|
||||||
while (p != e) {
|
|
||||||
if ((*a++ = *p++) == (unsigned char) c)
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strchr, strrchr, ascii_strichr, ascii_strrichr
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrchr) (const acc_hchar_p s, int c)
|
|
||||||
{
|
|
||||||
for ( ; *s; ++s) {
|
|
||||||
if (*s == (char) c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
}
|
|
||||||
if ((char) c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrrchr) (const acc_hchar_p s, int c)
|
|
||||||
{
|
|
||||||
const acc_hchar_p start = s;
|
|
||||||
while (*s) ++s;
|
|
||||||
if ((char) c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
for (;;) {
|
|
||||||
if (s == start) break; --s;
|
|
||||||
if (*s == (char) c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
}
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrichr) (const acc_hchar_p s, int c)
|
|
||||||
{
|
|
||||||
c = acc_ascii_utolower(c);
|
|
||||||
for ( ; *s; ++s) {
|
|
||||||
if (acc_ascii_utolower(*s) == c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
}
|
|
||||||
if (c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrrichr) (const acc_hchar_p s, int c)
|
|
||||||
{
|
|
||||||
const acc_hchar_p start = s;
|
|
||||||
c = acc_ascii_utolower(c);
|
|
||||||
while (*s) ++s;
|
|
||||||
if (c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
for (;;) {
|
|
||||||
if (s == start) break; --s;
|
|
||||||
if (acc_ascii_utolower(*s) == c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
}
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// memchr, memrchr, ascii_memichr, ascii_memrichr
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemchr) (const acc_hvoid_p s, int c, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p p = (const acc_hbyte_p) s;
|
|
||||||
const acc_hbyte_p e = (const acc_hbyte_p) s + n;
|
|
||||||
while (p != e) {
|
|
||||||
if (*p == (unsigned char) c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemrchr) (const acc_hvoid_p s, int c, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p p = (const acc_hbyte_p) s + n;
|
|
||||||
const acc_hbyte_p e = (const acc_hbyte_p) s;
|
|
||||||
while (p != e) {
|
|
||||||
--p;
|
|
||||||
if (*p == (unsigned char) c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemichr) (const acc_hvoid_p s, int c, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p p = (const acc_hbyte_p) s;
|
|
||||||
const acc_hbyte_p e = (const acc_hbyte_p) s + n;
|
|
||||||
c = acc_ascii_utolower(c);
|
|
||||||
while (p != e) {
|
|
||||||
if (acc_ascii_utolower(*p) == c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemrichr) (const acc_hvoid_p s, int c, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p p = (const acc_hbyte_p) s + n;
|
|
||||||
const acc_hbyte_p e = (const acc_hbyte_p) s;
|
|
||||||
c = acc_ascii_utolower(c);
|
|
||||||
while (p != e) {
|
|
||||||
--p;
|
|
||||||
if (acc_ascii_utolower(*p) == c)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)
|
|
||||||
}
|
|
||||||
return (acc_hvoid_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strspn, strrspn
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrspn) (const acc_hchar_p s, const acc_hchar_p accept)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
for ( ; *s; ++s) {
|
|
||||||
const acc_hchar_p a;
|
|
||||||
for (a = accept; *a; ++a)
|
|
||||||
if (*s == *a)
|
|
||||||
goto acc_label_next;
|
|
||||||
break;
|
|
||||||
acc_label_next:
|
|
||||||
++n;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrrspn) (const acc_hchar_p s, const acc_hchar_p accept)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
const acc_hchar_p start = s;
|
|
||||||
while (*s) ++s;
|
|
||||||
for (;;) {
|
|
||||||
const acc_hchar_p a;
|
|
||||||
if (s == start) break; --s;
|
|
||||||
for (a = accept; *a; ++a)
|
|
||||||
if (*s == *a)
|
|
||||||
goto acc_label_next;
|
|
||||||
break;
|
|
||||||
acc_label_next:
|
|
||||||
++n;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strcspn, strrcspn
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrcspn) (const acc_hchar_p s, const acc_hchar_p reject)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
for ( ; *s; ++s, ++n) {
|
|
||||||
const acc_hchar_p r;
|
|
||||||
for (r = reject; *r; ++r)
|
|
||||||
if (*s == *r)
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hstrrcspn) (const acc_hchar_p s, const acc_hchar_p reject)
|
|
||||||
{
|
|
||||||
acc_hsize_t n = 0;
|
|
||||||
const acc_hchar_p start = s;
|
|
||||||
while (*s) ++s;
|
|
||||||
for ( ; ; ++n) {
|
|
||||||
const acc_hchar_p r;
|
|
||||||
if (s == start) break; --s;
|
|
||||||
for (r = reject; *r; ++r)
|
|
||||||
if (*s == *r)
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strpbrk, strrpbrk
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrpbrk) (const acc_hchar_p s, const acc_hchar_p accept)
|
|
||||||
{
|
|
||||||
for ( ; *s; ++s) {
|
|
||||||
const acc_hchar_p a;
|
|
||||||
for (a = accept; *a; ++a) {
|
|
||||||
if (*s == *a)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrrpbrk) (const acc_hchar_p s, const acc_hchar_p accept)
|
|
||||||
{
|
|
||||||
const acc_hchar_p start = s;
|
|
||||||
while (*s) ++s;
|
|
||||||
for (;;) {
|
|
||||||
const acc_hchar_p a;
|
|
||||||
if (s == start) break; --s;
|
|
||||||
for (a = accept; *a; ++a) {
|
|
||||||
if (*s == *a)
|
|
||||||
__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// strsep, strrsep
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrsep) (acc_hchar_pp ss, const acc_hchar_p delim)
|
|
||||||
{
|
|
||||||
acc_hchar_p s = *ss;
|
|
||||||
if (s) {
|
|
||||||
acc_hchar_p p = __ACCLIB_FUNCNAME(acc_hstrpbrk)(s, delim);
|
|
||||||
if (p) *p++ = 0;
|
|
||||||
*ss = p;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_hstrrsep) (acc_hchar_pp ss, const acc_hchar_p delim)
|
|
||||||
{
|
|
||||||
acc_hchar_p s = *ss;
|
|
||||||
if (s) {
|
|
||||||
acc_hchar_p p = __ACCLIB_FUNCNAME(acc_hstrrpbrk)(s, delim);
|
|
||||||
if (p) {
|
|
||||||
*p++ = 0;
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
*ss = (acc_hchar_p) 0;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// ascii_strlwr, ascii_strupr, ascii_memlwr, ascii_memupr
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrlwr) (acc_hchar_p s)
|
|
||||||
{
|
|
||||||
acc_hbyte_p p = (acc_hbyte_p) s;
|
|
||||||
for ( ; *p; ++p)
|
|
||||||
*p = (unsigned char) acc_ascii_utolower(*p);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrupr) (acc_hchar_p s)
|
|
||||||
{
|
|
||||||
acc_hbyte_p p = (acc_hbyte_p) s;
|
|
||||||
for ( ; *p; ++p)
|
|
||||||
*p = (unsigned char) acc_ascii_utoupper(*p);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemlwr) (acc_hvoid_p s, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
acc_hbyte_p p = (acc_hbyte_p) s;
|
|
||||||
acc_hbyte_p e = (acc_hbyte_p) s + n;
|
|
||||||
for ( ; p != e; ++p)
|
|
||||||
*p = (unsigned char) acc_ascii_utolower(*p);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemupr) (acc_hvoid_p s, acc_hsize_t n)
|
|
||||||
{
|
|
||||||
acc_hbyte_p p = (acc_hbyte_p) s;
|
|
||||||
acc_hbyte_p e = (acc_hbyte_p) s + n;
|
|
||||||
for ( ; p != e; ++p)
|
|
||||||
*p = (unsigned char) acc_ascii_utoupper(*p);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_MISC_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap misc
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acclib_handle_t, acc_get_osfhandle) (int fd)
|
|
||||||
{
|
|
||||||
if (fd < 0)
|
|
||||||
return -1;
|
|
||||||
#if (ACC_OS_CYGWIN)
|
|
||||||
return get_osfhandle(fd);
|
|
||||||
#elif (ACC_OS_EMX && defined(__RSXNT__))
|
|
||||||
return -1; /* FIXME */
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
return -1; /* FIXME */
|
|
||||||
#elif (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (ACC_CC_PELLESC && (__POCC__ < 280))
|
|
||||||
return -1; /* FIXME */
|
|
||||||
# elif (ACC_CC_WATCOMC && (__WATCOMC__ < 1000))
|
|
||||||
return -1; /* FIXME */
|
|
||||||
# elif (ACC_CC_WATCOMC && (__WATCOMC__ < 1100))
|
|
||||||
return _os_handle(fd);
|
|
||||||
# else
|
|
||||||
return _get_osfhandle(fd);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
return fd;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_set_binmode) (int fd, int binary)
|
|
||||||
{
|
|
||||||
#if (ACC_OS_TOS && defined(__MINT__))
|
|
||||||
FILE* fp; int old_binary;
|
|
||||||
if (fd == STDIN_FILENO) fp = stdin;
|
|
||||||
else if (fd == STDOUT_FILENO) fp = stdout;
|
|
||||||
else if (fd == STDERR_FILENO) fp = stderr;
|
|
||||||
else return -1;
|
|
||||||
old_binary = fp->__mode.__binary;
|
|
||||||
__set_binmode(fp, binary ? 1 : 0);
|
|
||||||
return old_binary ? 1 : 0;
|
|
||||||
#elif (ACC_OS_TOS)
|
|
||||||
ACC_UNUSED(fd); ACC_UNUSED(binary);
|
|
||||||
return -1; /* FIXME */
|
|
||||||
#elif (ACC_OS_DOS16 && (ACC_CC_AZTECC || ACC_CC_PACIFICC))
|
|
||||||
ACC_UNUSED(fd); ACC_UNUSED(binary);
|
|
||||||
return -1; /* FIXME */
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
int r; unsigned old_flags = __djgpp_hwint_flags;
|
|
||||||
ACC_COMPILE_TIME_ASSERT(O_BINARY > 0)
|
|
||||||
ACC_COMPILE_TIME_ASSERT(O_TEXT > 0)
|
|
||||||
if (fd < 0) return -1;
|
|
||||||
r = setmode(fd, binary ? O_BINARY : O_TEXT);
|
|
||||||
if ((old_flags & 1u) != (__djgpp_hwint_flags & 1u))
|
|
||||||
__djgpp_set_ctrl_c(!(old_flags & 1));
|
|
||||||
if (r == -1) return -1;
|
|
||||||
return (r & O_TEXT) ? 0 : 1;
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
if (fd < 0) return -1;
|
|
||||||
ACC_UNUSED(binary);
|
|
||||||
return 1;
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC)
|
|
||||||
FILE* fp; int r;
|
|
||||||
if (fd == fileno(stdin)) fp = stdin;
|
|
||||||
else if (fd == fileno(stdout)) fp = stdout;
|
|
||||||
else if (fd == fileno(stderr)) fp = stderr;
|
|
||||||
else return -1;
|
|
||||||
r = _setmode(fp, binary ? _BINARY : _TEXT);
|
|
||||||
if (r == -1) return -1;
|
|
||||||
return (r & _BINARY) ? 1 : 0;
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
ACC_UNUSED(fd); ACC_UNUSED(binary);
|
|
||||||
return -1; /* FIXME */
|
|
||||||
#elif (ACC_OS_CYGWIN && (ACC_CC_GNUC < 0x025a00ul))
|
|
||||||
ACC_UNUSED(fd); ACC_UNUSED(binary);
|
|
||||||
return -1; /* FIXME */
|
|
||||||
#elif (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
int r;
|
|
||||||
#if !defined(ACC_CC_ZORTECHC)
|
|
||||||
ACC_COMPILE_TIME_ASSERT(O_BINARY > 0)
|
|
||||||
#endif
|
|
||||||
ACC_COMPILE_TIME_ASSERT(O_TEXT > 0)
|
|
||||||
if (fd < 0) return -1;
|
|
||||||
r = setmode(fd, binary ? O_BINARY : O_TEXT);
|
|
||||||
if (r == -1) return -1;
|
|
||||||
return (r & O_TEXT) ? 0 : 1;
|
|
||||||
#else
|
|
||||||
if (fd < 0) return -1;
|
|
||||||
ACC_UNUSED(binary);
|
|
||||||
return 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_isatty) (int fd)
|
|
||||||
{
|
|
||||||
/* work around library implementations that think that
|
|
||||||
* any character device like `nul' is a tty */
|
|
||||||
if (fd < 0)
|
|
||||||
return 0;
|
|
||||||
#if (ACC_OS_DOS16 && !defined(ACC_CC_AZTECC))
|
|
||||||
{
|
|
||||||
union REGS ri, ro;
|
|
||||||
ri.x.ax = 0x4400; ri.x.bx = fd;
|
|
||||||
int86(0x21, &ri, &ro);
|
|
||||||
if ((ro.x.cflag & 1) == 0) /* if carry flag not set */
|
|
||||||
if ((ro.x.ax & 0x83) != 0x83)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_WATCOMC)
|
|
||||||
{
|
|
||||||
union REGS ri, ro;
|
|
||||||
ri.w.ax = 0x4400; ri.w.bx = (unsigned short) fd;
|
|
||||||
int386(0x21, &ri, &ro);
|
|
||||||
if ((ro.w.cflag & 1) == 0) /* if carry flag not set */
|
|
||||||
if ((ro.w.ax & 0x83) != 0x83)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#elif (ACC_HAVE_WINDOWS_H)
|
|
||||||
{
|
|
||||||
acclib_handle_t h = __ACCLIB_FUNCNAME(acc_get_osfhandle)(fd);
|
|
||||||
if ((HANDLE)h != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
DWORD d = 0;
|
|
||||||
if (GetConsoleMode((HANDLE)h, &d) == 0)
|
|
||||||
return 0; /* GetConsoleMode failed -> not a tty */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return (isatty(fd)) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_mkdir) (const char* name, unsigned mode)
|
|
||||||
{
|
|
||||||
#if (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
ACC_UNUSED(mode);
|
|
||||||
return Dcreate(name);
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
return mkdir(name, mode);
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
return mkdir(name, mode);
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
ACC_UNUSED(mode);
|
|
||||||
# if (ACC_CC_HIGHC || ACC_CC_PACIFICC)
|
|
||||||
return mkdir((char*) name);
|
|
||||||
# else
|
|
||||||
return mkdir(name);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
return mkdir(name, mode);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_int32l_t, acc_muldiv32) (acc_int32l_t a, acc_int32l_t b, acc_int32l_t x)
|
|
||||||
{
|
|
||||||
acc_int32l_t r = 0;
|
|
||||||
if (x == 0) return x;
|
|
||||||
/* FIXME */
|
|
||||||
ACC_UNUSED(a); ACC_UNUSED(b);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_umuldiv32) (acc_uint32l_t a, acc_uint32l_t b, acc_uint32l_t x)
|
|
||||||
{
|
|
||||||
acc_uint32l_t r = 0;
|
|
||||||
if (x == 0) return x;
|
|
||||||
/* FIXME */
|
|
||||||
ACC_UNUSED(a); ACC_UNUSED(b);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,255 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_OPENDIR_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap <dirent.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACCLIB_USE_OPENDIR)
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_TOS || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
|
|
||||||
static int __ACCLIB_FUNCNAME(acc_opendir_init)(acc_dir_p f, const char* path, char* buf, size_t bufsize)
|
|
||||||
{
|
|
||||||
size_t l; char* p;
|
|
||||||
f->f_name[0] = 0; buf[0] = 0;
|
|
||||||
l = strlen(path);
|
|
||||||
if (l == 0 || bufsize <= 4 || l >= bufsize - 4)
|
|
||||||
return -1;
|
|
||||||
strcpy(buf, path); p = buf + l;
|
|
||||||
if (p[-1] == ':' || p[-1] == '\\' || p[-1] == '/')
|
|
||||||
strcpy(p, "*.*");
|
|
||||||
else
|
|
||||||
strcpy(p, "\\*.*");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__ACCLIB_USE_OPENDIR)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path)
|
|
||||||
{
|
|
||||||
f->u_dirp = opendir(path);
|
|
||||||
if (!f->u_dirp)
|
|
||||||
return -2;
|
|
||||||
return __ACCLIB_FUNCNAME(acc_readdir)(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
const struct dirent* dp;
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
if (!f->u_dirp)
|
|
||||||
return -1;
|
|
||||||
dp = (const struct dirent*) readdir((DIR*) f->u_dirp);
|
|
||||||
if (!dp)
|
|
||||||
return -1;
|
|
||||||
if (!dp->d_name[0] || strlen(dp->d_name) >= sizeof(f->f_name))
|
|
||||||
return -1;
|
|
||||||
strcpy(f->f_name, dp->d_name);
|
|
||||||
#if (ACC_CC_WATCOMC)
|
|
||||||
ACC_COMPILE_TIME_ASSERT(sizeof(f->f_name) >= sizeof(dp->d_name))
|
|
||||||
f->f_time = dp->d_time;
|
|
||||||
f->f_date = dp->d_date;
|
|
||||||
f->f_size = dp->d_size;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
int r = -1;
|
|
||||||
if (f->u_dirp)
|
|
||||||
r = closedir((DIR*) f->u_dirp);
|
|
||||||
f->u_dirp = 0;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path)
|
|
||||||
{
|
|
||||||
WIN32_FIND_DATAA d;
|
|
||||||
HANDLE h;
|
|
||||||
if (__ACCLIB_FUNCNAME(acc_opendir_init)(f, path, f->f_name, sizeof(f->f_name)) != 0)
|
|
||||||
return -1;
|
|
||||||
h = FindFirstFileA(f->f_name, &d);
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
if ((f->u_handle = (acclib_handle_t) h) == -1)
|
|
||||||
return -1;
|
|
||||||
if (!d.cFileName[0] || strlen(d.cFileName) >= sizeof(f->f_name))
|
|
||||||
return -1;
|
|
||||||
strcpy(f->f_name, d.cFileName);
|
|
||||||
f->f_attr = d.dwFileAttributes;
|
|
||||||
f->f_size_high = d.nFileSizeHigh;
|
|
||||||
f->f_size_low = d.nFileSizeLow;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
WIN32_FIND_DATAA d;
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
if (f->u_handle == -1 || FindNextFileA((HANDLE) f->u_handle, &d) == 0)
|
|
||||||
return -1;
|
|
||||||
if (!d.cFileName[0] || strlen(d.cFileName) >= sizeof(f->f_name))
|
|
||||||
return -1;
|
|
||||||
strcpy(f->f_name, d.cFileName);
|
|
||||||
f->f_attr = d.dwFileAttributes;
|
|
||||||
f->f_size_high = d.nFileSizeHigh;
|
|
||||||
f->f_size_low = d.nFileSizeLow;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
int r = -1;
|
|
||||||
if (f->u_handle != -1)
|
|
||||||
r = FindClose((HANDLE) f->u_handle);
|
|
||||||
f->u_handle = -1;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_WIN16)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path)
|
|
||||||
{
|
|
||||||
char tmp[ACC_FN_PATH_MAX+1];
|
|
||||||
int r;
|
|
||||||
f->u_dirp = 0;
|
|
||||||
if (__ACCLIB_FUNCNAME(acc_opendir_init)(f, path, tmp, sizeof(tmp)) != 0)
|
|
||||||
return -1;
|
|
||||||
#if (ACC_CC_AZTECC || ACC_CC_PACIFICC)
|
|
||||||
r = -1;
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
r = findfirst(tmp, (struct ffblk*) f->u_dta, FA_HIDDEN|FA_SYSTEM|FA_RDONLY|FA_DIREC);
|
|
||||||
#else
|
|
||||||
r = _dos_findfirst(tmp, _A_HIDDEN|_A_SYSTEM|_A_RDONLY|_A_SUBDIR, (struct find_t*) f->u_dta);
|
|
||||||
#endif
|
|
||||||
if (r != 0) f->f_name[0] = 0;
|
|
||||||
if (!f->f_name[0]) return -1;
|
|
||||||
f->u_dirp = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
if (!f->u_dirp)
|
|
||||||
return -1;
|
|
||||||
#if (ACC_CC_AZTECC || ACC_CC_PACIFICC)
|
|
||||||
r = -1;
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
r = findnext((struct ffblk*) f->u_dta);
|
|
||||||
#else
|
|
||||||
r = _dos_findnext((struct find_t*) f->u_dta);
|
|
||||||
#endif
|
|
||||||
if (r != 0) f->f_name[0] = 0;
|
|
||||||
if (!f->f_name[0]) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
ACC_COMPILE_TIME_ASSERT(sizeof(*f) == 44);
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
f->u_dirp = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_OS_TOS)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path)
|
|
||||||
{
|
|
||||||
char tmp[ACC_FN_PATH_MAX+1];
|
|
||||||
int r;
|
|
||||||
DTA* olddta;
|
|
||||||
f->u_dirp = 0;
|
|
||||||
if (__ACCLIB_FUNCNAME(acc_opendir_init)(f, path, tmp, sizeof(tmp)) != 0)
|
|
||||||
return -1;
|
|
||||||
olddta = Fgetdta();
|
|
||||||
Fsetdta((DTA*) f->u_dta);
|
|
||||||
r = Fsfirst(tmp, FA_HIDDEN|FA_SYSTEM|FA_READONLY|FA_SUBDIR);
|
|
||||||
Fsetdta(olddta);
|
|
||||||
if (r != 0) f->f_name[0] = 0;
|
|
||||||
if (!f->f_name[0]) return -1;
|
|
||||||
f->u_dirp = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
DTA* olddta;
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
if (!f->u_dirp)
|
|
||||||
return -1;
|
|
||||||
olddta = Fgetdta();
|
|
||||||
Fsetdta((DTA*) f->u_dta);
|
|
||||||
r = Fsnext();
|
|
||||||
Fsetdta(olddta);
|
|
||||||
if (r != 0) f->f_name[0] = 0;
|
|
||||||
if (!f->f_name[0]) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
ACC_COMPILE_TIME_ASSERT(sizeof(*f) == 44);
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
f->u_dirp = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path)
|
|
||||||
{
|
|
||||||
ACC_UNUSED(path);
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
f->f_name[0] = 0;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f)
|
|
||||||
{
|
|
||||||
f->u_dirp = 0;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_RAND_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// some linear congruential pseudo random number generators (PRNG)
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_srand31) (acc_rand31_p r, acc_uint32l_t seed)
|
|
||||||
{
|
|
||||||
r->seed = seed & ACC_UINT32L_C(0xffffffff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_rand31) (acc_rand31_p r)
|
|
||||||
{
|
|
||||||
r->seed = r->seed * ACC_UINT32L_C(1103515245) + 12345;
|
|
||||||
r->seed &= ACC_UINT32L_C(0x7fffffff);
|
|
||||||
return r->seed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_srand48) (acc_rand48_p r, acc_uint32l_t seed)
|
|
||||||
{
|
|
||||||
r->seed = seed & ACC_UINT32L_C(0xffffffff);
|
|
||||||
r->seed <<= 16; r->seed |= 0x330e;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_rand48) (acc_rand48_p r)
|
|
||||||
{
|
|
||||||
r->seed = r->seed * ACC_UINT64L_C(25214903917) + 11;
|
|
||||||
r->seed &= ACC_UINT64L_C(0xffffffffffff);
|
|
||||||
return (acc_uint32l_t) (r->seed >> 17);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_rand48_r32) (acc_rand48_p r)
|
|
||||||
{
|
|
||||||
r->seed = r->seed * ACC_UINT64L_C(25214903917) + 11;
|
|
||||||
r->seed &= ACC_UINT64L_C(0xffffffffffff);
|
|
||||||
return (acc_uint32l_t) (r->seed >> 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* acc_uint64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_srand64) (acc_rand64_p r, acc_uint64l_t seed)
|
|
||||||
{
|
|
||||||
r->seed = seed & ACC_UINT64L_C(0xffffffffffffffff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_rand64) (acc_rand64_p r)
|
|
||||||
{
|
|
||||||
r->seed = r->seed * ACC_UINT64L_C(6364136223846793005) + 1;
|
|
||||||
#if (SIZEOF_ACC_INT64L_T > 8)
|
|
||||||
r->seed &= ACC_UINT64L_C(0xffffffffffffffff);
|
|
||||||
#endif
|
|
||||||
return (acc_uint32l_t) (r->seed >> 33);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_rand64_r32) (acc_rand64_p r)
|
|
||||||
{
|
|
||||||
r->seed = r->seed * ACC_UINT64L_C(6364136223846793005) + 1;
|
|
||||||
#if (SIZEOF_ACC_INT64L_T > 8)
|
|
||||||
r->seed &= ACC_UINT64L_C(0xffffffffffffffff);
|
|
||||||
#endif
|
|
||||||
return (acc_uint32l_t) (r->seed >> 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* acc_uint64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// mersenne twister PRNG
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_srandmt) (acc_randmt_p r, acc_uint32l_t seed)
|
|
||||||
{
|
|
||||||
unsigned i = 0;
|
|
||||||
do {
|
|
||||||
r->s[i++] = (seed &= ACC_UINT32L_C(0xffffffff));
|
|
||||||
seed ^= seed >> 30;
|
|
||||||
seed = seed * ACC_UINT32L_C(0x6c078965) + i;
|
|
||||||
} while (i != 624);
|
|
||||||
r->n = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_randmt) (acc_randmt_p r)
|
|
||||||
{
|
|
||||||
return (__ACCLIB_FUNCNAME(acc_randmt_r32)(r)) >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_randmt_r32) (acc_randmt_p r)
|
|
||||||
{
|
|
||||||
acc_uint32l_t v;
|
|
||||||
if (r->n == 624) {
|
|
||||||
int i = 0, j;
|
|
||||||
r->n = 0;
|
|
||||||
do {
|
|
||||||
j = i - 623; if (j < 0) j += 624;
|
|
||||||
v = (r->s[i] & ACC_UINT32L_C(0x80000000)) ^ (r->s[j] & ACC_UINT32L_C(0x7fffffff));
|
|
||||||
j = i - 227; if (j < 0) j += 624;
|
|
||||||
r->s[i] = r->s[j] ^ (v >> 1);
|
|
||||||
if (v & 1) r->s[i] ^= ACC_UINT32L_C(0x9908b0df);
|
|
||||||
} while (++i != 624);
|
|
||||||
}
|
|
||||||
v = r->s[r->n++];
|
|
||||||
v ^= v >> 11; v ^= (v & ACC_UINT32L_C(0x013a58ad)) << 7;
|
|
||||||
v ^= (v & ACC_UINT32L_C(0x0001df8c)) << 15; v ^= v >> 18;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_RDTSC_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
|
|
||||||
|
|
||||||
#if ((ACC_ARCH_AMD64 || ACC_ARCH_IA32) && ACC_CC_GNUC)
|
|
||||||
# if (ACC_CC_GNUC >= 0x020000ul)
|
|
||||||
# define __ACCLIB_RDTSC_REGS : : "r" (t) : "cc", "memory", "eax", "edx"
|
|
||||||
# else
|
|
||||||
# define __ACCLIB_RDTSC_REGS : : "r" (t) : "ax", "dx"
|
|
||||||
# endif
|
|
||||||
#elif (ACC_ARCH_IA32 && ACC_CC_INTELC) && defined(__linux__)
|
|
||||||
# define __ACCLIB_RDTSC_REGS : : "r" (t) : "memory", "eax", "edx"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// read TSC
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_tsc_read) (acc_uint32e_t* t)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32) && defined(__ACCLIB_RDTSC_REGS)
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"clc \n" ".byte 0x0f, 0x31\n"
|
|
||||||
"movl %%eax,(%0)\n" "movl %%edx,4(%0)\n"
|
|
||||||
__ACCLIB_RDTSC_REGS
|
|
||||||
);
|
|
||||||
return 0;
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_OS_DOS32 || ACC_OS_WIN32) && (ACC_CC_DMC || ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_PELLESC))
|
|
||||||
ACC_UNUSED(t);
|
|
||||||
__asm {
|
|
||||||
mov ecx, t
|
|
||||||
clc
|
|
||||||
# if (ACC_CC_MSC && (_MSC_VER < 1200))
|
|
||||||
_emit 0x0f
|
|
||||||
_emit 0x31
|
|
||||||
# else
|
|
||||||
rdtsc
|
|
||||||
# endif
|
|
||||||
mov [ecx], eax
|
|
||||||
mov [ecx+4], edx
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
t[0] = t[1] = 0;
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// read and add TSC
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_tsc_read_add) (acc_uint32e_t* t)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32) && defined(__ACCLIB_RDTSC_REGS)
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"clc \n" ".byte 0x0f, 0x31\n"
|
|
||||||
"addl %%eax,(%0)\n" "adcl $0,%%edx\n" "addl %%edx,4(%0)\n"
|
|
||||||
__ACCLIB_RDTSC_REGS
|
|
||||||
);
|
|
||||||
return 0;
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_OS_DOS32 || ACC_OS_WIN32) && (ACC_CC_DMC || ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_PELLESC))
|
|
||||||
ACC_UNUSED(t);
|
|
||||||
__asm {
|
|
||||||
mov ecx, t
|
|
||||||
clc
|
|
||||||
# if (ACC_CC_MSC && (_MSC_VER < 1200))
|
|
||||||
_emit 0x0f
|
|
||||||
_emit 0x31
|
|
||||||
# else
|
|
||||||
rdtsc
|
|
||||||
# endif
|
|
||||||
add [ecx], eax
|
|
||||||
adc edx, 0
|
|
||||||
add [ecx+4], edx
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
acc_uint32e_t v[2];
|
|
||||||
int r;
|
|
||||||
r = acc_tsc_read(v);
|
|
||||||
t[0] += v[0];
|
|
||||||
if (t[0] < v[0]) t[1] += 1;
|
|
||||||
t[1] += v[1];
|
|
||||||
return r;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* defined(acc_int32e_t) */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,230 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_UCLOCK_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
#elif (ACC_OS_CYGWIN || ACC_OS_WIN32 || ACC_OS_WIN64) && (ACC_HAVE_WINDOWS_H)
|
|
||||||
# if defined(acc_int64l_t)
|
|
||||||
/* See also: KB Q274323: PRB: Performance Counter Value May
|
|
||||||
* Unexpectedly Leap Forward */
|
|
||||||
# define __ACCLIB_UCLOCK_USE_QPC 1
|
|
||||||
# endif
|
|
||||||
/* fallbacks */
|
|
||||||
# if ((ACC_CC_DMC && (__DMC__ < 0x838)) || ACC_CC_LCC)
|
|
||||||
/* winmm.lib is missing */
|
|
||||||
# define __ACCLIB_UCLOCK_USE_CLOCK 1
|
|
||||||
# else
|
|
||||||
# define __ACCLIB_UCLOCK_USE_WINMM 1
|
|
||||||
# if (ACC_CC_MSC && (_MSC_VER >= 900))
|
|
||||||
/* avoid `-W4' warnings in <mmsystem.h> */
|
|
||||||
# pragma warning(disable: 4201)
|
|
||||||
# elif (ACC_CC_MWERKS)
|
|
||||||
/* avoid duplicate typedef in <mmsystem.h> */
|
|
||||||
# define LPUINT __ACC_MMSYSTEM_H_LPUINT
|
|
||||||
# endif
|
|
||||||
# if 1
|
|
||||||
# include <mmsystem.h>
|
|
||||||
# else
|
|
||||||
# if (ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_PELLESC)
|
|
||||||
ACC_EXTERN_C __declspec(dllimport) unsigned long __stdcall timeGetTime(void);
|
|
||||||
# else
|
|
||||||
ACC_EXTERN_C unsigned long __stdcall timeGetTime(void);
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if (ACC_CC_DMC)
|
|
||||||
# pragma DMC includelib "winmm.lib"
|
|
||||||
# elif (ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_PELLESC)
|
|
||||||
# pragma comment(lib, "winmm.lib")
|
|
||||||
# elif (ACC_CC_MWERKS && (__MWERKS__ >= 0x3000))
|
|
||||||
# pragma comment(lib, "winmm.lib")
|
|
||||||
# elif (ACC_CC_SYMANTECC)
|
|
||||||
# pragma SC includelib "winmm.lib"
|
|
||||||
# elif (ACC_CC_WATCOMC && (__WATCOMC__ >= 1050))
|
|
||||||
# pragma library("winmm.lib")
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_EMX) && (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
# define __ACCLIB_UCLOCK_USE_QPC 1
|
|
||||||
#elif (ACC_OS_CYGWIN || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_TOS || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# define __ACCLIB_UCLOCK_USE_CLOCK 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACCLIB_UCLOCK_USE_CLOCK) && !defined(CLOCKS_PER_SEC)
|
|
||||||
# if defined(CLK_TCK)
|
|
||||||
# define CLOCKS_PER_SEC CLK_TCK
|
|
||||||
# else
|
|
||||||
# undef __ACCLIB_UCLOCK_USE_CLOCK
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_uclock_open) (acc_uclock_handle_p h)
|
|
||||||
{
|
|
||||||
acc_uclock_t c;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#if (__ACCLIB_UCLOCK_USE_QPC)
|
|
||||||
LARGE_INTEGER li;
|
|
||||||
h->qpf = 0.0;
|
|
||||||
if (QueryPerformanceFrequency(&li) != 0) {
|
|
||||||
h->qpf = (double) li.QuadPart;
|
|
||||||
if (h->qpf <= 0.0 || QueryPerformanceCounter(&li) == 0) {
|
|
||||||
h->qpf = 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
h->qpf = 0.0;
|
|
||||||
#endif
|
|
||||||
h->h = 1;
|
|
||||||
h->mode = 0;
|
|
||||||
|
|
||||||
/* warm up */
|
|
||||||
i = 100;
|
|
||||||
do {
|
|
||||||
acc_uclock_read(h, &c);
|
|
||||||
#if (__ACCLIB_UCLOCK_USE_QPC)
|
|
||||||
if (h->qpf > 0.0 && c.qpc == 0) { h->qpf = 0.0; i = 100; }
|
|
||||||
#endif
|
|
||||||
} while (--i > 0);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_uclock_close) (acc_uclock_handle_p h)
|
|
||||||
{
|
|
||||||
h->h = 0;
|
|
||||||
h->mode = -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_uclock_read) (acc_uclock_handle_p h, acc_uclock_p c)
|
|
||||||
{
|
|
||||||
#if (__ACCLIB_UCLOCK_USE_QPC)
|
|
||||||
if (h->qpf > 0.0) {
|
|
||||||
LARGE_INTEGER li;
|
|
||||||
if (QueryPerformanceCounter(&li) != 0) {
|
|
||||||
c->qpc = (acc_int64l_t) li.QuadPart;
|
|
||||||
if (c->qpc > 0)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
c->qpc = 0; /* failed */
|
|
||||||
}
|
|
||||||
#elif (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
/* c->qpc = 0; */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
# if (ACC_CC_AZTECC)
|
|
||||||
c->ticks.t32 = 0;
|
|
||||||
# else
|
|
||||||
union REGS ri, ro;
|
|
||||||
ri.x.ax = 0x2c00; int86(0x21, &ri, &ro);
|
|
||||||
c->ticks.t32 = ro.h.ch*60UL*60UL*100UL + ro.h.cl*60UL*100UL + ro.h.dh*100UL + ro.h.dl;
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
c->ticks.t64 = uclock();
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_CLOCK) && defined(acc_int64l_t)
|
|
||||||
c->ticks.t64 = clock();
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_CLOCK)
|
|
||||||
c->ticks.t32 = clock();
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_WINMM)
|
|
||||||
c->ticks.t32 = timeGetTime();
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_GETRUSAGE)
|
|
||||||
struct rusage ru;
|
|
||||||
if (getrusage(RUSAGE_SELF, &ru) != 0) c->ticks.rd = 0;
|
|
||||||
else c->ticks.td = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1000000.0;
|
|
||||||
#elif (HAVE_GETTIMEOFDAY)
|
|
||||||
struct timeval tv;
|
|
||||||
if (gettimeofday(&tv, 0) != 0) c->ticks.td = 0;
|
|
||||||
else c->ticks.td = tv.tv_sec + tv.tv_usec / 1000000.0;
|
|
||||||
#else
|
|
||||||
ACC_UNUSED(c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
ACC_UNUSED(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(double, acc_uclock_get_elapsed) (acc_uclock_handle_p h, const acc_uclock_p start, const acc_uclock_p stop)
|
|
||||||
{
|
|
||||||
double d;
|
|
||||||
|
|
||||||
if (!h->h) {
|
|
||||||
h->mode = -1;
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (__ACCLIB_UCLOCK_USE_QPC)
|
|
||||||
if (h->qpf > 0.0) {
|
|
||||||
h->mode = 1;
|
|
||||||
if (start->qpc == 0 || stop->qpc == 0) return 0.0;
|
|
||||||
return (double) (stop->qpc - start->qpc) / h->qpf;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
h->mode = 2;
|
|
||||||
d = (double) (stop->ticks.t32 - start->ticks.t32) / 100.0;
|
|
||||||
if (d < 0.0) d += 86400.0; /* midnight passed */
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
h->mode = 3;
|
|
||||||
d = (double) (stop->ticks.t64 - start->ticks.t64) / (UCLOCKS_PER_SEC);
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_CLOCK) && defined(acc_int64l_t)
|
|
||||||
h->mode = 4;
|
|
||||||
d = (double) (stop->ticks.t64 - start->ticks.t64) / (CLOCKS_PER_SEC);
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_CLOCK)
|
|
||||||
h->mode = 5;
|
|
||||||
d = (double) (stop->ticks.t32 - start->ticks.t32) / (CLOCKS_PER_SEC);
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_WINMM)
|
|
||||||
h->mode = 6;
|
|
||||||
d = (double) (stop->ticks.t32 - start->ticks.t32) / 1000.0;
|
|
||||||
#elif (__ACCLIB_UCLOCK_USE_GETRUSAGE)
|
|
||||||
h->mode = 7;
|
|
||||||
d = stop->ticks.td - start->ticks.td;
|
|
||||||
#elif (HAVE_GETTIMEOFDAY)
|
|
||||||
h->mode = 8;
|
|
||||||
d = stop->ticks.td - start->ticks.td;
|
|
||||||
#else
|
|
||||||
h->mode = 0;
|
|
||||||
d = 0.0;
|
|
||||||
#endif
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_WILDARGV_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS216 || ACC_OS_WIN16)
|
|
||||||
#if 0 && (ACC_CC_MSC)
|
|
||||||
|
|
||||||
/* FIXME */
|
|
||||||
ACC_EXTERN_C int __acc_cdecl __setargv(void);
|
|
||||||
ACC_EXTERN_C int __acc_cdecl _setargv(void);
|
|
||||||
ACC_EXTERN_C int __acc_cdecl _setargv(void) { return __setargv(); }
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
#if (ACC_CC_INTELC || ACC_CC_MSC)
|
|
||||||
|
|
||||||
ACC_EXTERN_C int __acc_cdecl __setargv(void);
|
|
||||||
ACC_EXTERN_C int __acc_cdecl _setargv(void);
|
|
||||||
ACC_EXTERN_C int __acc_cdecl _setargv(void) { return __setargv(); }
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_EMX)
|
|
||||||
|
|
||||||
#define __ACCLIB_HAVE_ACC_WILDARGV 1
|
|
||||||
ACCLIB_PUBLIC(void, acc_wildargv) (int* argc, char*** argv)
|
|
||||||
{
|
|
||||||
_response(argc, argv);
|
|
||||||
_wildcard(argc, argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__ACCLIB_HAVE_ACC_WILDARGV)
|
|
||||||
#define __ACCLIB_HAVE_ACC_WILDARGV 1
|
|
||||||
ACCLIB_PUBLIC(void, acc_wildargv) (int* argc, char*** argv)
|
|
||||||
{
|
|
||||||
ACC_UNUSED(argc); ACC_UNUSED(argv);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
+439
-210
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -34,132 +34,147 @@
|
|||||||
// core
|
// core
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
inline unsigned get_be16(const void *bb)
|
inline unsigned get_be16(const void *p)
|
||||||
{
|
{
|
||||||
const unsigned char* b = (const unsigned char*) bb;
|
#if defined(ACC_UA_GET_BE16)
|
||||||
unsigned v;
|
return ACC_UA_GET_BE16(p);
|
||||||
v = (unsigned) b[1] << 0;
|
|
||||||
v |= (unsigned) b[0] << 8;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void set_be16(void *bb, unsigned v)
|
|
||||||
{
|
|
||||||
unsigned char* b = (unsigned char*) bb;
|
|
||||||
b[1] = (unsigned char) (v >> 0);
|
|
||||||
b[0] = (unsigned char) (v >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline unsigned get_be24(const void *bb)
|
|
||||||
{
|
|
||||||
const unsigned char* b = (const unsigned char*) bb;
|
|
||||||
unsigned v;
|
|
||||||
v = (unsigned) b[2] << 0;
|
|
||||||
v |= (unsigned) b[1] << 8;
|
|
||||||
v |= (unsigned) b[0] << 16;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void set_be24(void *bb, unsigned v)
|
|
||||||
{
|
|
||||||
unsigned char* b = (unsigned char*) bb;
|
|
||||||
b[2] = (unsigned char) (v >> 0);
|
|
||||||
b[1] = (unsigned char) (v >> 8);
|
|
||||||
b[0] = (unsigned char) (v >> 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline unsigned get_be32(const void *bb)
|
|
||||||
{
|
|
||||||
const unsigned char* b = (const unsigned char*) bb;
|
|
||||||
unsigned v;
|
|
||||||
v = (unsigned) b[3] << 0;
|
|
||||||
v |= (unsigned) b[2] << 8;
|
|
||||||
v |= (unsigned) b[1] << 16;
|
|
||||||
v |= (unsigned) b[0] << 24;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void set_be32(void *bb, unsigned v)
|
|
||||||
{
|
|
||||||
unsigned char* b = (unsigned char*) bb;
|
|
||||||
b[3] = (unsigned char) (v >> 0);
|
|
||||||
b[2] = (unsigned char) (v >> 8);
|
|
||||||
b[1] = (unsigned char) (v >> 16);
|
|
||||||
b[0] = (unsigned char) (v >> 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline unsigned get_le16(const void *bb)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
return * (const unsigned short *) bb;
|
|
||||||
#else
|
#else
|
||||||
const unsigned char* b = (const unsigned char*) bb;
|
return acc_ua_get_be16(p);
|
||||||
unsigned v;
|
|
||||||
v = (unsigned) b[0] << 0;
|
|
||||||
v |= (unsigned) b[1] << 8;
|
|
||||||
return v;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void set_le16(void *bb, unsigned v)
|
inline void set_be16(void *p, unsigned v)
|
||||||
{
|
{
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
#if defined(ACC_UA_SET_BE16)
|
||||||
(* (unsigned short *) bb) = (unsigned short) (v & 0xffff);
|
ACC_UA_SET_BE16(p, v);
|
||||||
#else
|
#else
|
||||||
unsigned char* b = (unsigned char*) bb;
|
acc_ua_set_be16(p, v);
|
||||||
b[0] = (unsigned char) (v >> 0);
|
|
||||||
b[1] = (unsigned char) (v >> 8);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline unsigned get_be24(const void *p)
|
||||||
inline unsigned get_le24(const void *bb)
|
|
||||||
{
|
{
|
||||||
const unsigned char* b = (const unsigned char*) bb;
|
#if defined(ACC_UA_GET_BE24)
|
||||||
unsigned v;
|
return ACC_UA_GET_BE24(p);
|
||||||
v = (unsigned) b[0] << 0;
|
|
||||||
v |= (unsigned) b[1] << 8;
|
|
||||||
v |= (unsigned) b[2] << 16;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void set_le24(void *bb, unsigned v)
|
|
||||||
{
|
|
||||||
unsigned char* b = (unsigned char*) bb;
|
|
||||||
b[0] = (unsigned char) (v >> 0);
|
|
||||||
b[1] = (unsigned char) (v >> 8);
|
|
||||||
b[2] = (unsigned char) (v >> 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline unsigned get_le32(const void *bb)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
return * (const acc_uint32e_t *) bb;
|
|
||||||
#else
|
#else
|
||||||
const unsigned char* b = (const unsigned char*) bb;
|
return acc_ua_get_be24(p);
|
||||||
unsigned v;
|
|
||||||
v = (unsigned) b[0] << 0;
|
|
||||||
v |= (unsigned) b[1] << 8;
|
|
||||||
v |= (unsigned) b[2] << 16;
|
|
||||||
v |= (unsigned) b[3] << 24;
|
|
||||||
return v;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void set_le32(void *bb, unsigned v)
|
inline void set_be24(void *p, unsigned v)
|
||||||
{
|
{
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
#if defined(ACC_UA_SET_BE24)
|
||||||
(* (acc_uint32e_t *) bb) = v;
|
ACC_UA_SET_BE24(p, v);
|
||||||
#else
|
#else
|
||||||
unsigned char* b = (unsigned char*) bb;
|
acc_ua_set_be24(p, v);
|
||||||
b[0] = (unsigned char) (v >> 0);
|
#endif
|
||||||
b[1] = (unsigned char) (v >> 8);
|
}
|
||||||
b[2] = (unsigned char) (v >> 16);
|
|
||||||
b[3] = (unsigned char) (v >> 24);
|
inline unsigned get_be32(const void *p)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_GET_BE32)
|
||||||
|
return ACC_UA_GET_BE32(p);
|
||||||
|
#else
|
||||||
|
return acc_ua_get_be32(p);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_be32(void *p, unsigned v)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_SET_BE32)
|
||||||
|
ACC_UA_SET_BE32(p, v);
|
||||||
|
#else
|
||||||
|
acc_ua_set_be32(p, v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline acc_uint64l_t get_be64(const void *p)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_GET_BE64)
|
||||||
|
return ACC_UA_GET_BE64(p);
|
||||||
|
#else
|
||||||
|
return acc_ua_get_be64(p);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_be64(void *p, acc_uint64l_t v)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_SET_BE64)
|
||||||
|
ACC_UA_SET_BE64(p, v);
|
||||||
|
#else
|
||||||
|
acc_ua_set_be64(p, v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned get_le16(const void *p)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_GET_LE16)
|
||||||
|
return ACC_UA_GET_LE16(p);
|
||||||
|
#else
|
||||||
|
return acc_ua_get_le16(p);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_le16(void *p, unsigned v)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_SET_LE16)
|
||||||
|
ACC_UA_SET_LE16(p, v);
|
||||||
|
#else
|
||||||
|
acc_ua_set_le16(p, v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned get_le24(const void *p)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_GET_LE24)
|
||||||
|
return ACC_UA_GET_LE24(p);
|
||||||
|
#else
|
||||||
|
return acc_ua_get_le24(p);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_le24(void *p, unsigned v)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_SET_LE24)
|
||||||
|
ACC_UA_SET_LE24(p, v);
|
||||||
|
#else
|
||||||
|
acc_ua_set_le24(p, v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned get_le32(const void *p)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_GET_LE32)
|
||||||
|
return ACC_UA_GET_LE32(p);
|
||||||
|
#else
|
||||||
|
return acc_ua_get_le32(p);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_le32(void *p, unsigned v)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_SET_LE32)
|
||||||
|
ACC_UA_SET_LE32(p, v);
|
||||||
|
#else
|
||||||
|
acc_ua_set_le32(p, v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline acc_uint64l_t get_le64(const void *p)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_GET_LE64)
|
||||||
|
return ACC_UA_GET_LE64(p);
|
||||||
|
#else
|
||||||
|
return acc_ua_get_le64(p);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_le64(void *p, acc_uint64l_t v)
|
||||||
|
{
|
||||||
|
#if defined(ACC_UA_SET_LE64)
|
||||||
|
ACC_UA_SET_LE64(p, v);
|
||||||
|
#else
|
||||||
|
acc_ua_set_le64(p, v);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,243 +183,457 @@ inline void set_le32(void *bb, unsigned v)
|
|||||||
// get signed values, i.e. sign-extend
|
// get signed values, i.e. sign-extend
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
inline int sign_extend(int v, int bits)
|
inline int sign_extend(unsigned v, unsigned bits)
|
||||||
{
|
{
|
||||||
const int sign_bit = 1 << (bits - 1);
|
const unsigned sign_bit = 1u << (bits - 1);
|
||||||
v |= -(v & sign_bit);
|
v &= sign_bit | (sign_bit - 1);
|
||||||
return v;
|
//v = (v ^ sign_bit) - sign_bit;
|
||||||
|
v |= 0 - (v & sign_bit);
|
||||||
|
return (int) v;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int get_be16_signed(const void *bb)
|
inline acc_int64l_t sign_extend(acc_uint64l_t v, unsigned bits)
|
||||||
{
|
{
|
||||||
int v = get_be16(bb);
|
const acc_uint64l_t sign_bit = ACC_UINT64_C(1) << (bits - 1);
|
||||||
|
v &= sign_bit | (sign_bit - 1);
|
||||||
|
//v = (v ^ sign_bit) - sign_bit;
|
||||||
|
v |= 0 - (v & sign_bit);
|
||||||
|
return (acc_int64l_t) v;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int get_be16_signed(const void *p)
|
||||||
|
{
|
||||||
|
unsigned v = get_be16(p);
|
||||||
return sign_extend(v, 16);
|
return sign_extend(v, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int get_be24_signed(const void *bb)
|
inline int get_be24_signed(const void *p)
|
||||||
{
|
{
|
||||||
int v = get_be24(bb);
|
unsigned v = get_be24(p);
|
||||||
return sign_extend(v, 24);
|
return sign_extend(v, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int get_be32_signed(const void *bb)
|
inline int get_be32_signed(const void *p)
|
||||||
{
|
{
|
||||||
int v = get_be32(bb);
|
unsigned v = get_be32(p);
|
||||||
return sign_extend(v, 32);
|
return sign_extend(v, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int get_le16_signed(const void *bb)
|
inline acc_int64l_t get_be64_signed(const void *p)
|
||||||
{
|
{
|
||||||
int v = get_le16(bb);
|
acc_uint64l_t v = get_be64(p);
|
||||||
|
return sign_extend(v, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int get_le16_signed(const void *p)
|
||||||
|
{
|
||||||
|
unsigned v = get_le16(p);
|
||||||
return sign_extend(v, 16);
|
return sign_extend(v, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int get_le24_signed(const void *bb)
|
inline int get_le24_signed(const void *p)
|
||||||
{
|
{
|
||||||
int v = get_le24(bb);
|
unsigned v = get_le24(p);
|
||||||
return sign_extend(v, 24);
|
return sign_extend(v, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int get_le32_signed(const void *bb)
|
inline int get_le32_signed(const void *p)
|
||||||
{
|
{
|
||||||
int v = get_le32(bb);
|
unsigned v = get_le32(p);
|
||||||
return sign_extend(v, 32);
|
return sign_extend(v, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline acc_int64l_t get_le64_signed(const void *p)
|
||||||
|
{
|
||||||
|
acc_uint64l_t v = get_le64(p);
|
||||||
|
return sign_extend(v, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// swab (bswap)
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
inline unsigned acc_swab16(unsigned v)
|
||||||
|
{
|
||||||
|
return ((v & 0x00ff) << 8) |
|
||||||
|
((v & 0xff00) >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned acc_swab32(unsigned v)
|
||||||
|
{
|
||||||
|
return ((v & 0x000000ff) << 24) |
|
||||||
|
((v & 0x0000ff00) << 8) |
|
||||||
|
((v & 0x00ff0000) >> 8) |
|
||||||
|
((v & 0xff000000) >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned acc_swab16p(const acc_uint16e_t *p)
|
||||||
|
{
|
||||||
|
return acc_swab16(*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned acc_swap32p(const acc_uint32e_t *p)
|
||||||
|
{
|
||||||
|
return acc_swab32(*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void acc_swab16s(acc_uint16e_t *p)
|
||||||
|
{
|
||||||
|
*p = acc_swab16(*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void acc_swab32s(acc_uint32e_t *p)
|
||||||
|
{
|
||||||
|
*p = acc_swab32(*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void acc_ua_swab16s(void *p)
|
||||||
|
{
|
||||||
|
set_be16(p, get_le16(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void acc_ua_swab32s(void *p)
|
||||||
|
{
|
||||||
|
set_be32(p, get_le32(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// classes for portable unaligned access
|
// classes for portable unaligned access
|
||||||
|
//
|
||||||
|
// Important: these classes must be PODs (Plain Old Data), i.e. no
|
||||||
|
// constructor, no destructor, no virtual functions and no default
|
||||||
|
// assignment operator, and all fields must be public(!).
|
||||||
|
//
|
||||||
|
// [Actually we _can_ use a safe non-POD subset, but for this we need
|
||||||
|
// to have gcc bug 17519 fixed - see http://gcc.gnu.org/PR17519 ]
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
class BE16
|
struct BE16
|
||||||
{
|
{
|
||||||
unsigned char d[2];
|
unsigned char d[2];
|
||||||
|
|
||||||
public:
|
//inline BE16() { }
|
||||||
BE16() { }
|
//BE16(unsigned v) { set_be16(d, v); }
|
||||||
BE16& operator = (const BE16 &v) {
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
* (acc_uint32e_t *) d = * (const acc_uint32e_t *) v.d;
|
|
||||||
#else
|
|
||||||
memcpy(d, v.d, sizeof(d));
|
|
||||||
#endif
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
BE16& operator = (unsigned v) { set_be16(d, v); return *this; }
|
BE16& operator = (unsigned v) { set_be16(d, v); return *this; }
|
||||||
BE16& operator += (unsigned v) { set_be16(d, get_be16(d) + v); return *this; }
|
BE16& operator += (unsigned v) { set_be16(d, get_be16(d) + v); return *this; }
|
||||||
BE16& operator -= (unsigned v) { set_be16(d, get_be16(d) - v); return *this; }
|
BE16& operator -= (unsigned v) { set_be16(d, get_be16(d) - v); return *this; }
|
||||||
|
BE16& operator *= (unsigned v) { set_be16(d, get_be16(d) * v); return *this; }
|
||||||
|
BE16& operator /= (unsigned v) { set_be16(d, get_be16(d) / v); return *this; }
|
||||||
BE16& operator &= (unsigned v) { set_be16(d, get_be16(d) & v); return *this; }
|
BE16& operator &= (unsigned v) { set_be16(d, get_be16(d) & v); return *this; }
|
||||||
BE16& operator |= (unsigned v) { set_be16(d, get_be16(d) | v); return *this; }
|
BE16& operator |= (unsigned v) { set_be16(d, get_be16(d) | v); return *this; }
|
||||||
|
BE16& operator ^= (unsigned v) { set_be16(d, get_be16(d) ^ v); return *this; }
|
||||||
|
BE16& operator <<= (unsigned v) { set_be16(d, get_be16(d) << v); return *this; }
|
||||||
|
BE16& operator >>= (unsigned v) { set_be16(d, get_be16(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_be16(d); }
|
operator unsigned () const { return get_be16(d); }
|
||||||
}
|
}
|
||||||
__attribute_packed;
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
class BE32
|
struct BE32
|
||||||
{
|
{
|
||||||
unsigned char d[4];
|
unsigned char d[4];
|
||||||
|
|
||||||
public:
|
//inline BE32() { }
|
||||||
BE32() { }
|
//BE32(unsigned v) { set_be32(d, v); }
|
||||||
BE32& operator = (const BE32 &v) {
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
* (unsigned int *) d = * (const unsigned int *) v.d;
|
|
||||||
#else
|
|
||||||
memcpy(d, v.d, sizeof(d));
|
|
||||||
#endif
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
BE32& operator = (unsigned v) { set_be32(d, v); return *this; }
|
BE32& operator = (unsigned v) { set_be32(d, v); return *this; }
|
||||||
BE32& operator += (unsigned v) { set_be32(d, get_be32(d) + v); return *this; }
|
BE32& operator += (unsigned v) { set_be32(d, get_be32(d) + v); return *this; }
|
||||||
BE32& operator -= (unsigned v) { set_be32(d, get_be32(d) - v); return *this; }
|
BE32& operator -= (unsigned v) { set_be32(d, get_be32(d) - v); return *this; }
|
||||||
|
BE32& operator *= (unsigned v) { set_be32(d, get_be32(d) * v); return *this; }
|
||||||
|
BE32& operator /= (unsigned v) { set_be32(d, get_be32(d) / v); return *this; }
|
||||||
BE32& operator &= (unsigned v) { set_be32(d, get_be32(d) & v); return *this; }
|
BE32& operator &= (unsigned v) { set_be32(d, get_be32(d) & v); return *this; }
|
||||||
BE32& operator |= (unsigned v) { set_be32(d, get_be32(d) | v); return *this; }
|
BE32& operator |= (unsigned v) { set_be32(d, get_be32(d) | v); return *this; }
|
||||||
|
BE32& operator ^= (unsigned v) { set_be32(d, get_be32(d) ^ v); return *this; }
|
||||||
|
BE32& operator <<= (unsigned v) { set_be32(d, get_be32(d) << v); return *this; }
|
||||||
|
BE32& operator >>= (unsigned v) { set_be32(d, get_be32(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_be32(d); }
|
operator unsigned () const { return get_be32(d); }
|
||||||
}
|
}
|
||||||
__attribute_packed;
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
class LE16
|
struct BE64
|
||||||
|
{
|
||||||
|
unsigned char d[8];
|
||||||
|
|
||||||
|
//inline BE64() { }
|
||||||
|
//BE64(acc_uint64l_t v) { set_be64(d, v); }
|
||||||
|
|
||||||
|
BE64& operator = (acc_uint64l_t v) { set_be64(d, v); return *this; }
|
||||||
|
BE64& operator += (acc_uint64l_t v) { set_be64(d, get_be64(d) + v); return *this; }
|
||||||
|
BE64& operator -= (acc_uint64l_t v) { set_be64(d, get_be64(d) - v); return *this; }
|
||||||
|
BE64& operator *= (acc_uint64l_t v) { set_be64(d, get_be64(d) * v); return *this; }
|
||||||
|
BE64& operator /= (acc_uint64l_t v) { set_be64(d, get_be64(d) / v); return *this; }
|
||||||
|
BE64& operator &= (acc_uint64l_t v) { set_be64(d, get_be64(d) & v); return *this; }
|
||||||
|
BE64& operator |= (acc_uint64l_t v) { set_be64(d, get_be64(d) | v); return *this; }
|
||||||
|
BE64& operator ^= (acc_uint64l_t v) { set_be64(d, get_be64(d) ^ v); return *this; }
|
||||||
|
BE64& operator <<= (unsigned v) { set_be64(d, get_be64(d) << v); return *this; }
|
||||||
|
BE64& operator >>= (unsigned v) { set_be64(d, get_be64(d) >> v); return *this; }
|
||||||
|
|
||||||
|
operator acc_uint64l_t () const { return get_be64(d); }
|
||||||
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
|
struct LE16
|
||||||
{
|
{
|
||||||
unsigned char d[2];
|
unsigned char d[2];
|
||||||
|
|
||||||
public:
|
//inline LE16() { }
|
||||||
LE16() { }
|
//LE16(unsigned v) { set_le16(d, v); }
|
||||||
LE16& operator = (const LE16 &v) {
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
* (unsigned short *) d = * (const unsigned short *) v.d;
|
|
||||||
#else
|
|
||||||
memcpy(d, v.d, sizeof(d));
|
|
||||||
#endif
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
LE16& operator = (unsigned v) { set_le16(d, v); return *this; }
|
LE16& operator = (unsigned v) { set_le16(d, v); return *this; }
|
||||||
LE16& operator += (unsigned v) { set_le16(d, get_le16(d) + v); return *this; }
|
LE16& operator += (unsigned v) { set_le16(d, get_le16(d) + v); return *this; }
|
||||||
LE16& operator -= (unsigned v) { set_le16(d, get_le16(d) - v); return *this; }
|
LE16& operator -= (unsigned v) { set_le16(d, get_le16(d) - v); return *this; }
|
||||||
|
LE16& operator *= (unsigned v) { set_le16(d, get_le16(d) * v); return *this; }
|
||||||
|
LE16& operator /= (unsigned v) { set_le16(d, get_le16(d) / v); return *this; }
|
||||||
LE16& operator &= (unsigned v) { set_le16(d, get_le16(d) & v); return *this; }
|
LE16& operator &= (unsigned v) { set_le16(d, get_le16(d) & v); return *this; }
|
||||||
LE16& operator |= (unsigned v) { set_le16(d, get_le16(d) | v); return *this; }
|
LE16& operator |= (unsigned v) { set_le16(d, get_le16(d) | v); return *this; }
|
||||||
|
LE16& operator ^= (unsigned v) { set_le16(d, get_le16(d) ^ v); return *this; }
|
||||||
|
LE16& operator <<= (unsigned v) { set_le16(d, get_le16(d) << v); return *this; }
|
||||||
|
LE16& operator >>= (unsigned v) { set_le16(d, get_le16(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_le16(d); }
|
operator unsigned () const { return get_le16(d); }
|
||||||
}
|
}
|
||||||
__attribute_packed;
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
class LE32
|
struct LE32
|
||||||
{
|
{
|
||||||
unsigned char d[4];
|
unsigned char d[4];
|
||||||
|
|
||||||
public:
|
//inline LE32() { }
|
||||||
LE32() { }
|
//LE32(unsigned v) { set_le32(d, v); }
|
||||||
LE32& operator = (const LE32 &v) {
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
* (acc_uint32e_t *) d = * (const acc_uint32e_t *) v.d;
|
|
||||||
#else
|
|
||||||
memcpy(d, v.d, sizeof(d));
|
|
||||||
#endif
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
LE32& operator = (unsigned v) { set_le32(d, v); return *this; }
|
LE32& operator = (unsigned v) { set_le32(d, v); return *this; }
|
||||||
LE32& operator += (unsigned v) { set_le32(d, get_le32(d) + v); return *this; }
|
LE32& operator += (unsigned v) { set_le32(d, get_le32(d) + v); return *this; }
|
||||||
LE32& operator -= (unsigned v) { set_le32(d, get_le32(d) - v); return *this; }
|
LE32& operator -= (unsigned v) { set_le32(d, get_le32(d) - v); return *this; }
|
||||||
|
LE32& operator *= (unsigned v) { set_le32(d, get_le32(d) * v); return *this; }
|
||||||
|
LE32& operator /= (unsigned v) { set_le32(d, get_le32(d) / v); return *this; }
|
||||||
LE32& operator &= (unsigned v) { set_le32(d, get_le32(d) & v); return *this; }
|
LE32& operator &= (unsigned v) { set_le32(d, get_le32(d) & v); return *this; }
|
||||||
LE32& operator |= (unsigned v) { set_le32(d, get_le32(d) | v); return *this; }
|
LE32& operator |= (unsigned v) { set_le32(d, get_le32(d) | v); return *this; }
|
||||||
|
LE32& operator ^= (unsigned v) { set_le32(d, get_le32(d) ^ v); return *this; }
|
||||||
|
LE32& operator <<= (unsigned v) { set_le32(d, get_le32(d) << v); return *this; }
|
||||||
|
LE32& operator >>= (unsigned v) { set_le32(d, get_le32(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_le32(d); }
|
operator unsigned () const { return get_le32(d); }
|
||||||
}
|
}
|
||||||
__attribute_packed;
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
|
struct LE64
|
||||||
|
{
|
||||||
|
unsigned char d[8];
|
||||||
|
|
||||||
|
//inline LE64() { }
|
||||||
|
//LE64(acc_uint64l_t v) { set_le64(d, v); }
|
||||||
|
|
||||||
|
LE64& operator = (acc_uint64l_t v) { set_le64(d, v); return *this; }
|
||||||
|
LE64& operator += (acc_uint64l_t v) { set_le64(d, get_le64(d) + v); return *this; }
|
||||||
|
LE64& operator -= (acc_uint64l_t v) { set_le64(d, get_le64(d) - v); return *this; }
|
||||||
|
LE64& operator *= (acc_uint64l_t v) { set_le64(d, get_le64(d) * v); return *this; }
|
||||||
|
LE64& operator /= (acc_uint64l_t v) { set_le64(d, get_le64(d) / v); return *this; }
|
||||||
|
LE64& operator &= (acc_uint64l_t v) { set_le64(d, get_le64(d) & v); return *this; }
|
||||||
|
LE64& operator |= (acc_uint64l_t v) { set_le64(d, get_le64(d) | v); return *this; }
|
||||||
|
LE64& operator ^= (acc_uint64l_t v) { set_le64(d, get_le64(d) ^ v); return *this; }
|
||||||
|
LE64& operator <<= (unsigned v) { set_le64(d, get_le64(d) << v); return *this; }
|
||||||
|
LE64& operator >>= (unsigned v) { set_le64(d, get_le64(d) >> v); return *this; }
|
||||||
|
|
||||||
|
operator acc_uint64l_t () const { return get_le64(d); }
|
||||||
|
}
|
||||||
|
__attribute_packed;
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// global operators
|
// global operators
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
inline bool operator < (const BE16& v1, const BE16& v2)
|
|
||||||
{
|
|
||||||
return (unsigned)v1 < (unsigned)v2;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator < (const BE32& v1, const BE32& v2)
|
|
||||||
{
|
|
||||||
return (unsigned)v1 < (unsigned)v2;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator < (const LE16& v1, const LE16& v2)
|
|
||||||
{
|
|
||||||
return (unsigned)v1 < (unsigned)v2;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator < (const LE32& v1, const LE32& v2)
|
|
||||||
{
|
|
||||||
return (unsigned)v1 < (unsigned)v2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T* operator + (T* ptr, const BE16& v) { return ptr + (unsigned) v; }
|
inline T* operator + (T* ptr, const BE16& v) { return ptr + (unsigned) v; }
|
||||||
template <class T>
|
template <class T>
|
||||||
|
inline T* operator + (const BE16& v, T* ptr) { return ptr + (unsigned) v; }
|
||||||
|
template <class T>
|
||||||
inline T* operator - (T* ptr, const BE16& v) { return ptr - (unsigned) v; }
|
inline T* operator - (T* ptr, const BE16& v) { return ptr - (unsigned) v; }
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T* operator + (T* ptr, const BE32& v) { return ptr + (unsigned) v; }
|
inline T* operator + (T* ptr, const BE32& v) { return ptr + (unsigned) v; }
|
||||||
template <class T>
|
template <class T>
|
||||||
|
inline T* operator + (const BE32& v, T* ptr) { return ptr + (unsigned) v; }
|
||||||
|
template <class T>
|
||||||
inline T* operator - (T* ptr, const BE32& v) { return ptr - (unsigned) v; }
|
inline T* operator - (T* ptr, const BE32& v) { return ptr - (unsigned) v; }
|
||||||
|
|
||||||
|
// these are not implemented on purpose and will cause link-time errors
|
||||||
|
template <class T> T* operator + (T* ptr, const BE64& v);
|
||||||
|
template <class T> T* operator + (const BE64& v, T* ptr);
|
||||||
|
template <class T> T* operator - (T* ptr, const BE64& v);
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T* operator + (T* ptr, const LE16& v) { return ptr + (unsigned) v; }
|
inline T* operator + (T* ptr, const LE16& v) { return ptr + (unsigned) v; }
|
||||||
template <class T>
|
template <class T>
|
||||||
|
inline T* operator + (const LE16& v, T* ptr) { return ptr + (unsigned) v; }
|
||||||
|
template <class T>
|
||||||
inline T* operator - (T* ptr, const LE16& v) { return ptr - (unsigned) v; }
|
inline T* operator - (T* ptr, const LE16& v) { return ptr - (unsigned) v; }
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T* operator + (T* ptr, const LE32& v) { return ptr + (unsigned) v; }
|
inline T* operator + (T* ptr, const LE32& v) { return ptr + (unsigned) v; }
|
||||||
template <class T>
|
template <class T>
|
||||||
|
inline T* operator + (const LE32& v, T* ptr) { return ptr + (unsigned) v; }
|
||||||
|
template <class T>
|
||||||
inline T* operator - (T* ptr, const LE32& v) { return ptr - (unsigned) v; }
|
inline T* operator - (T* ptr, const LE32& v) { return ptr - (unsigned) v; }
|
||||||
|
|
||||||
|
// these are not implemented on purpose and will cause link-time errors
|
||||||
|
template <class T> T* operator + (T* ptr, const LE64& v);
|
||||||
|
template <class T> T* operator + (const LE64& v, T* ptr);
|
||||||
|
template <class T> T* operator - (T* ptr, const LE64& v);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// global overloads
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if 1 && !defined(ALIGN_DOWN)
|
||||||
|
inline unsigned ALIGN_DOWN(unsigned a, const LE32& b) { return ALIGN_DOWN(a, (unsigned) b); }
|
||||||
|
inline unsigned ALIGN_DOWN(const LE32& a, unsigned b) { return ALIGN_DOWN((unsigned) a, b); }
|
||||||
|
inline unsigned ALIGN_UP (unsigned a, const LE32& b) { return ALIGN_UP (a, (unsigned) b); }
|
||||||
|
inline unsigned ALIGN_UP (const LE32& a, unsigned b) { return ALIGN_UP ((unsigned) a, b); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(UPX_MAX)
|
||||||
|
inline unsigned UPX_MAX(unsigned a, const BE16& b) { return UPX_MAX(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MAX(const BE16& a, unsigned b) { return UPX_MAX((unsigned) a, b); }
|
||||||
|
inline unsigned UPX_MIN(unsigned a, const BE16& b) { return UPX_MIN(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MIN(const BE16& a, unsigned b) { return UPX_MIN((unsigned) a, b); }
|
||||||
|
|
||||||
|
inline unsigned UPX_MAX(unsigned a, const BE32& b) { return UPX_MAX(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MAX(const BE32& a, unsigned b) { return UPX_MAX((unsigned) a, b); }
|
||||||
|
inline unsigned UPX_MIN(unsigned a, const BE32& b) { return UPX_MIN(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MIN(const BE32& a, unsigned b) { return UPX_MIN((unsigned) a, b); }
|
||||||
|
|
||||||
|
inline unsigned UPX_MAX(unsigned a, const LE16& b) { return UPX_MAX(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MAX(const LE16& a, unsigned b) { return UPX_MAX((unsigned) a, b); }
|
||||||
|
inline unsigned UPX_MIN(unsigned a, const LE16& b) { return UPX_MIN(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MIN(const LE16& a, unsigned b) { return UPX_MIN((unsigned) a, b); }
|
||||||
|
|
||||||
|
inline unsigned UPX_MAX(unsigned a, const LE32& b) { return UPX_MAX(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MAX(const LE32& a, unsigned b) { return UPX_MAX((unsigned) a, b); }
|
||||||
|
inline unsigned UPX_MIN(unsigned a, const LE32& b) { return UPX_MIN(a, (unsigned) b); }
|
||||||
|
inline unsigned UPX_MIN(const LE32& a, unsigned b) { return UPX_MIN((unsigned) a, b); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// misc
|
// misc
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
// for use with qsort()
|
// for use with qsort()
|
||||||
int __acc_cdecl_qsort be16_compare(const void *e1, const void *e2);
|
extern "C" {
|
||||||
int __acc_cdecl_qsort be24_compare(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be16_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort be32_compare(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be24_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort le16_compare(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be32_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort le24_compare(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be64_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort le32_compare(const void *e1, const void *e2);
|
int __acc_cdecl_qsort le16_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort be16_compare_signed(const void *e1, const void *e2);
|
int __acc_cdecl_qsort le24_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort be24_compare_signed(const void *e1, const void *e2);
|
int __acc_cdecl_qsort le32_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort be32_compare_signed(const void *e1, const void *e2);
|
int __acc_cdecl_qsort le64_compare(const void *, const void *);
|
||||||
int __acc_cdecl_qsort le16_compare_signed(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be16_compare_signed(const void *, const void *);
|
||||||
int __acc_cdecl_qsort le24_compare_signed(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be24_compare_signed(const void *, const void *);
|
||||||
int __acc_cdecl_qsort le32_compare_signed(const void *e1, const void *e2);
|
int __acc_cdecl_qsort be32_compare_signed(const void *, const void *);
|
||||||
|
int __acc_cdecl_qsort be64_compare_signed(const void *, const void *);
|
||||||
|
int __acc_cdecl_qsort le16_compare_signed(const void *, const void *);
|
||||||
|
int __acc_cdecl_qsort le24_compare_signed(const void *, const void *);
|
||||||
|
int __acc_cdecl_qsort le32_compare_signed(const void *, const void *);
|
||||||
|
int __acc_cdecl_qsort le64_compare_signed(const void *, const void *);
|
||||||
|
} // extern "C"
|
||||||
|
|
||||||
|
|
||||||
// just for testing...
|
// just for testing...
|
||||||
#if 1 && (ACC_ARCH_AMD64 || ACC_ARCH_IA32) && (ACC_CC_GNUC >= 0x030200)
|
#if !defined(ACC_CFG_NO_UNALIGNED)
|
||||||
typedef unsigned short LE16_unaligned __attribute__((__aligned__(1)));
|
#if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386) && (ACC_CC_GNUC >= 0x030200)
|
||||||
|
typedef acc_uint16e_t LE16_unaligned __attribute__((__aligned__(1)));
|
||||||
typedef acc_uint32e_t LE32_unaligned __attribute__((__aligned__(1)));
|
typedef acc_uint32e_t LE32_unaligned __attribute__((__aligned__(1)));
|
||||||
|
# ifndef LE16
|
||||||
# define LE16 LE16_unaligned
|
# define LE16 LE16_unaligned
|
||||||
|
# endif
|
||||||
|
# ifndef LE32
|
||||||
# define LE32 LE32_unaligned
|
# define LE32 LE32_unaligned
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if 0 && (ACC_ARCH_IA32) && (ACC_CC_INTELC)
|
#if 0 && (ACC_ARCH_I386) && (ACC_CC_INTELC)
|
||||||
typedef __declspec(align(1)) unsigned short LE16_unaligned;
|
typedef __declspec(align(1)) acc_uint16e_t LE16_unaligned;
|
||||||
typedef __declspec(align(1)) acc_uint32e_t LE32_unaligned;
|
typedef __declspec(align(1)) acc_uint32e_t LE32_unaligned;
|
||||||
|
# ifndef LE16
|
||||||
# define LE16 LE16_unaligned
|
# define LE16 LE16_unaligned
|
||||||
|
# endif
|
||||||
|
# ifndef LE32
|
||||||
# define LE32 LE32_unaligned
|
# define LE32 LE32_unaligned
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_IA32) && (ACC_CC_MSC) && (_MSC_VER >= 1200)
|
#if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386) && (ACC_CC_MSC) && (_MSC_VER >= 1200)
|
||||||
typedef __declspec(align(1)) unsigned short LE16_unaligned;
|
typedef __declspec(align(1)) acc_uint16e_t LE16_unaligned;
|
||||||
typedef __declspec(align(1)) acc_uint32e_t LE32_unaligned;
|
typedef __declspec(align(1)) acc_uint32e_t LE32_unaligned;
|
||||||
|
# ifndef LE16
|
||||||
# define LE16 LE16_unaligned
|
# define LE16 LE16_unaligned
|
||||||
|
# endif
|
||||||
|
# ifndef LE32
|
||||||
# define LE32 LE32_unaligned
|
# define LE32 LE32_unaligned
|
||||||
|
# endif
|
||||||
# pragma warning(disable: 4244) // Wx: conversion, possible loss of data
|
# pragma warning(disable: 4244) // Wx: conversion, possible loss of data
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// Provide namespaces and classes to abtract endianness policies.
|
||||||
|
//
|
||||||
|
// CTP - Compile-Time Polymorphism (templates)
|
||||||
|
// RTP - Run-Time Polymorphism (virtual functions)
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
// forward declarations
|
||||||
|
namespace N_BELE_CTP {
|
||||||
|
class BEPolicy; class LEPolicy;
|
||||||
|
extern const BEPolicy be_policy;
|
||||||
|
extern const LEPolicy le_policy;
|
||||||
|
}
|
||||||
|
namespace N_BELE_RTP {
|
||||||
|
class AbstractPolicy;
|
||||||
|
class BEPolicy; class LEPolicy;
|
||||||
|
extern const BEPolicy be_policy;
|
||||||
|
extern const LEPolicy le_policy;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace N_BELE_CTP {
|
||||||
|
#define BELE_CTP 1
|
||||||
|
#include "bele_policy.h"
|
||||||
|
#undef BELE_CTP
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace N_BELE_RTP {
|
||||||
|
#define BELE_RTP 1
|
||||||
|
#include "bele_policy.h"
|
||||||
|
#undef BELE_RTP
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace N_BELE_CTP {
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline const N_BELE_RTP::AbstractPolicy* getRTP();
|
||||||
|
template <>
|
||||||
|
inline const N_BELE_RTP::AbstractPolicy* getRTP<BEPolicy>()
|
||||||
|
{ return &N_BELE_RTP::be_policy; }
|
||||||
|
template <>
|
||||||
|
inline const N_BELE_RTP::AbstractPolicy* getRTP<LEPolicy>()
|
||||||
|
{ return &N_BELE_RTP::le_policy; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|||||||
@@ -0,0 +1,283 @@
|
|||||||
|
/* bele_policy.h -- access memory in BigEndian and LittleEndian byte order
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __UPX_BELE_H
|
||||||
|
# error "this is an internal include file"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if defined(BELE_CTP)
|
||||||
|
// CTP - Compile-Time Polymorphism (templates)
|
||||||
|
# define V static inline
|
||||||
|
# define S static int __acc_cdecl_qsort
|
||||||
|
# define C
|
||||||
|
#elif defined(BELE_RTP)
|
||||||
|
// RTP - Run-Time Polymorphism (virtual functions)
|
||||||
|
# define V virtual
|
||||||
|
# define S virtual int
|
||||||
|
# define C const
|
||||||
|
#else
|
||||||
|
# error
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(BELE_RTP)
|
||||||
|
struct AbstractPolicy
|
||||||
|
{
|
||||||
|
inline AbstractPolicy() { }
|
||||||
|
virtual inline ~AbstractPolicy() { }
|
||||||
|
V bool isBE() C = 0;
|
||||||
|
V bool isLE() C = 0;
|
||||||
|
|
||||||
|
V unsigned get16(const void *p) C = 0;
|
||||||
|
V unsigned get24(const void *p) C = 0;
|
||||||
|
V unsigned get32(const void *p) C = 0;
|
||||||
|
V acc_uint64l_t get64(const void *p) C = 0;
|
||||||
|
|
||||||
|
V void set16(void *p, unsigned v) C = 0;
|
||||||
|
V void set24(void *p, unsigned v) C = 0;
|
||||||
|
V void set32(void *p, unsigned v) C = 0;
|
||||||
|
V void set64(void *p, acc_uint64l_t v) C = 0;
|
||||||
|
|
||||||
|
V unsigned get16_signed(const void *p) C = 0;
|
||||||
|
V unsigned get24_signed(const void *p) C = 0;
|
||||||
|
V unsigned get32_signed(const void *p) C = 0;
|
||||||
|
V acc_uint64l_t get64_signed(const void *p) C = 0;
|
||||||
|
|
||||||
|
S u16_compare(const void *a, const void *b) C = 0;
|
||||||
|
S u24_compare(const void *a, const void *b) C = 0;
|
||||||
|
S u32_compare(const void *a, const void *b) C = 0;
|
||||||
|
S u64_compare(const void *a, const void *b) C = 0;
|
||||||
|
|
||||||
|
S u16_compare_signed(const void *a, const void *b) C = 0;
|
||||||
|
S u24_compare_signed(const void *a, const void *b) C = 0;
|
||||||
|
S u32_compare_signed(const void *a, const void *b) C = 0;
|
||||||
|
S u64_compare_signed(const void *a, const void *b) C = 0;
|
||||||
|
|
||||||
|
// disable dynamic allocation
|
||||||
|
DISABLE_NEW_DELETE
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct BEPolicy
|
||||||
|
#if defined(BELE_RTP)
|
||||||
|
: public AbstractPolicy
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
inline BEPolicy() { }
|
||||||
|
#if defined(BELE_CTP)
|
||||||
|
typedef N_BELE_RTP::BEPolicy RTP_Policy;
|
||||||
|
#elif defined(BELE_RTP)
|
||||||
|
typedef N_BELE_CTP::BEPolicy CTP_Policy;
|
||||||
|
#endif
|
||||||
|
V bool isBE() C { return true; }
|
||||||
|
V bool isLE() C { return false; }
|
||||||
|
|
||||||
|
typedef BE16 U16;
|
||||||
|
typedef BE32 U32;
|
||||||
|
typedef BE64 U64;
|
||||||
|
|
||||||
|
V unsigned get16(const void *p) C
|
||||||
|
{ return get_be16(p); }
|
||||||
|
V unsigned get24(const void *p) C
|
||||||
|
{ return get_be24(p); }
|
||||||
|
V unsigned get32(const void *p) C
|
||||||
|
{ return get_be32(p); }
|
||||||
|
V acc_uint64l_t get64(const void *p) C
|
||||||
|
{ return get_be64(p); }
|
||||||
|
|
||||||
|
V void set16(void *p, unsigned v) C
|
||||||
|
{ set_be16(p, v); }
|
||||||
|
V void set24(void *p, unsigned v) C
|
||||||
|
{ set_be24(p, v); }
|
||||||
|
V void set32(void *p, unsigned v) C
|
||||||
|
{ set_be32(p, v); }
|
||||||
|
V void set64(void *p, acc_uint64l_t v) C
|
||||||
|
{ set_be64(p, v); }
|
||||||
|
|
||||||
|
V unsigned get16_signed(const void *p) C
|
||||||
|
{ return get_be16_signed(p); }
|
||||||
|
V unsigned get24_signed(const void *p) C
|
||||||
|
{ return get_be24_signed(p); }
|
||||||
|
V unsigned get32_signed(const void *p) C
|
||||||
|
{ return get_be32_signed(p); }
|
||||||
|
V acc_uint64l_t get64_signed(const void *p) C
|
||||||
|
{ return get_be64_signed(p); }
|
||||||
|
|
||||||
|
S u16_compare(const void *a, const void *b) C
|
||||||
|
{ return be16_compare(a, b); }
|
||||||
|
S u24_compare(const void *a, const void *b) C
|
||||||
|
{ return be24_compare(a, b); }
|
||||||
|
S u32_compare(const void *a, const void *b) C
|
||||||
|
{ return be32_compare(a, b); }
|
||||||
|
S u64_compare(const void *a, const void *b) C
|
||||||
|
{ return be64_compare(a, b); }
|
||||||
|
|
||||||
|
S u16_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return be16_compare_signed(a, b); }
|
||||||
|
S u24_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return be24_compare_signed(a, b); }
|
||||||
|
S u32_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return be32_compare_signed(a, b); }
|
||||||
|
S u64_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return be64_compare_signed(a, b); }
|
||||||
|
|
||||||
|
static void compileTimeAssertions() {
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U16) == 2)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U32) == 4)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U64) == 8)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(U16)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(U32)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(U64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// disable dynamic allocation
|
||||||
|
DISABLE_NEW_DELETE
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct LEPolicy
|
||||||
|
#if defined(BELE_RTP)
|
||||||
|
: public AbstractPolicy
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
inline LEPolicy() { }
|
||||||
|
#if defined(BELE_CTP)
|
||||||
|
typedef N_BELE_RTP::LEPolicy RTP_Policy;
|
||||||
|
#elif defined(BELE_RTP)
|
||||||
|
typedef N_BELE_CTP::LEPolicy CTP_Policy;
|
||||||
|
#endif
|
||||||
|
V bool isBE() C { return false; }
|
||||||
|
V bool isLE() C { return true; }
|
||||||
|
|
||||||
|
typedef LE16 U16;
|
||||||
|
typedef LE32 U32;
|
||||||
|
typedef LE64 U64;
|
||||||
|
|
||||||
|
V unsigned get16(const void *p) C
|
||||||
|
{ return get_le16(p); }
|
||||||
|
V unsigned get24(const void *p) C
|
||||||
|
{ return get_le24(p); }
|
||||||
|
V unsigned get32(const void *p) C
|
||||||
|
{ return get_le32(p); }
|
||||||
|
V acc_uint64l_t get64(const void *p) C
|
||||||
|
{ return get_le64(p); }
|
||||||
|
|
||||||
|
V void set16(void *p, unsigned v) C
|
||||||
|
{ set_le16(p, v); }
|
||||||
|
V void set24(void *p, unsigned v) C
|
||||||
|
{ set_le24(p, v); }
|
||||||
|
V void set32(void *p, unsigned v) C
|
||||||
|
{ set_le32(p, v); }
|
||||||
|
V void set64(void *p, acc_uint64l_t v) C
|
||||||
|
{ set_le64(p, v); }
|
||||||
|
|
||||||
|
V unsigned get16_signed(const void *p) C
|
||||||
|
{ return get_le16_signed(p); }
|
||||||
|
V unsigned get24_signed(const void *p) C
|
||||||
|
{ return get_le24_signed(p); }
|
||||||
|
V unsigned get32_signed(const void *p) C
|
||||||
|
{ return get_le32_signed(p); }
|
||||||
|
V acc_uint64l_t get64_signed(const void *p) C
|
||||||
|
{ return get_le64_signed(p); }
|
||||||
|
|
||||||
|
S u16_compare(const void *a, const void *b) C
|
||||||
|
{ return le16_compare(a, b); }
|
||||||
|
S u24_compare(const void *a, const void *b) C
|
||||||
|
{ return le24_compare(a, b); }
|
||||||
|
S u32_compare(const void *a, const void *b) C
|
||||||
|
{ return le32_compare(a, b); }
|
||||||
|
S u64_compare(const void *a, const void *b) C
|
||||||
|
{ return le64_compare(a, b); }
|
||||||
|
|
||||||
|
S u16_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return le16_compare_signed(a, b); }
|
||||||
|
S u24_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return le24_compare_signed(a, b); }
|
||||||
|
S u32_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return le32_compare_signed(a, b); }
|
||||||
|
S u64_compare_signed(const void *a, const void *b) C
|
||||||
|
{ return le64_compare_signed(a, b); }
|
||||||
|
|
||||||
|
static void compileTimeAssertions() {
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U16) == 2)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U32) == 4)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U64) == 8)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(U16)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(U32)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(U64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// disable dynamic allocation
|
||||||
|
DISABLE_NEW_DELETE
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if (ACC_ABI_BIG_ENDIAN)
|
||||||
|
typedef BEPolicy HostPolicy;
|
||||||
|
#elif (ACC_ABI_LITTLE_ENDIAN)
|
||||||
|
typedef LEPolicy HostPolicy;
|
||||||
|
#else
|
||||||
|
# error "ACC_ABI_ENDIAN"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 /* UNUSED */
|
||||||
|
struct HostAlignedPolicy
|
||||||
|
{
|
||||||
|
#if defined(BELE_CTP)
|
||||||
|
enum { isBE = HostPolicy::isBE, isLE = HostPolicy::isLE };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef acc_uint16e_t U16;
|
||||||
|
typedef acc_uint32e_t U32;
|
||||||
|
typedef acc_uint64l_t U64;
|
||||||
|
|
||||||
|
static void compileTimeAssertions() {
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U16) == 2)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U32) == 4)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(U64) == 8)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef V
|
||||||
|
#undef S
|
||||||
|
#undef C
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
vi:ts=4:et:nowrap
|
||||||
|
*/
|
||||||
|
|
||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -72,7 +72,7 @@ static void print0(FILE *f, const char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static upx_bool intro(FILE *f)
|
static bool intro(FILE *f)
|
||||||
{
|
{
|
||||||
UNUSED(f);
|
UNUSED(f);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -124,7 +124,7 @@ static int set_fg(FILE *f, int fg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static upx_bool intro(FILE *f)
|
static bool intro(FILE *f)
|
||||||
{
|
{
|
||||||
if (con == me)
|
if (con == me)
|
||||||
init(f,-1,-1);
|
init(f,-1,-1);
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -58,7 +58,7 @@ static void print0(FILE *f, const char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static upx_bool intro(FILE *f)
|
static bool intro(FILE *f)
|
||||||
{
|
{
|
||||||
UNUSED(f);
|
UNUSED(f);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -295,7 +295,7 @@ static void print0(FILE *f, const char *ss)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static upx_bool intro(FILE *f)
|
static bool intro(FILE *f)
|
||||||
{
|
{
|
||||||
UNUSED(f);
|
UNUSED(f);
|
||||||
#if defined(USE_FRAMES)
|
#if defined(USE_FRAMES)
|
||||||
|
|||||||
-242
@@ -1,242 +0,0 @@
|
|||||||
/* compress.ch --
|
|
||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
|
||||||
and/or modify them under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of
|
|
||||||
the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; see the file COPYING.
|
|
||||||
If not, write to the Free Software Foundation, Inc.,
|
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(upx_adler32)
|
|
||||||
unsigned upx_adler32(const void *buf, unsigned len, unsigned adler)
|
|
||||||
{
|
|
||||||
if (len == 0)
|
|
||||||
return adler;
|
|
||||||
assert(buf != NULL);
|
|
||||||
return ucl_adler32(adler, (const ucl_bytep)buf, len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(upx_crc32)
|
|
||||||
unsigned upx_crc32(const void *buf, unsigned len, unsigned crc)
|
|
||||||
{
|
|
||||||
if (len == 0)
|
|
||||||
return crc;
|
|
||||||
assert(buf != NULL);
|
|
||||||
return ucl_crc32(crc, (const ucl_bytep)buf, len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(upx_compress)
|
|
||||||
|
|
||||||
int upx_compress ( const upx_bytep src, upx_uint src_len,
|
|
||||||
upx_bytep dst, upx_uintp dst_len,
|
|
||||||
upx_progress_callback_t *cb,
|
|
||||||
int method, int level,
|
|
||||||
const struct upx_compress_config_t *conf_parm,
|
|
||||||
upx_uintp result )
|
|
||||||
{
|
|
||||||
struct upx_compress_config_t conf;
|
|
||||||
upx_uint result_buffer[16];
|
|
||||||
int r = UPX_E_ERROR;
|
|
||||||
|
|
||||||
assert(level > 0);
|
|
||||||
memset(&conf, 0xff, sizeof(conf));
|
|
||||||
if (conf_parm)
|
|
||||||
conf = *conf_parm; // struct copy
|
|
||||||
if (!result)
|
|
||||||
result = result_buffer;
|
|
||||||
|
|
||||||
// assume no info available - fill in worst case results
|
|
||||||
//result[0] = 1; // min_offset_found - NOT USED
|
|
||||||
result[1] = src_len - 1; // max_offset_found
|
|
||||||
//result[2] = 2; // min_match_found - NOT USED
|
|
||||||
result[3] = src_len - 1; // max_match_found
|
|
||||||
//result[4] = 1; // min_run_found - NOT USED
|
|
||||||
result[5] = src_len; // max_run_found
|
|
||||||
result[6] = 1; // first_offset_found
|
|
||||||
//result[7] = 999999; // same_match_offsets_found - NOT USED
|
|
||||||
|
|
||||||
// prepare bit-buffer settings
|
|
||||||
conf.bb_endian = 0;
|
|
||||||
conf.bb_size = 0;
|
|
||||||
if (method >= M_NRV2B_LE32 && method <= M_NRV2E_LE16)
|
|
||||||
{
|
|
||||||
int n = (method - M_NRV2B_LE32) % 3;
|
|
||||||
if (n == 0)
|
|
||||||
conf.bb_size = 32;
|
|
||||||
else if (n == 1)
|
|
||||||
conf.bb_size = 8;
|
|
||||||
else
|
|
||||||
conf.bb_size = 16;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throwInternalError("unknown compression method");
|
|
||||||
|
|
||||||
// optimize compression parms
|
|
||||||
if (level <= 3 && conf.max_offset == UPX_UINT_MAX)
|
|
||||||
conf.max_offset = 8*1024-1;
|
|
||||||
else if (level == 4 && conf.max_offset == UPX_UINT_MAX)
|
|
||||||
conf.max_offset = 32*1024-1;
|
|
||||||
|
|
||||||
if M_IS_NRV2B(method)
|
|
||||||
r = ucl_nrv2b_99_compress(src, src_len, dst, dst_len,
|
|
||||||
cb, level, &conf, result);
|
|
||||||
else if M_IS_NRV2D(method)
|
|
||||||
r = ucl_nrv2d_99_compress(src, src_len, dst, dst_len,
|
|
||||||
cb, level, &conf, result);
|
|
||||||
#if defined(ALG_NRV2E)
|
|
||||||
else if M_IS_NRV2E(method)
|
|
||||||
r = ucl_nrv2e_99_compress(src, src_len, dst, dst_len,
|
|
||||||
cb, level, &conf, result);
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
throwInternalError("unknown compression method");
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* upx_compress */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(upx_decompress)
|
|
||||||
|
|
||||||
int upx_decompress ( const upx_bytep src, upx_uint src_len,
|
|
||||||
upx_bytep dst, upx_uintp dst_len,
|
|
||||||
int method )
|
|
||||||
{
|
|
||||||
int r = UPX_E_ERROR;
|
|
||||||
|
|
||||||
switch (method)
|
|
||||||
{
|
|
||||||
case M_NRV2B_8:
|
|
||||||
r = ucl_nrv2b_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2B_LE16:
|
|
||||||
r = ucl_nrv2b_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2B_LE32:
|
|
||||||
r = ucl_nrv2b_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2D_8:
|
|
||||||
r = ucl_nrv2d_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2D_LE16:
|
|
||||||
r = ucl_nrv2d_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2D_LE32:
|
|
||||||
r = ucl_nrv2d_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
#if defined(ALG_NRV2E)
|
|
||||||
case M_NRV2E_8:
|
|
||||||
r = ucl_nrv2e_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2E_LE16:
|
|
||||||
r = ucl_nrv2e_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2E_LE32:
|
|
||||||
r = ucl_nrv2e_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
throwInternalError("unknown decompression method");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* upx_decompress */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(upx_test_overlap)
|
|
||||||
|
|
||||||
int upx_test_overlap ( const upx_bytep buf, upx_uint src_off,
|
|
||||||
upx_uint src_len, upx_uintp dst_len,
|
|
||||||
int method )
|
|
||||||
{
|
|
||||||
int r = UPX_E_ERROR;
|
|
||||||
|
|
||||||
switch (method)
|
|
||||||
{
|
|
||||||
case M_NRV2B_8:
|
|
||||||
r = ucl_nrv2b_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2B_LE16:
|
|
||||||
r = ucl_nrv2b_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2B_LE32:
|
|
||||||
r = ucl_nrv2b_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2D_8:
|
|
||||||
r = ucl_nrv2d_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2D_LE16:
|
|
||||||
r = ucl_nrv2d_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2D_LE32:
|
|
||||||
r = ucl_nrv2d_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
#if defined(ALG_NRV2E)
|
|
||||||
case M_NRV2E_8:
|
|
||||||
r = ucl_nrv2e_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2E_LE16:
|
|
||||||
r = ucl_nrv2e_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
case M_NRV2E_LE32:
|
|
||||||
r = ucl_nrv2e_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
throwInternalError("unknown decompression method");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* upx_test_overlap */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et:nowrap
|
|
||||||
*/
|
|
||||||
|
|
||||||
+188
-13
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -27,23 +27,198 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
#include "compress.h"
|
||||||
|
#include "mem.h"
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
|
||||||
#if defined(WITH_NRV)
|
/*************************************************************************
|
||||||
# include "compress_nrv.ch"
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
unsigned upx_adler32(const void *buf, unsigned len, unsigned adler)
|
||||||
|
{
|
||||||
|
if (len == 0)
|
||||||
|
return adler;
|
||||||
|
assert(buf != NULL);
|
||||||
|
#if 0
|
||||||
|
return adler32(adler, (const Bytef *) buf, len); // zlib
|
||||||
#elif defined(WITH_UCL)
|
#elif defined(WITH_UCL)
|
||||||
# define upx_adler32 upx_adler32
|
return ucl_adler32(adler, (const ucl_bytep) buf, len);
|
||||||
//# define upx_crc32 upx_crc32
|
|
||||||
# define upx_compress upx_compress
|
|
||||||
# define upx_decompress upx_decompress
|
|
||||||
# if (UPX_VERSION_HEX >= 0x019000)
|
|
||||||
# define ALG_NRV2E
|
|
||||||
# define upx_test_overlap upx_test_overlap
|
|
||||||
# endif
|
|
||||||
# include "compress.ch"
|
|
||||||
#else
|
#else
|
||||||
# error
|
# error
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 /* UNUSED */
|
||||||
|
unsigned upx_crc32(const void *buf, unsigned len, unsigned crc)
|
||||||
|
{
|
||||||
|
if (len == 0)
|
||||||
|
return crc;
|
||||||
|
assert(buf != NULL);
|
||||||
|
#if 0
|
||||||
|
return crc32(crc, (const Bytef *) buf, len); // zlib
|
||||||
|
#elif defined(WITH_UCL)
|
||||||
|
return ucl_crc32(crc, (const ucl_bytep) buf, len);
|
||||||
|
#else
|
||||||
|
# error
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* UNUSED */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf,
|
||||||
|
upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
upx_compress_result_t cresult_buffer;
|
||||||
|
|
||||||
|
assert(method > 0); assert(level > 0);
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// set available bytes in dst
|
||||||
|
if (*dst_len == 0)
|
||||||
|
*dst_len = MemBuffer::getSizeForCompression(src_len);
|
||||||
|
#else
|
||||||
|
// force users to provide *dst_len
|
||||||
|
assert(*dst_len != 0);
|
||||||
|
#endif
|
||||||
|
// for UPX, we always require a reasonably sized outbut buffer
|
||||||
|
assert(*dst_len >= MemBuffer::getSizeForCompression(src_len));
|
||||||
|
|
||||||
|
if (!cresult)
|
||||||
|
cresult = &cresult_buffer;
|
||||||
|
memset(cresult, 0, sizeof(*cresult));
|
||||||
|
#if 1
|
||||||
|
// debug
|
||||||
|
cresult->method = method;
|
||||||
|
cresult->level = level;
|
||||||
|
cresult->u_len = src_len;
|
||||||
|
cresult->c_len = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (0) {
|
||||||
|
}
|
||||||
|
#if defined(WITH_LZMA)
|
||||||
|
else if (M_IS_LZMA(method))
|
||||||
|
r = upx_lzma_compress(src, src_len, dst, dst_len,
|
||||||
|
cb, method, level, cconf, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_NRV)
|
||||||
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
|
r = upx_nrv_compress(src, src_len, dst, dst_len,
|
||||||
|
cb, method, level, cconf, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_UCL)
|
||||||
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
|
r = upx_ucl_compress(src, src_len, dst, dst_len,
|
||||||
|
cb, method, level, cconf, cresult);
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
throwInternalError("unknown compression method");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// debug
|
||||||
|
cresult->c_len = *dst_len;
|
||||||
|
#endif
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
|
||||||
|
assert(*dst_len > 0);
|
||||||
|
assert(src_len < *dst_len); // must be compressed
|
||||||
|
|
||||||
|
if (cresult && cresult->method == 0)
|
||||||
|
cresult = NULL;
|
||||||
|
|
||||||
|
if (0) {
|
||||||
|
}
|
||||||
|
#if defined(WITH_LZMA)
|
||||||
|
else if (M_IS_LZMA(method))
|
||||||
|
r = upx_lzma_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_NRV)
|
||||||
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
|
r = upx_nrv_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_UCL)
|
||||||
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
|
r = upx_ucl_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_ZLIB)
|
||||||
|
else if (M_IS_DEFLATE(method))
|
||||||
|
r = upx_zlib_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
throwInternalError("unknown decompression method");
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
|
||||||
|
if (cresult && cresult->method == 0)
|
||||||
|
cresult = NULL;
|
||||||
|
|
||||||
|
assert(*dst_len > 0);
|
||||||
|
assert(src_len < *dst_len); // must be compressed
|
||||||
|
unsigned overlap_overhead = src_off + src_len - *dst_len;
|
||||||
|
assert((int)overlap_overhead > 0);
|
||||||
|
|
||||||
|
if (0) {
|
||||||
|
}
|
||||||
|
#if defined(WITH_LZMA)
|
||||||
|
else if (M_IS_LZMA(method))
|
||||||
|
r = upx_lzma_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_NRV)
|
||||||
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
|
r = upx_nrv_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_UCL)
|
||||||
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
|
r = upx_ucl_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
throwInternalError("unknown decompression method");
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+126
@@ -0,0 +1,126 @@
|
|||||||
|
/* compress.h --
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __UPX_COMPRESS_H
|
||||||
|
#define __UPX_COMPRESS_H
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if defined(WITH_LZMA)
|
||||||
|
const char *upx_lzma_version_string(void);
|
||||||
|
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf,
|
||||||
|
upx_compress_result_t *cresult );
|
||||||
|
int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
int upx_lzma_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(WITH_NRV)
|
||||||
|
const char *upx_nrv_version_string(void);
|
||||||
|
int upx_nrv_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf,
|
||||||
|
upx_compress_result_t *cresult );
|
||||||
|
int upx_nrv_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
int upx_nrv_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(WITH_UCL)
|
||||||
|
const char *upx_ucl_version_string(void);
|
||||||
|
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf,
|
||||||
|
upx_compress_result_t *cresult );
|
||||||
|
int upx_ucl_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
int upx_ucl_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WITH_ZLIB)
|
||||||
|
const char *upx_zlib_version_string(void);
|
||||||
|
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf,
|
||||||
|
upx_compress_result_t *cresult );
|
||||||
|
int upx_zlib_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
int upx_zlib_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* already included */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
vi:ts=4:et
|
||||||
|
*/
|
||||||
|
|
||||||
@@ -0,0 +1,563 @@
|
|||||||
|
/* compress_lzma.cpp --
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf.h"
|
||||||
|
#include "compress.h"
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
|
||||||
|
void lzma_compress_config_t::reset()
|
||||||
|
{
|
||||||
|
memset(this, 0, sizeof(*this));
|
||||||
|
|
||||||
|
pos_bits.reset();
|
||||||
|
lit_pos_bits.reset();
|
||||||
|
lit_context_bits.reset();
|
||||||
|
dict_size.reset();
|
||||||
|
fast_mode = 2;
|
||||||
|
num_fast_bytes.reset();
|
||||||
|
match_finder_cycles = 0;
|
||||||
|
|
||||||
|
max_num_probs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(WITH_LZMA)
|
||||||
|
extern int compress_lzma_dummy;
|
||||||
|
int compress_lzma_dummy = 0;
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
// INFO: the LZMA SDK is covered by a permissive license which allows
|
||||||
|
// using unmodified LZMA source code in UPX and the UPX stubs.
|
||||||
|
// See SPECIAL EXCEPTION below.
|
||||||
|
//
|
||||||
|
// Quoting from lzma-4.43/lzma.txt:
|
||||||
|
//
|
||||||
|
// LICENSE
|
||||||
|
// -------
|
||||||
|
//
|
||||||
|
// LZMA SDK is available under any of the following licenses:
|
||||||
|
//
|
||||||
|
// 1) GNU Lesser General Public License (GNU LGPL)
|
||||||
|
// 2) Common Public License (CPL)
|
||||||
|
// 3) Simplified license for unmodified code (read SPECIAL EXCEPTION)
|
||||||
|
// 4) Proprietary license
|
||||||
|
//
|
||||||
|
// It means that you can select one of these four options and follow rules
|
||||||
|
// of that license.
|
||||||
|
//
|
||||||
|
// 1,2) GNU LGPL and CPL licenses are pretty similar and both these
|
||||||
|
// licenses are classified as
|
||||||
|
// - "Free software licenses" at http://www.gnu.org/
|
||||||
|
// - "OSI-approved" at http://www.opensource.org/
|
||||||
|
//
|
||||||
|
// 3) SPECIAL EXCEPTION
|
||||||
|
//
|
||||||
|
// Igor Pavlov, as the author of this code, expressly permits you
|
||||||
|
// to statically or dynamically link your code (or bind by name)
|
||||||
|
// to the files from LZMA SDK without subjecting your linked
|
||||||
|
// code to the terms of the CPL or GNU LGPL.
|
||||||
|
// Any modifications or additions to files from LZMA SDK, however,
|
||||||
|
// are subject to the GNU LGPL or CPL terms.
|
||||||
|
//
|
||||||
|
// SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code,
|
||||||
|
// while you keep LZMA SDK code unmodified.
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// cruft because of pseudo-COM layer
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#undef USE_LZMA_PROPERTIES
|
||||||
|
|
||||||
|
#undef MSDOS
|
||||||
|
#undef OS2
|
||||||
|
#undef _WIN32
|
||||||
|
#undef _WIN32_WCE
|
||||||
|
#undef COMPRESS_MF_MT
|
||||||
|
#undef _NO_EXCEPTIONS
|
||||||
|
#if (WITH_LZMA >= 0x449)
|
||||||
|
# define INITGUID 1
|
||||||
|
//# include "CPP/7zip/Compress/LZMA/LZMADecoder.h"
|
||||||
|
# include "CPP/7zip/Compress/LZMA/LZMAEncoder.h"
|
||||||
|
#else
|
||||||
|
# include "C/Common/MyInitGuid.h"
|
||||||
|
//# include "C/7zip/Compress/LZMA/LZMADecoder.h"
|
||||||
|
# include "C/7zip/Compress/LZMA/LZMAEncoder.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace MyLzma {
|
||||||
|
|
||||||
|
struct InStream: public ISequentialInStream, public CMyUnknownImp
|
||||||
|
{
|
||||||
|
MY_UNKNOWN_IMP
|
||||||
|
const Byte *b_buf; size_t b_size; size_t b_pos;
|
||||||
|
void Init(const Byte *data, size_t size) {
|
||||||
|
b_buf = data; b_size = size; b_pos = 0;
|
||||||
|
}
|
||||||
|
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
STDMETHODIMP InStream::Read(void *data, UInt32 size, UInt32 *processedSize)
|
||||||
|
{
|
||||||
|
size_t remain = b_size - b_pos;
|
||||||
|
if (size > remain) size = (UInt32) remain;
|
||||||
|
memcpy(data, b_buf + b_pos, size);
|
||||||
|
b_pos += size;
|
||||||
|
if (processedSize != NULL) *processedSize = size;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OutStream : public ISequentialOutStream, public CMyUnknownImp
|
||||||
|
{
|
||||||
|
MY_UNKNOWN_IMP
|
||||||
|
Byte *b_buf; size_t b_size; size_t b_pos; bool overflow;
|
||||||
|
void Init(Byte *data, size_t size) {
|
||||||
|
b_buf = data; b_size = size; b_pos = 0; overflow = false;
|
||||||
|
}
|
||||||
|
HRESULT WriteByte(Byte c) {
|
||||||
|
if (b_pos >= b_size) { overflow = true; return E_FAIL; }
|
||||||
|
b_buf[b_pos++] = c;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
STDMETHODIMP OutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
|
||||||
|
{
|
||||||
|
size_t remain = b_size - b_pos;
|
||||||
|
if (size > remain) size = (UInt32) remain, overflow = true;
|
||||||
|
memcpy(b_buf + b_pos, data, size);
|
||||||
|
b_pos += size;
|
||||||
|
if (processedSize != NULL) *processedSize = size;
|
||||||
|
return overflow ? E_FAIL : S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProgressInfo : public ICompressProgressInfo, public CMyUnknownImp
|
||||||
|
{
|
||||||
|
MY_UNKNOWN_IMP
|
||||||
|
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
|
||||||
|
upx_callback_p cb;
|
||||||
|
};
|
||||||
|
|
||||||
|
STDMETHODIMP ProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
|
||||||
|
{
|
||||||
|
if (cb && cb->nprogress)
|
||||||
|
cb->nprogress(cb, (unsigned) *inSize, (unsigned) *outSize);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
|
#if (ACC_CC_INTELC) && defined(__linux__)
|
||||||
|
# pragma warning(disable: 424) // #424: extra ";" ignored
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (WITH_LZMA >= 0x449)
|
||||||
|
# include "C/Alloc.c"
|
||||||
|
# include "C/7zCrc.c"
|
||||||
|
# include "C/Compress/Lz/MatchFinder.c"
|
||||||
|
//# include "CPP/7zip/Common/InBuffer.cpp"
|
||||||
|
# include "CPP/7zip/Common/OutBuffer.cpp"
|
||||||
|
# include "CPP/7zip/Common/StreamUtils.cpp"
|
||||||
|
//# include "CPP/7zip/Compress/LZ/LZOutWindow.cpp"
|
||||||
|
//# include "CPP/7zip/Compress/LZMA/LZMADecoder.cpp"
|
||||||
|
# include "CPP/7zip/Compress/LZMA/LZMAEncoder.cpp"
|
||||||
|
# include "CPP/7zip/Compress/RangeCoder/RangeCoderBit.cpp"
|
||||||
|
#else
|
||||||
|
# include "C/Common/Alloc.cpp"
|
||||||
|
# include "C/Common/CRC.cpp"
|
||||||
|
//# include "C/7zip/Common/InBuffer.cpp"
|
||||||
|
# include "C/7zip/Common/OutBuffer.cpp"
|
||||||
|
# include "C/7zip/Common/StreamUtils.cpp"
|
||||||
|
# include "C/7zip/Compress/LZ/LZInWindow.cpp"
|
||||||
|
//# include "C/7zip/Compress/LZ/LZOutWindow.cpp"
|
||||||
|
//# include "C/7zip/Compress/LZMA/LZMADecoder.cpp"
|
||||||
|
# include "C/7zip/Compress/LZMA/LZMAEncoder.cpp"
|
||||||
|
# include "C/7zip/Compress/RangeCoder/RangeCoderBit.cpp"
|
||||||
|
#endif
|
||||||
|
#undef RC_NORMALIZE
|
||||||
|
|
||||||
|
|
||||||
|
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf_parm,
|
||||||
|
upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(M_IS_LZMA(method));
|
||||||
|
assert(level > 0); assert(cresult != NULL);
|
||||||
|
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
HRESULT rh;
|
||||||
|
const lzma_compress_config_t *lcconf = cconf_parm ? &cconf_parm->conf_lzma : NULL;
|
||||||
|
lzma_compress_result_t *res = &cresult->result_lzma;
|
||||||
|
|
||||||
|
MyLzma::InStream is; is.AddRef();
|
||||||
|
MyLzma::OutStream os; os.AddRef();
|
||||||
|
is.Init(src, src_len);
|
||||||
|
os.Init(dst, *dst_len);
|
||||||
|
|
||||||
|
MyLzma::ProgressInfo progress; progress.AddRef();
|
||||||
|
progress.cb = cb;
|
||||||
|
|
||||||
|
NCompress::NLZMA::CEncoder enc;
|
||||||
|
const PROPID propIDs[8] = {
|
||||||
|
NCoderPropID::kPosStateBits, // 0 pb _posStateBits(2)
|
||||||
|
NCoderPropID::kLitPosBits, // 1 lp _numLiteralPosStateBits(0)
|
||||||
|
NCoderPropID::kLitContextBits, // 2 lc _numLiteralContextBits(3)
|
||||||
|
NCoderPropID::kDictionarySize, // 3 ds
|
||||||
|
NCoderPropID::kAlgorithm, // 4 fm _fastmode
|
||||||
|
NCoderPropID::kNumFastBytes, // 5 fb
|
||||||
|
NCoderPropID::kMatchFinderCycles, // 6 mfc _matchFinderCycles, _cutValue
|
||||||
|
NCoderPropID::kMatchFinder // 7 mf
|
||||||
|
};
|
||||||
|
PROPVARIANT pr[8];
|
||||||
|
pr[0].vt = pr[1].vt = pr[2].vt = pr[3].vt = VT_UI4;
|
||||||
|
pr[4].vt = pr[5].vt = pr[6].vt = VT_UI4;
|
||||||
|
unsigned nprops = 7;
|
||||||
|
|
||||||
|
// setup defaults
|
||||||
|
pr[0].uintVal = 2; // 0 .. 4
|
||||||
|
pr[1].uintVal = 0; // 0 .. 4
|
||||||
|
pr[2].uintVal = 3; // 0 .. 8
|
||||||
|
pr[3].uintVal = 4 * 1024 * 1024; // 1 .. 2**30
|
||||||
|
pr[4].uintVal = 2;
|
||||||
|
pr[5].uintVal = 64; // 5 .. 273
|
||||||
|
pr[6].uintVal = 0;
|
||||||
|
#ifdef COMPRESS_MF_BT4
|
||||||
|
static wchar_t matchfinder[] = L"BT4";
|
||||||
|
assert(NCompress::NLZMA::FindMatchFinder(matchfinder) >= 0);
|
||||||
|
pr[nprops].vt = VT_BSTR;
|
||||||
|
pr[nprops].bstrVal = matchfinder;
|
||||||
|
nprops++;
|
||||||
|
#endif
|
||||||
|
#if 1
|
||||||
|
pr[0].uintVal = lzma_compress_config_t::pos_bits_t::default_value_c;
|
||||||
|
pr[1].uintVal = lzma_compress_config_t::lit_pos_bits_t::default_value_c;
|
||||||
|
pr[2].uintVal = lzma_compress_config_t::lit_context_bits_t::default_value_c;
|
||||||
|
pr[3].uintVal = lzma_compress_config_t::dict_size_t::default_value_c;
|
||||||
|
pr[5].uintVal = lzma_compress_config_t::num_fast_bytes_t::default_value_c;
|
||||||
|
#endif
|
||||||
|
// method overrides
|
||||||
|
if (method >= 0x100) {
|
||||||
|
pr[0].uintVal = (method >> 16) & 15;
|
||||||
|
pr[1].uintVal = (method >> 12) & 15;
|
||||||
|
pr[2].uintVal = (method >> 8) & 15;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
// DEBUG - set sizes so that we use a maxmimum amount of stack.
|
||||||
|
// These settings cause res->num_probs == 3147574, i.e. we will
|
||||||
|
// need about 6 MB of stack during runtime decompression.
|
||||||
|
pr[1].uintVal = 4;
|
||||||
|
pr[2].uintVal = 8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// FIXME: tune these settings according to level
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
pr[3].uintVal = 256 * 1024;
|
||||||
|
pr[4].uintVal = 0;
|
||||||
|
pr[5].uintVal = 8;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
pr[3].uintVal = 256 * 1024;
|
||||||
|
pr[4].uintVal = 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
pr[3].uintVal = 8 * 1024 * 1024;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
pr[3].uintVal = src_len;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cconf overrides
|
||||||
|
if (lcconf)
|
||||||
|
{
|
||||||
|
oassign(pr[0].uintVal, lcconf->pos_bits);
|
||||||
|
oassign(pr[1].uintVal, lcconf->lit_pos_bits);
|
||||||
|
oassign(pr[2].uintVal, lcconf->lit_context_bits);
|
||||||
|
oassign(pr[3].uintVal, lcconf->dict_size);
|
||||||
|
oassign(pr[5].uintVal, lcconf->num_fast_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// limit dictionary size
|
||||||
|
if (pr[3].uintVal > src_len)
|
||||||
|
pr[3].uintVal = src_len;
|
||||||
|
|
||||||
|
// limit num_probs
|
||||||
|
if (lcconf && lcconf->max_num_probs)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
unsigned n = 1846 + (768 << (pr[2].uintVal + pr[1].uintVal));
|
||||||
|
if (n <= lcconf->max_num_probs)
|
||||||
|
break;
|
||||||
|
if (pr[1].uintVal > pr[2].uintVal)
|
||||||
|
{
|
||||||
|
if (pr[1].uintVal == 0)
|
||||||
|
goto error;
|
||||||
|
pr[1].uintVal -= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pr[2].uintVal == 0)
|
||||||
|
goto error;
|
||||||
|
pr[2].uintVal -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res->pos_bits = pr[0].uintVal;
|
||||||
|
res->lit_pos_bits = pr[1].uintVal;
|
||||||
|
res->lit_context_bits = pr[2].uintVal;
|
||||||
|
res->dict_size = pr[3].uintVal;
|
||||||
|
res->fast_mode = pr[4].uintVal;
|
||||||
|
res->num_fast_bytes = pr[5].uintVal;
|
||||||
|
res->match_finder_cycles = pr[6].uintVal;
|
||||||
|
//res->num_probs = LzmaGetNumProbs(&s.Properties));
|
||||||
|
//res->num_probs = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
|
||||||
|
res->num_probs = 1846 + (768 << (res->lit_context_bits + res->lit_pos_bits));
|
||||||
|
//printf("\nlzma_compress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs);
|
||||||
|
|
||||||
|
#ifndef _NO_EXCEPTIONS
|
||||||
|
try {
|
||||||
|
#else
|
||||||
|
# error
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (enc.SetCoderProperties(propIDs, pr, nprops) != S_OK)
|
||||||
|
goto error;
|
||||||
|
if (enc.WriteCoderProperties(&os) != S_OK)
|
||||||
|
goto error;
|
||||||
|
if (os.overflow) {
|
||||||
|
//r = UPX_E_OUTPUT_OVERRUN;
|
||||||
|
r = UPX_E_NOT_COMPRESSIBLE;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
assert(os.b_pos == 5);
|
||||||
|
#if defined(USE_LZMA_PROPERTIES)
|
||||||
|
os.b_pos = 1;
|
||||||
|
#else
|
||||||
|
os.b_pos = 0;
|
||||||
|
// extra stuff in first byte: 5 high bits convenience for stub decompressor
|
||||||
|
unsigned t = res->lit_context_bits + res->lit_pos_bits;
|
||||||
|
os.WriteByte((t << 3) | res->pos_bits);
|
||||||
|
os.WriteByte((res->lit_pos_bits << 4) | (res->lit_context_bits));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rh = enc.Code(&is, &os, NULL, NULL, &progress);
|
||||||
|
|
||||||
|
#ifndef _NO_EXCEPTIONS
|
||||||
|
} catch (...) { rh = E_OUTOFMEMORY; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assert(is.b_pos <= src_len);
|
||||||
|
assert(os.b_pos <= *dst_len);
|
||||||
|
if (rh == E_OUTOFMEMORY)
|
||||||
|
r = UPX_E_OUT_OF_MEMORY;
|
||||||
|
else if (os.overflow)
|
||||||
|
{
|
||||||
|
assert(os.b_pos == *dst_len);
|
||||||
|
//r = UPX_E_OUTPUT_OVERRUN;
|
||||||
|
r = UPX_E_NOT_COMPRESSIBLE;
|
||||||
|
}
|
||||||
|
else if (rh == S_OK)
|
||||||
|
{
|
||||||
|
assert(is.b_pos == src_len);
|
||||||
|
r = UPX_E_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
*dst_len = os.b_pos;
|
||||||
|
//printf("\nlzma_compress: %d: %u %u %u %u %u, %u - > %u\n", r, res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs, src_len, *dst_len);
|
||||||
|
//printf("%u %u %u\n", is.__m_RefCount, os.__m_RefCount, progress.__m_RefCount);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// decompress
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#undef _LZMA_IN_CB
|
||||||
|
#undef _LZMA_OUT_READ
|
||||||
|
#undef _LZMA_PROB32
|
||||||
|
#undef _LZMA_LOC_OPT
|
||||||
|
#if (WITH_LZMA >= 0x449)
|
||||||
|
# include "C/Compress/Lzma/LzmaDecode.h"
|
||||||
|
# include "C/Compress/Lzma/LzmaDecode.c"
|
||||||
|
#else
|
||||||
|
# include "C/7zip/Compress/LZMA_C/LzmaDecode.h"
|
||||||
|
# include "C/7zip/Compress/LZMA_C/LzmaDecode.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(M_IS_LZMA(method));
|
||||||
|
// see res->num_probs above
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(CProb) == 2)
|
||||||
|
COMPILE_TIME_ASSERT(LZMA_BASE_SIZE == 1846)
|
||||||
|
COMPILE_TIME_ASSERT(LZMA_LIT_SIZE == 768)
|
||||||
|
|
||||||
|
CLzmaDecoderState s; memset(&s, 0, sizeof(s));
|
||||||
|
SizeT src_out = 0, dst_out = 0;
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
int rh;
|
||||||
|
|
||||||
|
#if defined(USE_LZMA_PROPERTIES)
|
||||||
|
if (src_len < 2)
|
||||||
|
goto error;
|
||||||
|
rh = LzmaDecodeProperties(&s.Properties, src, src_len);
|
||||||
|
if (rh != 0)
|
||||||
|
goto error;
|
||||||
|
src += 1; src_len -= 1;
|
||||||
|
#else
|
||||||
|
if (src_len < 3)
|
||||||
|
goto error;
|
||||||
|
s.Properties.pb = src[0] & 7;
|
||||||
|
s.Properties.lp = (src[1] >> 4);
|
||||||
|
s.Properties.lc = src[1] & 15;
|
||||||
|
if (s.Properties.pb >= 5) goto error;
|
||||||
|
if (s.Properties.lp >= 5) goto error;
|
||||||
|
if (s.Properties.lc >= 9) goto error;
|
||||||
|
// extra
|
||||||
|
if ((src[0] >> 3) != s.Properties.lc + s.Properties.lp) goto error;
|
||||||
|
src += 2; src_len -= 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (cresult)
|
||||||
|
{
|
||||||
|
assert(cresult->method == method);
|
||||||
|
assert(cresult->result_lzma.pos_bits == (unsigned) s.Properties.pb);
|
||||||
|
assert(cresult->result_lzma.lit_pos_bits == (unsigned) s.Properties.lp);
|
||||||
|
assert(cresult->result_lzma.lit_context_bits == (unsigned) s.Properties.lc);
|
||||||
|
assert(cresult->result_lzma.num_probs == (unsigned) LzmaGetNumProbs(&s.Properties));
|
||||||
|
const lzma_compress_result_t *res = &cresult->result_lzma;
|
||||||
|
UNUSED(res);
|
||||||
|
//printf("\nlzma_decompress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs);
|
||||||
|
}
|
||||||
|
s.Probs = (CProb *) malloc(sizeof(CProb) * LzmaGetNumProbs(&s.Properties));
|
||||||
|
if (!s.Probs)
|
||||||
|
{
|
||||||
|
r = UPX_E_OUT_OF_MEMORY;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
rh = LzmaDecode(&s, src, src_len, &src_out, dst, *dst_len, &dst_out);
|
||||||
|
assert(src_out <= src_len);
|
||||||
|
assert(dst_out <= *dst_len);
|
||||||
|
if (rh == 0)
|
||||||
|
{
|
||||||
|
r = UPX_E_OK;
|
||||||
|
if (src_out != src_len)
|
||||||
|
r = UPX_E_INPUT_NOT_CONSUMED;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
*dst_len = dst_out;
|
||||||
|
free(s.Probs);
|
||||||
|
|
||||||
|
UNUSED(cresult);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// test_overlap - see <ucl/ucl.h> for semantics
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_lzma_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(M_IS_LZMA(method));
|
||||||
|
|
||||||
|
MemBuffer b(src_off + src_len);
|
||||||
|
memcpy(b + src_off, buf + src_off, src_len);
|
||||||
|
unsigned saved_dst_len = *dst_len;
|
||||||
|
int r = upx_lzma_decompress(b + src_off, src_len, b, dst_len, method, cresult);
|
||||||
|
if (r != UPX_E_OK)
|
||||||
|
return r;
|
||||||
|
if (*dst_len != saved_dst_len)
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
// NOTE: there is a very tiny possibility that decompression has
|
||||||
|
// succeeded but the data is not restored correctly because of
|
||||||
|
// in-place buffer overlapping.
|
||||||
|
if (tbuf != NULL && memcmp(tbuf, b, *dst_len) != 0)
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
return UPX_E_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// misc
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
const char *upx_lzma_version_string(void)
|
||||||
|
{
|
||||||
|
#if (WITH_LZMA == 0x449)
|
||||||
|
return "4.49";
|
||||||
|
#elif (WITH_LZMA == 0x443)
|
||||||
|
return "4.43";
|
||||||
|
#else
|
||||||
|
# error "unknown version"
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* WITH_LZMA */
|
||||||
|
/*
|
||||||
|
vi:ts=4:et:nowrap
|
||||||
|
*/
|
||||||
|
|
||||||
@@ -0,0 +1,294 @@
|
|||||||
|
/* compress_ucl.cpp --
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf.h"
|
||||||
|
#include "compress.h"
|
||||||
|
#if !defined(WITH_UCL)
|
||||||
|
extern int compress_ucl_dummy;
|
||||||
|
int compress_ucl_dummy = 0;
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if 1 && !defined(UCL_USE_ASM) && (ACC_ARCH_I386)
|
||||||
|
# if (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_WATCOMC)
|
||||||
|
# define UCL_USE_ASM
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if defined(UCL_NO_ASM)
|
||||||
|
# undef UCL_USE_ASM
|
||||||
|
#endif
|
||||||
|
#if defined(ACC_CFG_NO_UNALIGNED)
|
||||||
|
# undef UCL_USE_ASM
|
||||||
|
#endif
|
||||||
|
#if 1 && defined(UCL_USE_ASM)
|
||||||
|
# include <ucl/ucl_asm.h>
|
||||||
|
# define ucl_nrv2b_decompress_safe_8 ucl_nrv2b_decompress_asm_safe_8
|
||||||
|
# define ucl_nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_asm_safe_le16
|
||||||
|
# define ucl_nrv2b_decompress_safe_le32 ucl_nrv2b_decompress_asm_safe_le32
|
||||||
|
# define ucl_nrv2d_decompress_safe_8 ucl_nrv2d_decompress_asm_safe_8
|
||||||
|
# define ucl_nrv2d_decompress_safe_le16 ucl_nrv2d_decompress_asm_safe_le16
|
||||||
|
# define ucl_nrv2d_decompress_safe_le32 ucl_nrv2d_decompress_asm_safe_le32
|
||||||
|
# define ucl_nrv2e_decompress_safe_8 ucl_nrv2e_decompress_asm_safe_8
|
||||||
|
# define ucl_nrv2e_decompress_safe_le16 ucl_nrv2e_decompress_asm_safe_le16
|
||||||
|
# define ucl_nrv2e_decompress_safe_le32 ucl_nrv2e_decompress_asm_safe_le32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
static int convert_errno_from_ucl(int r)
|
||||||
|
{
|
||||||
|
switch (r)
|
||||||
|
{
|
||||||
|
case UCL_E_OK: return UPX_E_OK;
|
||||||
|
case UCL_E_ERROR: return UPX_E_ERROR;
|
||||||
|
case UCL_E_OUT_OF_MEMORY: return UPX_E_OUT_OF_MEMORY;
|
||||||
|
case UCL_E_NOT_COMPRESSIBLE: return UPX_E_NOT_COMPRESSIBLE;
|
||||||
|
case UCL_E_INPUT_OVERRUN: return UPX_E_INPUT_OVERRUN;
|
||||||
|
case UCL_E_OUTPUT_OVERRUN: return UPX_E_OUTPUT_OVERRUN;
|
||||||
|
case UCL_E_LOOKBEHIND_OVERRUN: return UPX_E_LOOKBEHIND_OVERRUN;
|
||||||
|
case UCL_E_EOF_NOT_FOUND: return UPX_E_EOF_NOT_FOUND;
|
||||||
|
case UCL_E_INPUT_NOT_CONSUMED: return UPX_E_INPUT_NOT_CONSUMED;
|
||||||
|
// case UCL_E_NOT_YET_IMPLEMENTED: return UPX_E_NOT_YET_IMPLEMENTED;
|
||||||
|
case UCL_E_INVALID_ARGUMENT: return UPX_E_INVALID_ARGUMENT;
|
||||||
|
// UCL extra:
|
||||||
|
case UCL_E_OVERLAP_OVERRUN: return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
static void wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user)
|
||||||
|
{
|
||||||
|
if (state != -1 && state != 3) return;
|
||||||
|
upx_callback_p cb = (upx_callback_p) user;
|
||||||
|
if (cb && cb->nprogress)
|
||||||
|
cb->nprogress(cb, a, b);
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb_parm,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf_parm,
|
||||||
|
upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
assert(level > 0); assert(cresult != NULL);
|
||||||
|
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(ucl_compress_config_t) == sizeof(REAL_ucl_compress_config_t))
|
||||||
|
|
||||||
|
ucl_progress_callback_t cb;
|
||||||
|
cb.callback = 0;
|
||||||
|
cb.user = NULL;
|
||||||
|
if (cb_parm && cb_parm->nprogress) {
|
||||||
|
cb.callback = wrap_nprogress_ucl;
|
||||||
|
cb.user = cb_parm;
|
||||||
|
}
|
||||||
|
|
||||||
|
ucl_compress_config_t cconf; cconf.reset();
|
||||||
|
if (cconf_parm)
|
||||||
|
cconf = cconf_parm->conf_ucl; // struct copy
|
||||||
|
|
||||||
|
ucl_uint *res = cresult->result_ucl.result;
|
||||||
|
// assume no info available - fill in worst case results
|
||||||
|
//res[0] = 1; // min_offset_found - NOT USED
|
||||||
|
res[1] = src_len - 1; // max_offset_found
|
||||||
|
//res[2] = 2; // min_match_found - NOT USED
|
||||||
|
res[3] = src_len - 1; // max_match_found
|
||||||
|
//res[4] = 1; // min_run_found - NOT USED
|
||||||
|
res[5] = src_len; // max_run_found
|
||||||
|
res[6] = 1; // first_offset_found
|
||||||
|
//res[7] = 999999; // same_match_offsets_found - NOT USED
|
||||||
|
|
||||||
|
// prepare bit-buffer settings
|
||||||
|
cconf.bb_endian = 0;
|
||||||
|
cconf.bb_size = 0;
|
||||||
|
if (method >= M_NRV2B_LE32 && method <= M_NRV2E_LE16)
|
||||||
|
{
|
||||||
|
static const unsigned char sizes[3] = {32, 8, 16};
|
||||||
|
cconf.bb_size = sizes[(method - M_NRV2B_LE32) % 3];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throwInternalError("unknown compression method");
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// optimize compression parms
|
||||||
|
if (level <= 3 && cconf.max_offset == UCL_UINT_MAX)
|
||||||
|
cconf.max_offset = 8*1024-1;
|
||||||
|
else if (level == 4 && cconf.max_offset == UCL_UINT_MAX)
|
||||||
|
cconf.max_offset = 32*1024-1;
|
||||||
|
|
||||||
|
if M_IS_NRV2B(method)
|
||||||
|
r = ucl_nrv2b_99_compress(src, src_len, dst, dst_len,
|
||||||
|
&cb, level, &cconf, res);
|
||||||
|
else if M_IS_NRV2D(method)
|
||||||
|
r = ucl_nrv2d_99_compress(src, src_len, dst, dst_len,
|
||||||
|
&cb, level, &cconf, res);
|
||||||
|
else if M_IS_NRV2E(method)
|
||||||
|
r = ucl_nrv2e_99_compress(src, src_len, dst, dst_len,
|
||||||
|
&cb, level, &cconf, res);
|
||||||
|
else {
|
||||||
|
throwInternalError("unknown compression method");
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure first_offset_found is set
|
||||||
|
if (res[6] == 0)
|
||||||
|
res[6] = 1;
|
||||||
|
|
||||||
|
return convert_errno_from_ucl(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_ucl_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
switch (method)
|
||||||
|
{
|
||||||
|
case M_NRV2B_8:
|
||||||
|
r = ucl_nrv2b_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2B_LE16:
|
||||||
|
r = ucl_nrv2b_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2B_LE32:
|
||||||
|
r = ucl_nrv2b_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_8:
|
||||||
|
r = ucl_nrv2d_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_LE16:
|
||||||
|
r = ucl_nrv2d_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_LE32:
|
||||||
|
r = ucl_nrv2d_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_8:
|
||||||
|
r = ucl_nrv2e_decompress_safe_8(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE16:
|
||||||
|
r = ucl_nrv2e_decompress_safe_le16(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE32:
|
||||||
|
r = ucl_nrv2e_decompress_safe_le32(src,src_len,dst,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throwInternalError("unknown decompression method");
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNUSED(cresult);
|
||||||
|
return convert_errno_from_ucl(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_ucl_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
UNUSED(tbuf); // not needed for UCL
|
||||||
|
|
||||||
|
switch (method)
|
||||||
|
{
|
||||||
|
case M_NRV2B_8:
|
||||||
|
r = ucl_nrv2b_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2B_LE16:
|
||||||
|
r = ucl_nrv2b_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2B_LE32:
|
||||||
|
r = ucl_nrv2b_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_8:
|
||||||
|
r = ucl_nrv2d_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_LE16:
|
||||||
|
r = ucl_nrv2d_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2D_LE32:
|
||||||
|
r = ucl_nrv2d_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_8:
|
||||||
|
r = ucl_nrv2e_test_overlap_8(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE16:
|
||||||
|
r = ucl_nrv2e_test_overlap_le16(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
case M_NRV2E_LE32:
|
||||||
|
r = ucl_nrv2e_test_overlap_le32(buf,src_off,src_len,dst_len,NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throwInternalError("unknown decompression method");
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNUSED(cresult);
|
||||||
|
return convert_errno_from_ucl(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// misc
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
const char *upx_ucl_version_string(void)
|
||||||
|
{
|
||||||
|
return ucl_version_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* WITH_UCL */
|
||||||
|
/*
|
||||||
|
vi:ts=4:et:nowrap
|
||||||
|
*/
|
||||||
|
|
||||||
@@ -0,0 +1,235 @@
|
|||||||
|
/* compress_zlib.cpp --
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf.h"
|
||||||
|
#include "compress.h"
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
|
||||||
|
void zlib_compress_config_t::reset()
|
||||||
|
{
|
||||||
|
memset(this, 0, sizeof(*this));
|
||||||
|
|
||||||
|
mem_level.reset();
|
||||||
|
window_bits.reset();
|
||||||
|
strategy.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(WITH_ZLIB)
|
||||||
|
extern int compress_zlib_dummy;
|
||||||
|
int compress_zlib_dummy = 0;
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
static int convert_errno_from_zlib(int zr)
|
||||||
|
{
|
||||||
|
switch (zr)
|
||||||
|
{
|
||||||
|
case Z_OK: return UPX_E_OK;
|
||||||
|
case Z_DATA_ERROR: return UPX_E_ERROR;
|
||||||
|
case Z_NEED_DICT: return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb_parm,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf_parm,
|
||||||
|
upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(method == M_DEFLATE);
|
||||||
|
assert(level > 0); assert(cresult != NULL);
|
||||||
|
UNUSED(cb_parm);
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
int zr;
|
||||||
|
const zlib_compress_config_t *lcconf = cconf_parm ? &cconf_parm->conf_zlib : NULL;
|
||||||
|
zlib_compress_result_t *res = &cresult->result_zlib;
|
||||||
|
|
||||||
|
if (level == 10)
|
||||||
|
level = 9;
|
||||||
|
|
||||||
|
zlib_compress_config_t::mem_level_t mem_level;
|
||||||
|
zlib_compress_config_t::window_bits_t window_bits;
|
||||||
|
zlib_compress_config_t::strategy_t strategy;
|
||||||
|
// cconf overrides
|
||||||
|
if (lcconf)
|
||||||
|
{
|
||||||
|
oassign(mem_level, lcconf->mem_level);
|
||||||
|
oassign(window_bits, lcconf->window_bits);
|
||||||
|
oassign(strategy, lcconf->strategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
res->dummy = 0;
|
||||||
|
|
||||||
|
z_stream s;
|
||||||
|
s.zalloc = (alloc_func) 0;
|
||||||
|
s.zfree = (free_func) 0;
|
||||||
|
s.next_in = const_cast<upx_bytep>(src); // UNCONST
|
||||||
|
s.avail_in = src_len;
|
||||||
|
s.next_out = dst;
|
||||||
|
s.avail_out = *dst_len;
|
||||||
|
s.total_in = s.total_out = 0;
|
||||||
|
|
||||||
|
zr = deflateInit2(&s, level, Z_DEFLATED, 0 - (int)window_bits,
|
||||||
|
mem_level, strategy);
|
||||||
|
if (zr != Z_OK)
|
||||||
|
goto error;
|
||||||
|
zr = deflate(&s, Z_FINISH);
|
||||||
|
if (zr != Z_STREAM_END)
|
||||||
|
goto error;
|
||||||
|
zr = deflateEnd(&s);
|
||||||
|
if (zr != Z_OK)
|
||||||
|
goto error;
|
||||||
|
r = UPX_E_OK;
|
||||||
|
goto done;
|
||||||
|
error:
|
||||||
|
(void) deflateEnd(&s);
|
||||||
|
r = convert_errno_from_zlib(zr);
|
||||||
|
if (r == UPX_E_OK)
|
||||||
|
r = UPX_E_ERROR;
|
||||||
|
done:
|
||||||
|
if (r == UPX_E_OK)
|
||||||
|
{
|
||||||
|
if (s.avail_in != 0 || s.total_in != src_len)
|
||||||
|
r = UPX_E_ERROR;
|
||||||
|
}
|
||||||
|
assert(s.total_in <= src_len);
|
||||||
|
assert(s.total_out <= *dst_len);
|
||||||
|
*dst_len = s.total_out;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_zlib_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(method == M_DEFLATE);
|
||||||
|
UNUSED(method);
|
||||||
|
UNUSED(cresult);
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
int zr;
|
||||||
|
|
||||||
|
z_stream s;
|
||||||
|
s.zalloc = (alloc_func) 0;
|
||||||
|
s.zfree = (free_func) 0;
|
||||||
|
s.next_in = const_cast<upx_bytep>(src); // UNCONST
|
||||||
|
s.avail_in = src_len;
|
||||||
|
s.next_out = dst;
|
||||||
|
s.avail_out = *dst_len;
|
||||||
|
s.total_in = s.total_out = 0;
|
||||||
|
|
||||||
|
zr = inflateInit2(&s, -15);
|
||||||
|
if (zr != Z_OK)
|
||||||
|
goto error;
|
||||||
|
zr = inflate(&s, Z_FINISH);
|
||||||
|
if (zr != Z_STREAM_END)
|
||||||
|
goto error;
|
||||||
|
zr = inflateEnd(&s);
|
||||||
|
if (zr != Z_OK)
|
||||||
|
goto error;
|
||||||
|
r = UPX_E_OK;
|
||||||
|
goto done;
|
||||||
|
error:
|
||||||
|
(void) inflateEnd(&s);
|
||||||
|
r = convert_errno_from_zlib(zr);
|
||||||
|
if (r == UPX_E_OK)
|
||||||
|
r = UPX_E_ERROR;
|
||||||
|
done:
|
||||||
|
if (r == UPX_E_OK)
|
||||||
|
{
|
||||||
|
if (s.avail_in != 0 || s.total_in != src_len)
|
||||||
|
r = UPX_E_INPUT_NOT_CONSUMED;
|
||||||
|
}
|
||||||
|
assert(s.total_in <= src_len);
|
||||||
|
assert(s.total_out <= *dst_len);
|
||||||
|
*dst_len = s.total_out;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// test_overlap - see <ucl/ucl.h> for semantics
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
int upx_zlib_test_overlap ( const upx_bytep buf,
|
||||||
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(method == M_DEFLATE);
|
||||||
|
|
||||||
|
MemBuffer b(src_off + src_len);
|
||||||
|
memcpy(b + src_off, buf + src_off, src_len);
|
||||||
|
unsigned saved_dst_len = *dst_len;
|
||||||
|
int r = upx_zlib_decompress(b + src_off, src_len, b, dst_len, method, cresult);
|
||||||
|
if (r != UPX_E_OK)
|
||||||
|
return r;
|
||||||
|
if (*dst_len != saved_dst_len)
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
// NOTE: there is a very tiny possibility that decompression has
|
||||||
|
// succeeded but the data is not restored correctly because of
|
||||||
|
// in-place buffer overlapping.
|
||||||
|
if (tbuf != NULL && memcmp(tbuf, b, *dst_len) != 0)
|
||||||
|
return UPX_E_ERROR;
|
||||||
|
return UPX_E_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// misc
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
const char *upx_zlib_version_string(void)
|
||||||
|
{
|
||||||
|
return zlibVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* WITH_ZLIB */
|
||||||
|
/*
|
||||||
|
vi:ts=4:et:nowrap
|
||||||
|
*/
|
||||||
|
|
||||||
+380
-134
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -36,12 +36,20 @@
|
|||||||
// ACC
|
// ACC
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "acc/acc.h"
|
#include "miniacc.h"
|
||||||
#if ((ACC_OS_WIN32 || ACC_OS_WIN64) && ACC_CC_MWERKS) && defined(__MSL__)
|
#if ((ACC_OS_WIN32 || ACC_OS_WIN64) && ACC_CC_MWERKS) && defined(__MSL__)
|
||||||
# undef HAVE_UTIME_H /* this pulls in <windows.h> */
|
# undef HAVE_UTIME_H /* this pulls in <windows.h> */
|
||||||
#endif
|
#endif
|
||||||
|
// FIXME - quick hack for arm-wince-gcc-3.4 (Debian pocketpc-*.deb packages)
|
||||||
|
#if 1 && (ACC_ARCH_ARM) && defined(__pe__) && !defined(_WIN32)
|
||||||
|
# undef HAVE_CHMOD
|
||||||
|
# undef HAVE_CHOWN
|
||||||
|
# undef HAVE_LSTAT
|
||||||
|
# undef HAVE_UTIME
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// pragmas
|
||||||
#if (ACC_CC_BORLANDC)
|
#if (ACC_CC_BORLANDC)
|
||||||
# if (__BORLANDC__ < 0x0500)
|
# if (__BORLANDC__ < 0x0500)
|
||||||
# error "need Borland C++ 5.0 or newer"
|
# error "need Borland C++ 5.0 or newer"
|
||||||
@@ -96,6 +104,8 @@
|
|||||||
# if (_MSC_VER >= 1400)
|
# if (_MSC_VER >= 1400)
|
||||||
# pragma warning(disable: 4996) // W1: 'function': was declared deprecated
|
# pragma warning(disable: 4996) // W1: 'function': was declared deprecated
|
||||||
# endif
|
# endif
|
||||||
|
#elif (ACC_CC_SUNPROC)
|
||||||
|
//# pragma error_messages(off,"badargtype2w") // FIXME
|
||||||
#elif (ACC_CC_WATCOMC)
|
#elif (ACC_CC_WATCOMC)
|
||||||
# if (__WATCOMC__ < 1100)
|
# if (__WATCOMC__ < 1100)
|
||||||
# error "need Watcom C++ 11.0c or newer"
|
# error "need Watcom C++ 11.0c or newer"
|
||||||
@@ -106,9 +116,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "acc/acc_incd.h"
|
#define ACC_WANT_ACC_INCD_H 1
|
||||||
#include "acc/acc_ince.h"
|
#define ACC_WANT_ACC_INCE_H 1
|
||||||
#include "acc/acc_lib.h"
|
#define ACC_WANT_ACC_LIB_H 1
|
||||||
|
#define ACC_WANT_ACC_CXX_H 1
|
||||||
|
#include "miniacc.h"
|
||||||
#if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
#if (ACC_OS_CYGWIN || ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_EMX || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
||||||
# if defined(INVALID_HANDLE_VALUE) || defined(MAKEWORD) || defined(RT_CURSOR)
|
# if defined(INVALID_HANDLE_VALUE) || defined(MAKEWORD) || defined(RT_CURSOR)
|
||||||
# error "something pulled in <windows.h>"
|
# error "something pulled in <windows.h>"
|
||||||
@@ -142,35 +154,30 @@
|
|||||||
# undef __unix
|
# undef __unix
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined(WITH_UCL)
|
#if !defined(WITH_UCL)
|
||||||
# error "please set UCLDIR in the Makefile"
|
# define WITH_UCL 1
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if 0 && !defined(WITH_LZMA)
|
||||||
# include <ucl/uclconf.h>
|
# define WITH_LZMA 1
|
||||||
# include <ucl/ucl.h>
|
#endif
|
||||||
# if !defined(UCL_VERSION) || (UCL_VERSION < 0x010200L)
|
#if defined(UPX_OFFICIAL_BUILD)
|
||||||
# error "please upgrade your UCL installation"
|
# if !defined(WITH_LZMA) || !defined(WITH_NRV) || !defined(WITH_UCL)
|
||||||
# endif
|
# error
|
||||||
# if !defined(UPX_UINT_MAX)
|
|
||||||
# define UPX_UINT_MAX UCL_UINT_MAX
|
|
||||||
# define upx_uint ucl_uint
|
|
||||||
# define upx_voidp ucl_voidp
|
|
||||||
# define upx_uintp ucl_uintp
|
|
||||||
# define upx_byte ucl_byte
|
|
||||||
# define upx_bytep ucl_bytep
|
|
||||||
# define upx_bool ucl_bool
|
|
||||||
# define upx_compress_config_t ucl_compress_config_t
|
|
||||||
# define upx_progress_callback_t ucl_progress_callback_t
|
|
||||||
# define UPX_E_OK UCL_E_OK
|
|
||||||
# define UPX_E_ERROR UCL_E_ERROR
|
|
||||||
# define UPX_E_OUT_OF_MEMORY UCL_E_OUT_OF_MEMORY
|
|
||||||
# define __UPX_CDECL __UCL_CDECL
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if defined(WITH_NRV)
|
||||||
# include <nrv/nrvconf.h>
|
# include <nrv/nrvconf.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WITH_UCL)
|
||||||
|
# define ucl_compress_config_t REAL_ucl_compress_config_t
|
||||||
|
# include <ucl/uclconf.h>
|
||||||
|
# include <ucl/ucl.h>
|
||||||
|
# if !defined(UCL_VERSION) || (UCL_VERSION < 0x010300L)
|
||||||
|
# error "please upgrade your UCL installation"
|
||||||
|
# endif
|
||||||
|
# undef ucl_compress_config_t
|
||||||
|
# undef ucl_compress_config_p
|
||||||
|
#endif
|
||||||
#if !defined(__UPX_CHECKER)
|
#if !defined(__UPX_CHECKER)
|
||||||
# if defined(__UCL_CHECKER) || defined(__NRV_CHECKER)
|
# if defined(__UCL_CHECKER) || defined(__NRV_CHECKER)
|
||||||
# define __UPX_CHECKER
|
# define __UPX_CHECKER
|
||||||
@@ -180,6 +187,9 @@
|
|||||||
# error "UINT_MAX"
|
# error "UINT_MAX"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define upx_byte unsigned char
|
||||||
|
#define upx_bytep upx_byte *
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// system includes
|
// system includes
|
||||||
@@ -188,18 +198,6 @@
|
|||||||
// malloc debuggers
|
// malloc debuggers
|
||||||
#if defined(WITH_VALGRIND)
|
#if defined(WITH_VALGRIND)
|
||||||
# include <valgrind/memcheck.h>
|
# include <valgrind/memcheck.h>
|
||||||
#elif defined(WITH_DMALLOC)
|
|
||||||
# define DMALLOC_FUNC_CHECK
|
|
||||||
# include <dmalloc.h>
|
|
||||||
#elif defined(WITH_GC)
|
|
||||||
# define GC_DEBUG
|
|
||||||
# include <gc/gc.h>
|
|
||||||
# undef malloc
|
|
||||||
# undef realloc
|
|
||||||
# undef free
|
|
||||||
# define malloc GC_MALLOC
|
|
||||||
# define realloc GC_REALLOC
|
|
||||||
# define free GC_FREE
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(VALGRIND_MAKE_WRITABLE)
|
#if !defined(VALGRIND_MAKE_WRITABLE)
|
||||||
@@ -217,6 +215,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// unconditionally turn on assertions
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@@ -285,21 +284,13 @@
|
|||||||
|
|
||||||
|
|
||||||
// avoid warnings about shadowing global functions
|
// avoid warnings about shadowing global functions
|
||||||
|
#undef index
|
||||||
#define basename upx_basename
|
#define basename upx_basename
|
||||||
#define index upx_index
|
#define index upx_index
|
||||||
#define outp upx_outp
|
#define outp upx_outp
|
||||||
|
|
||||||
|
#undef PAGE_MASK
|
||||||
#undef __attribute_packed
|
#undef PAGE_SIZE
|
||||||
#if (ACC_CC_GNUC || ACC_CC_INTELC)
|
|
||||||
# if (1 && (ACC_ARCH_IA32))
|
|
||||||
# define __attribute_packed
|
|
||||||
# else
|
|
||||||
# define __attribute_packed __attribute__((__packed__,__aligned__(1)))
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __attribute_packed
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(O_BINARY)
|
#if !defined(O_BINARY)
|
||||||
# define O_BINARY 0
|
# define O_BINARY 0
|
||||||
@@ -310,6 +301,19 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef __attribute_packed
|
||||||
|
#if (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE)
|
||||||
|
# if (ACC_ARCH_I386) && (ACC_CC_INTELC && (__INTEL_COMPILER < 800))
|
||||||
|
# elif (0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386))
|
||||||
|
# else
|
||||||
|
# define __attribute_packed __attribute__((__packed__,__aligned__(1)))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined(__attribute_packed)
|
||||||
|
# define __attribute_packed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -317,68 +321,52 @@
|
|||||||
#define UNUSED(var) ACC_UNUSED(var)
|
#define UNUSED(var) ACC_UNUSED(var)
|
||||||
#define COMPILE_TIME_ASSERT(e) ACC_COMPILE_TIME_ASSERT(e)
|
#define COMPILE_TIME_ASSERT(e) ACC_COMPILE_TIME_ASSERT(e)
|
||||||
|
|
||||||
#if 1
|
#define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
|
||||||
# define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
|
|
||||||
typedef a acc_tmp_a_t; typedef b acc_tmp_b_t; \
|
typedef a acc_tmp_a_t; typedef b acc_tmp_b_t; \
|
||||||
struct acc_tmp_t { acc_tmp_b_t x; acc_tmp_a_t y; acc_tmp_b_t z[7]; }; \
|
struct acc_tmp_t { acc_tmp_b_t x; acc_tmp_a_t y; acc_tmp_b_t z; } __attribute_packed; \
|
||||||
COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 8*sizeof(b)+sizeof(a)) \
|
COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 2*sizeof(b)+sizeof(a)) \
|
||||||
}
|
}
|
||||||
#else
|
#if defined(__acc_alignof)
|
||||||
# define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
|
# define __COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
|
||||||
struct acc_tmp_t { b x; a y; b z[7]; }; \
|
|
||||||
COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 8*sizeof(b)+sizeof(a)) \
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(acc_alignof)
|
|
||||||
# define COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
|
|
||||||
__COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) \
|
__COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) \
|
||||||
COMPILE_TIME_ASSERT(acc_alignof(a) == sizeof(b))
|
COMPILE_TIME_ASSERT(__acc_alignof(a) == sizeof(b))
|
||||||
#else
|
#else
|
||||||
# define COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
|
# define __COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
|
||||||
__COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b)
|
__COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b)
|
||||||
#endif
|
#endif
|
||||||
|
#define COMPILE_TIME_ASSERT_ALIGNED1(a) __COMPILE_TIME_ASSERT_ALIGNOF(a,char)
|
||||||
|
|
||||||
#define TABLESIZE(table) ((sizeof(table)/sizeof((table)[0])))
|
#define TABLESIZE(table) ((sizeof(table)/sizeof((table)[0])))
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
#define ALIGN_DOWN(a,b) (((a) / (b)) * (b))
|
#define ALIGN_DOWN(a,b) (((a) / (b)) * (b))
|
||||||
#define ALIGN_UP(a,b) ALIGN_DOWN((a) + ((b) - 1), b)
|
#define ALIGN_UP(a,b) ALIGN_DOWN((a) + ((b) - 1), b)
|
||||||
#define ALIGN_GAP(a,b) (ALIGN_UP(a,b) - (a))
|
#define ALIGN_GAP(a,b) (ALIGN_UP(a,b) - (a))
|
||||||
|
#elif 1
|
||||||
|
template <class T>
|
||||||
|
inline T ALIGN_DOWN(const T& a, const T& b) { T r; r = (a / b) * b; return r; }
|
||||||
|
template <class T>
|
||||||
|
inline T ALIGN_UP (const T& a, const T& b) { T r; r = ((a + b - 1) / b) * b; return r; }
|
||||||
|
template <class T>
|
||||||
|
inline T ALIGN_GAP (const T& a, const T& b) { T r; r = ALIGN_UP(a, b) - a; return r; }
|
||||||
|
#else
|
||||||
|
inline unsigned ALIGN_DOWN(unsigned a, unsigned b) { return (a / b) * b; }
|
||||||
|
inline unsigned ALIGN_UP (unsigned a, unsigned b) { return ((a + b - 1) / b) * b; }
|
||||||
|
inline unsigned ALIGN_GAP (unsigned a, unsigned b) { return ALIGN_UP(a, b) - a; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
#define UPX_MAX(a,b) ((a) >= (b) ? (a) : (b))
|
#define UPX_MAX(a,b) ((a) >= (b) ? (a) : (b))
|
||||||
#define UPX_MIN(a,b) ((a) <= (b) ? (a) : (b))
|
#define UPX_MIN(a,b) ((a) <= (b) ? (a) : (b))
|
||||||
#define UPX_MAX3(a,b,c) ((a) >= (b) ? UPX_MAX(a,c) : UPX_MAX(b,c))
|
#elif 1
|
||||||
#define UPX_MIN3(a,b,c) ((a) <= (b) ? UPX_MIN(a,c) : UPX_MIN(b,c))
|
template <class T>
|
||||||
|
inline const T& UPX_MAX(const T& a, const T& b) { if (a < b) return b; return a; }
|
||||||
|
template <class T>
|
||||||
#if 0 && defined(__cplusplus) && !defined(new) && !defined(delete)
|
inline const T& UPX_MIN(const T& a, const T& b) { if (a < b) return a; return b; }
|
||||||
// global operators - debug
|
#else
|
||||||
inline void *operator new(size_t l)
|
inline unsigned UPX_MAX(unsigned a, unsigned b) { return a < b ? b : a; }
|
||||||
{
|
inline unsigned UPX_MIN(unsigned a, unsigned b) { return a < b ? a : b; }
|
||||||
void *p = malloc(l);
|
|
||||||
printf("new %6ld %p\n",(long)l,p);
|
|
||||||
fflush(stdout);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
inline void *operator new[](size_t l)
|
|
||||||
{
|
|
||||||
void *p = malloc(l);
|
|
||||||
printf("new[] %6ld %p\n",(long)l,p);
|
|
||||||
fflush(stdout);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
inline void operator delete(void *p)
|
|
||||||
{
|
|
||||||
printf("delete %p\n",p);
|
|
||||||
fflush(stdout);
|
|
||||||
if (p) free(p);
|
|
||||||
}
|
|
||||||
inline void operator delete[](void *p)
|
|
||||||
{
|
|
||||||
printf("delete[] %p\n",p);
|
|
||||||
fflush(stdout);
|
|
||||||
if (p) free(p);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -391,6 +379,14 @@ inline void operator delete[](void *p)
|
|||||||
|
|
||||||
#define ByteArray(var, size) Array(unsigned char, var, size)
|
#define ByteArray(var, size) Array(unsigned char, var, size)
|
||||||
|
|
||||||
|
struct nocopy
|
||||||
|
{
|
||||||
|
inline nocopy() {}
|
||||||
|
private:
|
||||||
|
nocopy(const nocopy &); // undefined
|
||||||
|
nocopy& operator=(const nocopy &); // undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// constants
|
// constants
|
||||||
@@ -410,20 +406,23 @@ inline void operator delete[](void *p)
|
|||||||
#define EXIT_INTERNAL 1
|
#define EXIT_INTERNAL 1
|
||||||
|
|
||||||
|
|
||||||
// compression methods - DO NOT CHANGE
|
// magic constants for patching
|
||||||
#define M_NRV2B_LE32 2
|
#define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */
|
||||||
#define M_NRV2B_8 3
|
#define UPX_MAGIC2_LE32 0xD5D0D8A1
|
||||||
#define M_NRV2B_LE16 4
|
|
||||||
#define M_NRV2D_LE32 5
|
|
||||||
#define M_NRV2D_8 6
|
|
||||||
#define M_NRV2D_LE16 7
|
|
||||||
#define M_NRV2E_LE32 8
|
|
||||||
#define M_NRV2E_8 9
|
|
||||||
#define M_NRV2E_LE16 10
|
|
||||||
|
|
||||||
#define M_IS_NRV2B(x) ((x) >= M_NRV2B_LE32 && (x) <= M_NRV2B_LE16)
|
|
||||||
#define M_IS_NRV2D(x) ((x) >= M_NRV2D_LE32 && (x) <= M_NRV2D_LE16)
|
// upx_compress() error codes
|
||||||
#define M_IS_NRV2E(x) ((x) >= M_NRV2E_LE32 && (x) <= M_NRV2E_LE16)
|
#define UPX_E_OK (0)
|
||||||
|
#define UPX_E_ERROR (-1)
|
||||||
|
#define UPX_E_OUT_OF_MEMORY (-2)
|
||||||
|
#define UPX_E_NOT_COMPRESSIBLE (-3)
|
||||||
|
#define UPX_E_INPUT_OVERRUN (-4)
|
||||||
|
#define UPX_E_OUTPUT_OVERRUN (-5)
|
||||||
|
#define UPX_E_LOOKBEHIND_OVERRUN (-6)
|
||||||
|
#define UPX_E_EOF_NOT_FOUND (-7)
|
||||||
|
#define UPX_E_INPUT_NOT_CONSUMED (-8)
|
||||||
|
#define UPX_E_NOT_YET_IMPLEMENTED (-9)
|
||||||
|
#define UPX_E_INVALID_ARGUMENT (-10)
|
||||||
|
|
||||||
|
|
||||||
// Executable formats. Note: big endian types are >= 128.
|
// Executable formats. Note: big endian types are >= 128.
|
||||||
@@ -446,12 +445,251 @@ inline void operator delete[](void *p)
|
|||||||
#define UPX_F_ELKS_8086 17
|
#define UPX_F_ELKS_8086 17
|
||||||
#define UPX_F_PS1_EXE 18
|
#define UPX_F_PS1_EXE 18
|
||||||
#define UPX_F_VMLINUX_i386 19
|
#define UPX_F_VMLINUX_i386 19
|
||||||
|
#define UPX_F_LINUX_ELFI_i386 20
|
||||||
|
#define UPX_F_WINCE_ARM_PE 21
|
||||||
|
#define UPX_F_LINUX_ELF64_AMD 22
|
||||||
|
#define UPX_F_LINUX_ELF32_ARMEL 23
|
||||||
|
#define UPX_F_BSD_i386 24
|
||||||
|
#define UPX_F_BSD_ELF_i386 25
|
||||||
|
#define UPX_F_BSD_SH_i386 26
|
||||||
|
|
||||||
|
#define UPX_F_VMLINUX_AMD64 27
|
||||||
|
#define UPX_F_VMLINUX_ARMEL 28
|
||||||
|
#define UPX_F_MACH_i386 29
|
||||||
|
#define UPX_F_LINUX_ELF32_MIPSEL 30
|
||||||
|
|
||||||
|
#define UPX_F_PLAIN_TEXT 127
|
||||||
|
|
||||||
#define UPX_F_ATARI_TOS 129
|
#define UPX_F_ATARI_TOS 129
|
||||||
#define UPX_F_SOLARIS_SPARC 130
|
#define UPX_F_SOLARIS_SPARC 130
|
||||||
|
#define UPX_F_MACH_PPC32 131
|
||||||
|
#define UPX_F_LINUX_ELFPPC32 132
|
||||||
|
#define UPX_F_LINUX_ELF32_ARMEB 133
|
||||||
|
#define UPX_F_MACH_FAT 134
|
||||||
|
#define UPX_F_VMLINUX_ARMEB 135
|
||||||
|
#define UPX_F_VMLINUX_PPC32 136
|
||||||
|
|
||||||
|
|
||||||
#define UPX_MAGIC_LE32 0x21585055 /* "UPX!" */
|
// compression methods
|
||||||
#define UPX_MAGIC2_LE32 0xD5D0D8A1
|
#define M_ALL (-1)
|
||||||
|
#define M_END (-2)
|
||||||
|
#define M_NONE (-3)
|
||||||
|
#define M_SKIP (-4)
|
||||||
|
#define M_ULTRA_BRUTE (-5)
|
||||||
|
// compression methods - DO NOT CHANGE
|
||||||
|
#define M_NRV2B_LE32 2
|
||||||
|
#define M_NRV2B_8 3
|
||||||
|
#define M_NRV2B_LE16 4
|
||||||
|
#define M_NRV2D_LE32 5
|
||||||
|
#define M_NRV2D_8 6
|
||||||
|
#define M_NRV2D_LE16 7
|
||||||
|
#define M_NRV2E_LE32 8
|
||||||
|
#define M_NRV2E_8 9
|
||||||
|
#define M_NRV2E_LE16 10
|
||||||
|
//#define M_CL1B_LE32 11
|
||||||
|
//#define M_CL1B_8 12
|
||||||
|
//#define M_CL1B_LE16 13
|
||||||
|
#define M_LZMA 14
|
||||||
|
#define M_DEFLATE 15 /* zlib */
|
||||||
|
|
||||||
|
#define M_IS_NRV2B(x) ((x) >= M_NRV2B_LE32 && (x) <= M_NRV2B_LE16)
|
||||||
|
#define M_IS_NRV2D(x) ((x) >= M_NRV2D_LE32 && (x) <= M_NRV2D_LE16)
|
||||||
|
#define M_IS_NRV2E(x) ((x) >= M_NRV2E_LE32 && (x) <= M_NRV2E_LE16)
|
||||||
|
//#define M_IS_CL1B(x) ((x) >= M_CL1B_LE32 && (x) <= M_CL1B_LE16)
|
||||||
|
#define M_IS_LZMA(x) (((x) & 255) == M_LZMA)
|
||||||
|
#define M_IS_DEFLATE(x) ((x) == M_DEFLATE)
|
||||||
|
|
||||||
|
|
||||||
|
// filters
|
||||||
|
#define FT_END (-1)
|
||||||
|
#define FT_NONE (-2)
|
||||||
|
#define FT_SKIP (-3)
|
||||||
|
#define FT_ULTRA_BRUTE (-4)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// compression - callback_t
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
struct upx_callback_t;
|
||||||
|
#define upx_callback_p upx_callback_t *
|
||||||
|
#if 0
|
||||||
|
typedef void* (__acc_cdecl *upx_alloc_func_t)
|
||||||
|
(upx_callback_p self, unsigned items, unsigned size);
|
||||||
|
typedef void (__acc_cdecl *upx_free_func_t)
|
||||||
|
(upx_callback_p self, void* ptr);
|
||||||
|
#endif
|
||||||
|
typedef void (__acc_cdecl *upx_progress_func_t)
|
||||||
|
(upx_callback_p, unsigned, unsigned);
|
||||||
|
|
||||||
|
struct upx_callback_t
|
||||||
|
{
|
||||||
|
upx_progress_func_t nprogress;
|
||||||
|
void *user;
|
||||||
|
|
||||||
|
void reset() { memset(this, 0, sizeof(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// compression - config_t
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
template <class T, T default_value, T min_value, T max_value>
|
||||||
|
struct OptVar
|
||||||
|
{
|
||||||
|
typedef T Type;
|
||||||
|
static const T default_value_c = default_value;
|
||||||
|
static const T min_value_c = min_value;
|
||||||
|
static const T max_value_c = max_value;
|
||||||
|
|
||||||
|
void assertValue() {
|
||||||
|
// FIXME: this generates annoying warnings "unsigned >= 0 is always true"
|
||||||
|
//assert((v >= min_value) && (v <= max_value));
|
||||||
|
}
|
||||||
|
|
||||||
|
OptVar() : v(default_value), is_set(0) { }
|
||||||
|
OptVar& operator= (const T other) {
|
||||||
|
v = other; is_set += 1;
|
||||||
|
assertValue();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
#error
|
||||||
|
// there is too much implicit magic in this copy operator;
|
||||||
|
// better introduce an explicit "oassign" function.
|
||||||
|
OptVar& operator= (const OptVar& other) {
|
||||||
|
if (other.is_set) { v = other.v; is_set += 1; }
|
||||||
|
assertValue(); return *this;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void reset() { v = default_value; is_set = 0; }
|
||||||
|
operator T () const { return v; }
|
||||||
|
|
||||||
|
T v;
|
||||||
|
unsigned is_set;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// optional assignments
|
||||||
|
template <class T> inline void oassign(T& self, const T& other) {
|
||||||
|
if (other.is_set) { self.v = other.v; self.is_set += 1; }
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
template <class V, class T> inline void oassign(V& v, const T& other) {
|
||||||
|
if (other.is_set) { v = other.v; }
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
template <class T> inline void oassign(unsigned& v, const T& other) {
|
||||||
|
if (other.is_set) { v = other.v; }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct lzma_compress_config_t
|
||||||
|
{
|
||||||
|
typedef OptVar<unsigned, 2u, 0u, 4u> pos_bits_t; // pb
|
||||||
|
typedef OptVar<unsigned, 0u, 0u, 4u> lit_pos_bits_t; // lb
|
||||||
|
typedef OptVar<unsigned, 3u, 0u, 8u> lit_context_bits_t; // lc
|
||||||
|
typedef OptVar<unsigned, (1u<<22), 1u, (1u<<30) > dict_size_t;
|
||||||
|
typedef OptVar<unsigned, 64u, 5u, 273u> num_fast_bytes_t;
|
||||||
|
|
||||||
|
pos_bits_t pos_bits; // pb
|
||||||
|
lit_pos_bits_t lit_pos_bits; // lp
|
||||||
|
lit_context_bits_t lit_context_bits; // lc
|
||||||
|
dict_size_t dict_size;
|
||||||
|
unsigned fast_mode;
|
||||||
|
num_fast_bytes_t num_fast_bytes;
|
||||||
|
unsigned match_finder_cycles;
|
||||||
|
|
||||||
|
unsigned max_num_probs;
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct ucl_compress_config_t : public REAL_ucl_compress_config_t
|
||||||
|
{
|
||||||
|
void reset() { memset(this, 0xff, sizeof(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct zlib_compress_config_t
|
||||||
|
{
|
||||||
|
typedef OptVar<unsigned, 8u, 1u, 9u> mem_level_t; // ml
|
||||||
|
typedef OptVar<unsigned, 15u, 9u, 15u> window_bits_t; // wb
|
||||||
|
typedef OptVar<unsigned, 0u, 0u, 4u> strategy_t; // st
|
||||||
|
|
||||||
|
mem_level_t mem_level; // ml
|
||||||
|
window_bits_t window_bits; // wb
|
||||||
|
strategy_t strategy; // st
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct upx_compress_config_t
|
||||||
|
{
|
||||||
|
lzma_compress_config_t conf_lzma;
|
||||||
|
ucl_compress_config_t conf_ucl;
|
||||||
|
zlib_compress_config_t conf_zlib;
|
||||||
|
void reset() { conf_lzma.reset(); conf_ucl.reset(); conf_zlib.reset(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NULL_cconf ((upx_compress_config_t *) NULL)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// compression - result_t
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
struct lzma_compress_result_t
|
||||||
|
{
|
||||||
|
unsigned pos_bits; // pb
|
||||||
|
unsigned lit_pos_bits; // lp
|
||||||
|
unsigned lit_context_bits; // lc
|
||||||
|
unsigned dict_size;
|
||||||
|
unsigned fast_mode;
|
||||||
|
unsigned num_fast_bytes;
|
||||||
|
unsigned match_finder_cycles;
|
||||||
|
unsigned num_probs; // (computed result)
|
||||||
|
|
||||||
|
void reset() { memset(this, 0, sizeof(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct ucl_compress_result_t
|
||||||
|
{
|
||||||
|
ucl_uint result[16];
|
||||||
|
|
||||||
|
void reset() { memset(this, 0, sizeof(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct zlib_compress_result_t
|
||||||
|
{
|
||||||
|
unsigned dummy;
|
||||||
|
|
||||||
|
void reset() { memset(this, 0, sizeof(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct upx_compress_result_t
|
||||||
|
{
|
||||||
|
// debug
|
||||||
|
int method, level;
|
||||||
|
unsigned u_len, c_len;
|
||||||
|
|
||||||
|
lzma_compress_result_t result_lzma;
|
||||||
|
ucl_compress_result_t result_ucl;
|
||||||
|
zlib_compress_result_t result_zlib;
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
memset(this, 0, sizeof(*this));
|
||||||
|
result_lzma.reset(); result_ucl.reset(); result_zlib.reset();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -470,11 +708,15 @@ inline void operator delete[](void *p)
|
|||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
|
||||||
|
|
||||||
|
// classes
|
||||||
|
class ElfLinker;
|
||||||
|
typedef ElfLinker Linker;
|
||||||
|
|
||||||
|
|
||||||
// main.cpp
|
// main.cpp
|
||||||
extern const char *progname;
|
extern const char *progname;
|
||||||
void init_options(struct options_t *o);
|
|
||||||
bool set_ec(int ec);
|
bool set_ec(int ec);
|
||||||
#if defined(__GNUC__)
|
#if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
|
||||||
void e_exit(int ec) __attribute__((__noreturn__));
|
void e_exit(int ec) __attribute__((__noreturn__));
|
||||||
#else
|
#else
|
||||||
void e_exit(int ec);
|
void e_exit(int ec);
|
||||||
@@ -486,23 +728,23 @@ void printSetNl(int need_nl);
|
|||||||
void printClearLine(FILE *f = NULL);
|
void printClearLine(FILE *f = NULL);
|
||||||
void printErr(const char *iname, const Throwable *e);
|
void printErr(const char *iname, const Throwable *e);
|
||||||
void printUnhandledException(const char *iname, const std::exception *e);
|
void printUnhandledException(const char *iname, const std::exception *e);
|
||||||
#if defined(__GNUC__)
|
#if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
|
||||||
void __acc_cdecl_va printErr(const char *iname, const char *format, ...)
|
void __acc_cdecl_va printErr(const char *iname, const char *format, ...)
|
||||||
__attribute__((__format__(printf,2,3)));
|
__attribute__((__format__(__printf__,2,3)));
|
||||||
void __acc_cdecl_va printWarn(const char *iname, const char *format, ...)
|
void __acc_cdecl_va printWarn(const char *iname, const char *format, ...)
|
||||||
__attribute__((__format__(printf,2,3)));
|
__attribute__((__format__(__printf__,2,3)));
|
||||||
#else
|
#else
|
||||||
void __acc_cdecl_va printErr(const char *iname, const char *format, ...);
|
void __acc_cdecl_va printErr(const char *iname, const char *format, ...);
|
||||||
void __acc_cdecl_va printWarn(const char *iname, const char *format, ...);
|
void __acc_cdecl_va printWarn(const char *iname, const char *format, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
|
||||||
void __acc_cdecl_va infoWarning(const char *format, ...)
|
void __acc_cdecl_va infoWarning(const char *format, ...)
|
||||||
__attribute__((__format__(printf,1,2)));
|
__attribute__((__format__(__printf__,1,2)));
|
||||||
void __acc_cdecl_va infoHeader(const char *format, ...)
|
void __acc_cdecl_va infoHeader(const char *format, ...)
|
||||||
__attribute__((__format__(printf,1,2)));
|
__attribute__((__format__(__printf__,1,2)));
|
||||||
void __acc_cdecl_va info(const char *format, ...)
|
void __acc_cdecl_va info(const char *format, ...)
|
||||||
__attribute__((__format__(printf,1,2)));
|
__attribute__((__format__(__printf__,1,2)));
|
||||||
#else
|
#else
|
||||||
void __acc_cdecl_va infoWarning(const char *format, ...);
|
void __acc_cdecl_va infoWarning(const char *format, ...);
|
||||||
void __acc_cdecl_va infoHeader(const char *format, ...);
|
void __acc_cdecl_va infoHeader(const char *format, ...);
|
||||||
@@ -519,7 +761,7 @@ void do_files(int i, int argc, char *argv[]);
|
|||||||
|
|
||||||
// help.cpp
|
// help.cpp
|
||||||
void show_head(void);
|
void show_head(void);
|
||||||
void show_help(int x = 0);
|
void show_help(int verbose=0);
|
||||||
void show_license(void);
|
void show_license(void);
|
||||||
void show_usage(void);
|
void show_usage(void);
|
||||||
void show_version(int);
|
void show_version(int);
|
||||||
@@ -529,18 +771,22 @@ void show_version(int);
|
|||||||
unsigned upx_adler32(const void *buf, unsigned len, unsigned adler=1);
|
unsigned upx_adler32(const void *buf, unsigned len, unsigned adler=1);
|
||||||
unsigned upx_crc32(const void *buf, unsigned len, unsigned crc=0);
|
unsigned upx_crc32(const void *buf, unsigned len, unsigned crc=0);
|
||||||
|
|
||||||
int upx_compress ( const upx_bytep src, upx_uint src_len,
|
int upx_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, upx_uintp dst_len,
|
upx_bytep dst, unsigned* dst_len,
|
||||||
upx_progress_callback_t *cb,
|
upx_callback_p cb,
|
||||||
int method, int level,
|
int method, int level,
|
||||||
const struct upx_compress_config_t *conf,
|
const upx_compress_config_t *cconf,
|
||||||
upx_uintp result );
|
upx_compress_result_t *cresult );
|
||||||
int upx_decompress ( const upx_bytep src, upx_uint src_len,
|
int upx_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, upx_uintp dst_len,
|
upx_bytep dst, unsigned* dst_len,
|
||||||
int method );
|
int method,
|
||||||
int upx_test_overlap ( const upx_bytep buf, upx_uint src_off,
|
const upx_compress_result_t *cresult );
|
||||||
upx_uint src_len, upx_uintp dst_len,
|
int upx_test_overlap ( const upx_bytep buf,
|
||||||
int method );
|
const upx_bytep tbuf,
|
||||||
|
unsigned src_off, unsigned src_len,
|
||||||
|
unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult );
|
||||||
|
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -117,7 +117,7 @@ typedef struct
|
|||||||
int (*init)(FILE *f, int, int);
|
int (*init)(FILE *f, int, int);
|
||||||
int (*set_fg)(FILE *f, int fg);
|
int (*set_fg)(FILE *f, int fg);
|
||||||
void (*print0)(FILE *f, const char *s);
|
void (*print0)(FILE *f, const char *s);
|
||||||
upx_bool (*intro)(FILE *f);
|
bool (*intro)(FILE *f);
|
||||||
}
|
}
|
||||||
console_t;
|
console_t;
|
||||||
|
|
||||||
|
|||||||
+15
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -85,6 +85,11 @@ void throwCantPack(const char *msg)
|
|||||||
throw CantUnpackException(msg);
|
throw CantUnpackException(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void throwCantPackExact()
|
||||||
|
{
|
||||||
|
throwCantPack("option '--exact' does not work with this file");
|
||||||
|
}
|
||||||
|
|
||||||
void throwFilterException()
|
void throwFilterException()
|
||||||
{
|
{
|
||||||
throwCantPack("filter problem");
|
throwCantPack("filter problem");
|
||||||
@@ -156,6 +161,14 @@ void throwBadLoader()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void throwOutOfMemoryException(const char *msg)
|
||||||
|
{
|
||||||
|
if (msg == NULL)
|
||||||
|
msg = "out of memory";
|
||||||
|
throw OutOfMemoryException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void throwIOException(const char *msg, int e)
|
void throwIOException(const char *msg, int e)
|
||||||
{
|
{
|
||||||
throw IOException(msg, e);
|
throw IOException(msg, e);
|
||||||
|
|||||||
+4
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -208,6 +208,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void throwCantPack(const char *msg) NORET;
|
void throwCantPack(const char *msg) NORET;
|
||||||
|
void throwCantPackExact() NORET;
|
||||||
void throwUnknownExecutableFormat(const char *msg = NULL, bool warn = false) NORET;
|
void throwUnknownExecutableFormat(const char *msg = NULL, bool warn = false) NORET;
|
||||||
void throwNotCompressible(const char *msg = NULL) NORET;
|
void throwNotCompressible(const char *msg = NULL) NORET;
|
||||||
void throwAlreadyPacked(const char *msg = NULL) NORET;
|
void throwAlreadyPacked(const char *msg = NULL) NORET;
|
||||||
@@ -219,6 +220,7 @@ void throwBadLoader() NORET;
|
|||||||
void throwChecksumError() NORET;
|
void throwChecksumError() NORET;
|
||||||
void throwCompressedDataViolation() NORET;
|
void throwCompressedDataViolation() NORET;
|
||||||
void throwInternalError(const char *msg) NORET;
|
void throwInternalError(const char *msg) NORET;
|
||||||
|
void throwOutOfMemoryException(const char *msg = NULL) NORET;
|
||||||
void throwIOException(const char *msg = NULL, int e = 0) NORET;
|
void throwIOException(const char *msg = NULL, int e = 0) NORET;
|
||||||
void throwEOFException(const char *msg = NULL, int e = 0) NORET;
|
void throwEOFException(const char *msg = NULL, int e = 0) NORET;
|
||||||
|
|
||||||
|
|||||||
+79
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -40,6 +40,8 @@ void File::chmod(const char *name, int mode)
|
|||||||
#if defined(HAVE_CHMOD)
|
#if defined(HAVE_CHMOD)
|
||||||
if (::chmod(name,mode) != 0)
|
if (::chmod(name,mode) != 0)
|
||||||
throwIOException(name,errno);
|
throwIOException(name,errno);
|
||||||
|
#else
|
||||||
|
UNUSED(name); UNUSED(mode);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +69,7 @@ void File::unlink(const char *name)
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
FileBase::FileBase() :
|
FileBase::FileBase() :
|
||||||
_fd(-1), _flags(0), _shflags(0), _mode(0), _name(NULL)
|
_fd(-1), _flags(0), _shflags(0), _mode(0), _name(NULL), _offset(0), _length(0)
|
||||||
{
|
{
|
||||||
memset(&st,0,sizeof(st));
|
memset(&st,0,sizeof(st));
|
||||||
}
|
}
|
||||||
@@ -102,6 +104,10 @@ void FileBase::sopen()
|
|||||||
assert(0);
|
assert(0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (!(_fd < 0)) {
|
||||||
|
::fstat(_fd, &st);
|
||||||
|
_length = st.st_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -115,6 +121,8 @@ bool FileBase::close()
|
|||||||
_flags = 0;
|
_flags = 0;
|
||||||
_mode = 0;
|
_mode = 0;
|
||||||
_name = NULL;
|
_name = NULL;
|
||||||
|
_offset = 0;
|
||||||
|
_length = 0;
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,10 +170,17 @@ void FileBase::seek(off_t off, int whence)
|
|||||||
{
|
{
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
throwIOException("bad seek 1");
|
throwIOException("bad seek 1");
|
||||||
if (whence == SEEK_SET && off < 0)
|
if (whence == SEEK_SET) {
|
||||||
|
if (off < 0)
|
||||||
throwIOException("bad seek 2");
|
throwIOException("bad seek 2");
|
||||||
if (whence == SEEK_END && off > 0)
|
off += _offset;
|
||||||
|
}
|
||||||
|
if (whence == SEEK_END) {
|
||||||
|
if (off > 0)
|
||||||
throwIOException("bad seek 3");
|
throwIOException("bad seek 3");
|
||||||
|
off += _offset + _length;
|
||||||
|
whence = SEEK_SET;
|
||||||
|
}
|
||||||
if (::lseek(_fd,off,whence) < 0)
|
if (::lseek(_fd,off,whence) < 0)
|
||||||
throwIOException("seek error",errno);
|
throwIOException("seek error",errno);
|
||||||
}
|
}
|
||||||
@@ -178,7 +193,19 @@ off_t FileBase::tell() const
|
|||||||
off_t l = ::lseek(_fd, 0, SEEK_CUR);
|
off_t l = ::lseek(_fd, 0, SEEK_CUR);
|
||||||
if (l < 0)
|
if (l < 0)
|
||||||
throwIOException("tell error",errno);
|
throwIOException("tell error",errno);
|
||||||
return l;
|
return l - _offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FileBase::set_extent(off_t offset, off_t length)
|
||||||
|
{
|
||||||
|
_offset = offset;
|
||||||
|
_length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t FileBase::st_size() const
|
||||||
|
{
|
||||||
|
return _length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -203,6 +230,8 @@ void InputFile::sopen(const char *name, int flags, int shflags)
|
|||||||
_flags = flags;
|
_flags = flags;
|
||||||
_shflags = shflags;
|
_shflags = shflags;
|
||||||
_mode = 0;
|
_mode = 0;
|
||||||
|
_offset = 0;
|
||||||
|
_length = 0;
|
||||||
FileBase::sopen();
|
FileBase::sopen();
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
{
|
{
|
||||||
@@ -287,6 +316,8 @@ void OutputFile::sopen(const char *name, int flags, int shflags, int mode)
|
|||||||
_flags = flags;
|
_flags = flags;
|
||||||
_shflags = shflags;
|
_shflags = shflags;
|
||||||
_mode = mode;
|
_mode = mode;
|
||||||
|
_offset = 0;
|
||||||
|
_length = 0;
|
||||||
FileBase::sopen();
|
FileBase::sopen();
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
{
|
{
|
||||||
@@ -314,6 +345,8 @@ bool OutputFile::openStdout(int flags, bool force)
|
|||||||
_flags = flags;
|
_flags = flags;
|
||||||
_shflags = -1;
|
_shflags = -1;
|
||||||
_mode = 0;
|
_mode = 0;
|
||||||
|
_offset = 0;
|
||||||
|
_length = 0;
|
||||||
if (flags && acc_set_binmode(fd, 1) == -1)
|
if (flags && acc_set_binmode(fd, 1) == -1)
|
||||||
throwIOException(_name, errno);
|
throwIOException(_name, errno);
|
||||||
_fd = fd;
|
_fd = fd;
|
||||||
@@ -327,6 +360,16 @@ void OutputFile::write(const void *buf, int len)
|
|||||||
bytes_written += len;
|
bytes_written += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
off_t OutputFile::st_size() const
|
||||||
|
{
|
||||||
|
if (opt->to_stdout) { // might be a pipe ==> .st_size is invalid
|
||||||
|
return bytes_written; // too big if seek()+write() instead of rewrite()
|
||||||
|
}
|
||||||
|
struct stat my_st;
|
||||||
|
::fstat(_fd, &my_st);
|
||||||
|
return my_st.st_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void OutputFile::write(const MemBuffer *buf, int len)
|
void OutputFile::write(const MemBuffer *buf, int len)
|
||||||
{
|
{
|
||||||
@@ -341,6 +384,36 @@ void OutputFile::write(const MemBuffer &buf, int len)
|
|||||||
write(&buf, len);
|
write(&buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OutputFile::rewrite(const void *buf, int len)
|
||||||
|
{
|
||||||
|
assert(!opt->to_stdout);
|
||||||
|
write(buf, len);
|
||||||
|
bytes_written -= len; // restore
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputFile::seek(off_t off, int whence)
|
||||||
|
{
|
||||||
|
assert(!opt->to_stdout);
|
||||||
|
super::seek(off,whence);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputFile::set_extent(off_t offset, off_t length)
|
||||||
|
{
|
||||||
|
super::set_extent(offset, length);
|
||||||
|
bytes_written = 0;
|
||||||
|
if (0==offset && (off_t)~0u==length) {
|
||||||
|
::fstat(_fd, &st);
|
||||||
|
_length = st.st_size - offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t OutputFile::unset_extent()
|
||||||
|
{
|
||||||
|
_offset = 0;
|
||||||
|
_length = ::lseek(_fd, 0, SEEK_END);
|
||||||
|
bytes_written = _length;
|
||||||
|
return _length;
|
||||||
|
}
|
||||||
|
|
||||||
void OutputFile::dump(const char *name, const void *buf, int len, int flags)
|
void OutputFile::dump(const char *name, const void *buf, int len, int flags)
|
||||||
{
|
{
|
||||||
|
|||||||
+12
-16
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -59,6 +59,8 @@ public:
|
|||||||
virtual bool isOpen() const { return _fd >= 0; }
|
virtual bool isOpen() const { return _fd >= 0; }
|
||||||
int getFd() const { return _fd; }
|
int getFd() const { return _fd; }
|
||||||
const char *getName() const { return _name; }
|
const char *getName() const { return _name; }
|
||||||
|
virtual off_t st_size() const; // { return _length; }
|
||||||
|
virtual void set_extent(off_t offset, off_t length);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void sopen();
|
void sopen();
|
||||||
@@ -73,6 +75,8 @@ protected:
|
|||||||
int _shflags;
|
int _shflags;
|
||||||
int _mode;
|
int _mode;
|
||||||
const char *_name;
|
const char *_name;
|
||||||
|
off_t _offset;
|
||||||
|
off_t _length;
|
||||||
public:
|
public:
|
||||||
struct stat st;
|
struct stat st;
|
||||||
};
|
};
|
||||||
@@ -128,23 +132,15 @@ public:
|
|||||||
virtual void write(const void *buf, int len);
|
virtual void write(const void *buf, int len);
|
||||||
virtual void write(const MemBuffer *buf, int len);
|
virtual void write(const MemBuffer *buf, int len);
|
||||||
virtual void write(const MemBuffer &buf, int len);
|
virtual void write(const MemBuffer &buf, int len);
|
||||||
|
virtual void set_extent(off_t offset, off_t length);
|
||||||
|
virtual off_t unset_extent(); // returns actual length
|
||||||
|
|
||||||
off_t getBytesWritten() const { return bytes_written; }
|
off_t getBytesWritten() const { return bytes_written; }
|
||||||
|
virtual off_t st_size() const; // { return _length; }
|
||||||
|
|
||||||
#if (UPX_VERSION_HEX >= 0x019000)
|
// FIXME - these won't work when using the '--stdout' option
|
||||||
// FIXME - these won't work when using the `--stdout' option
|
virtual void seek(off_t off, int whence);
|
||||||
virtual void seek(off_t off, int whence)
|
virtual void rewrite(const void *buf, int len);
|
||||||
{
|
|
||||||
assert(!opt->to_stdout);
|
|
||||||
super::seek(off,whence);
|
|
||||||
}
|
|
||||||
virtual void rewrite(const void *buf, int len)
|
|
||||||
{
|
|
||||||
assert(!opt->to_stdout);
|
|
||||||
write(buf, len);
|
|
||||||
bytes_written -= len; // restore
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// util
|
// util
|
||||||
static void dump(const char *name, const void *buf, int len, int flags=-1);
|
static void dump(const char *name, const void *buf, int len, int flags=-1);
|
||||||
|
|||||||
+20
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -61,10 +61,10 @@ const FilterImp::FilterEntry *FilterImp::getFilter(int id)
|
|||||||
memset(filter_map, 0xff, sizeof(filter_map));
|
memset(filter_map, 0xff, sizeof(filter_map));
|
||||||
for (int i = 0; i < n_filters; i++)
|
for (int i = 0; i < n_filters; i++)
|
||||||
{
|
{
|
||||||
int fid = filters[i].id;
|
int filter_id = filters[i].id;
|
||||||
assert(fid >= 0 && fid <= 255);
|
assert(filter_id >= 0 && filter_id <= 255);
|
||||||
assert(filter_map[fid] == 0xff);
|
assert(filter_map[filter_id] == 0xff);
|
||||||
filter_map[fid] = (unsigned char) i;
|
filter_map[filter_id] = (unsigned char) i;
|
||||||
}
|
}
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
@@ -85,6 +85,20 @@ bool Filter::isValidFilter(int filter_id)
|
|||||||
return fe != NULL;
|
return fe != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Filter::isValidFilter(int filter_id, const int *allowed_filters)
|
||||||
|
{
|
||||||
|
if (!isValidFilter(filter_id))
|
||||||
|
return false;
|
||||||
|
if (filter_id == 0)
|
||||||
|
return true;
|
||||||
|
if (allowed_filters == NULL)
|
||||||
|
return false;
|
||||||
|
while (*allowed_filters != FT_END)
|
||||||
|
if (*allowed_filters++ == filter_id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// high level API
|
// high level API
|
||||||
|
|||||||
+4
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
markus@oberhumer.com ml1050@users.sourceforge.net
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -62,6 +62,7 @@ public:
|
|||||||
bool scan(const upx_byte *buf, unsigned buf_len);
|
bool scan(const upx_byte *buf, unsigned buf_len);
|
||||||
|
|
||||||
static bool isValidFilter(int filter_id);
|
static bool isValidFilter(int filter_id);
|
||||||
|
static bool isValidFilter(int filter_id, const int *allowed_filters);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Will be set by each call to filter()/unfilter().
|
// Will be set by each call to filter()/unfilter().
|
||||||
|
|||||||
+77
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -383,6 +383,81 @@ static int s_ct32_e8e9_bswap_be(Filter *f)
|
|||||||
|
|
||||||
#undef CT32
|
#undef CT32
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// 24-bit ARM calltrick ("naive")
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define CT24ARM_LE(f, cond, addvalue, get, set) \
|
||||||
|
upx_byte *b = f->buf; \
|
||||||
|
upx_byte *b_end = b + f->buf_len - 4; \
|
||||||
|
do { \
|
||||||
|
if (cond) \
|
||||||
|
{ \
|
||||||
|
unsigned a = (unsigned) (b - f->buf); \
|
||||||
|
f->lastcall = a; \
|
||||||
|
set(b, get(b) + (addvalue)); \
|
||||||
|
f->calls++; \
|
||||||
|
} \
|
||||||
|
b += 4; \
|
||||||
|
} while (b < b_end); \
|
||||||
|
if (f->lastcall) f->lastcall += 4; \
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
|
#define ARMCT_COND_le (((b[3] & 0x0f) == 0x0b))
|
||||||
|
|
||||||
|
static int f_ct24arm_le(Filter *f)
|
||||||
|
{
|
||||||
|
CT24ARM_LE(f, ARMCT_COND_le, a / 4 + f->addvalue, get_le24, set_le24)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int u_ct24arm_le(Filter *f)
|
||||||
|
{
|
||||||
|
CT24ARM_LE(f, ARMCT_COND_le, 0 - a / 4 - f->addvalue, get_le24, set_le24)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int s_ct24arm_le(Filter *f)
|
||||||
|
{
|
||||||
|
CT24ARM_LE(f, ARMCT_COND_le, a + f->addvalue, get_le24, set_dummy)
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef CT24ARM_LE
|
||||||
|
|
||||||
|
#define CT24ARM_BE(f, cond, addvalue, get, set) \
|
||||||
|
upx_byte *b = f->buf; \
|
||||||
|
upx_byte *b_end = b + f->buf_len - 4; \
|
||||||
|
do { \
|
||||||
|
if (cond) \
|
||||||
|
{ \
|
||||||
|
unsigned a = (unsigned) (b - f->buf); \
|
||||||
|
f->lastcall = a; \
|
||||||
|
set(1+b, get(1+b) + (addvalue)); \
|
||||||
|
f->calls++; \
|
||||||
|
} \
|
||||||
|
b += 4; \
|
||||||
|
} while (b < b_end); \
|
||||||
|
if (f->lastcall) f->lastcall += 4; \
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#define ARMCT_COND_be (((b[0] & 0x0f) == 0x0b))
|
||||||
|
|
||||||
|
static int f_ct24arm_be(Filter *f)
|
||||||
|
{
|
||||||
|
CT24ARM_BE(f, ARMCT_COND_be, a / 4 + f->addvalue, get_be24, set_be24)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int u_ct24arm_be(Filter *f)
|
||||||
|
{
|
||||||
|
CT24ARM_BE(f, ARMCT_COND_be, 0 - a / 4 - f->addvalue, get_be24, set_be24)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int s_ct24arm_be(Filter *f)
|
||||||
|
{
|
||||||
|
CT24ARM_BE(f, ARMCT_COND_be, a + f->addvalue, get_be24, set_dummy)
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef CT24ARM_BE
|
||||||
|
#undef ARMCT_COND
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vi:ts=4:et:nowrap
|
vi:ts=4:et:nowrap
|
||||||
|
|||||||
+18
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -36,11 +36,11 @@ static int F(Filter *f)
|
|||||||
#ifdef U
|
#ifdef U
|
||||||
// filter
|
// filter
|
||||||
upx_byte *b = f->buf;
|
upx_byte *b = f->buf;
|
||||||
const unsigned addvalue = f->addvalue;
|
|
||||||
#else
|
#else
|
||||||
// scan
|
// scan
|
||||||
const upx_byte *b = f->buf;
|
const upx_byte *b = f->buf;
|
||||||
#endif
|
#endif
|
||||||
|
const unsigned addvalue = f->addvalue;
|
||||||
const unsigned size = f->buf_len;
|
const unsigned size = f->buf_len;
|
||||||
|
|
||||||
unsigned ic, jc, kc;
|
unsigned ic, jc, kc;
|
||||||
@@ -52,9 +52,22 @@ static int F(Filter *f)
|
|||||||
unsigned char buf[256];
|
unsigned char buf[256];
|
||||||
memset(buf,0,256);
|
memset(buf,0,256);
|
||||||
|
|
||||||
|
// A call to a destination that is inside the buffer
|
||||||
|
// will be rewritten and marked with cto8 as first byte.
|
||||||
|
// So, a call to a destination that is outside the buffer
|
||||||
|
// must not conflict with the mark.
|
||||||
|
// Note that unsigned comparison checks both edges of buffer.
|
||||||
for (ic = 0; ic < size - 5; ic++)
|
for (ic = 0; ic < size - 5; ic++)
|
||||||
if (COND(b,ic) && get_le32(b+ic+1)+ic+1 >= size)
|
|
||||||
{
|
{
|
||||||
|
if (!COND(b,ic))
|
||||||
|
continue;
|
||||||
|
jc = get_le32(b+ic+1)+ic+1;
|
||||||
|
if (jc < size)
|
||||||
|
{
|
||||||
|
if (jc + addvalue >= (1u << 24)) // hi 8 bits won't be cto8
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
buf[b[ic+1]] |= 1;
|
buf[b[ic+1]] |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +87,7 @@ static int F(Filter *f)
|
|||||||
// try to detect 'real' calls only
|
// try to detect 'real' calls only
|
||||||
if (jc < size)
|
if (jc < size)
|
||||||
{
|
{
|
||||||
|
assert(jc + addvalue < (1u << 24)); // hi 8 bits won't be cto8
|
||||||
#ifdef U
|
#ifdef U
|
||||||
set_be32(b+ic+1,jc+addvalue+cto);
|
set_be32(b+ic+1,jc+addvalue+cto);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+14
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
Copyright (C) 2000-2004 John F. Reiser
|
Copyright (C) 2000-2007 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -40,11 +40,11 @@ static int F(Filter *f)
|
|||||||
#ifdef U
|
#ifdef U
|
||||||
// filter
|
// filter
|
||||||
upx_byte *b = f->buf;
|
upx_byte *b = f->buf;
|
||||||
const unsigned addvalue = f->addvalue;
|
|
||||||
#else
|
#else
|
||||||
// scan
|
// scan
|
||||||
const upx_byte *b = f->buf;
|
const upx_byte *b = f->buf;
|
||||||
#endif
|
#endif
|
||||||
|
const unsigned addvalue = f->addvalue;
|
||||||
const unsigned size = f->buf_len;
|
const unsigned size = f->buf_len;
|
||||||
|
|
||||||
unsigned ic, jc, kc;
|
unsigned ic, jc, kc;
|
||||||
@@ -57,8 +57,16 @@ static int F(Filter *f)
|
|||||||
memset(buf,0,256);
|
memset(buf,0,256);
|
||||||
|
|
||||||
for (ic = 0; ic < size - 5; ic++)
|
for (ic = 0; ic < size - 5; ic++)
|
||||||
if (COND(b,ic,lastcall) && get_le32(b+ic+1)+ic+1 >= size)
|
|
||||||
{
|
{
|
||||||
|
if (!COND(b,ic,lastcall))
|
||||||
|
continue;
|
||||||
|
jc = get_le32(b+ic+1)+ic+1;
|
||||||
|
if (jc < size)
|
||||||
|
{
|
||||||
|
if (jc + addvalue >= (1u << 24)) // hi 8 bits won't be cto8
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
buf[b[ic+1]] |= 1;
|
buf[b[ic+1]] |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +86,7 @@ static int F(Filter *f)
|
|||||||
// try to detect 'real' calls only
|
// try to detect 'real' calls only
|
||||||
if (jc < size)
|
if (jc < size)
|
||||||
{
|
{
|
||||||
|
assert(jc + addvalue < (1u << 24)); // hi 8 bits won't be cto8
|
||||||
#ifdef U
|
#ifdef U
|
||||||
set_be32(b+ic+1,jc+addvalue+cto);
|
set_be32(b+ic+1,jc+addvalue+cto);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
Copyright (C) 2000-2004 John F. Reiser
|
Copyright (C) 2000-2007 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+14
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
Copyright (C) 2000-2004 John F. Reiser
|
Copyright (C) 2000-2007 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -40,11 +40,11 @@ static int F(Filter *f)
|
|||||||
#ifdef U
|
#ifdef U
|
||||||
// filter
|
// filter
|
||||||
upx_byte *b = f->buf;
|
upx_byte *b = f->buf;
|
||||||
const unsigned addvalue = f->addvalue;
|
|
||||||
#else
|
#else
|
||||||
// scan
|
// scan
|
||||||
const upx_byte *b = f->buf;
|
const upx_byte *b = f->buf;
|
||||||
#endif
|
#endif
|
||||||
|
const unsigned addvalue = f->addvalue;
|
||||||
const unsigned size = f->buf_len;
|
const unsigned size = f->buf_len;
|
||||||
unsigned const id = f->id;
|
unsigned const id = f->id;
|
||||||
|
|
||||||
@@ -58,8 +58,16 @@ static int F(Filter *f)
|
|||||||
memset(buf,0,256);
|
memset(buf,0,256);
|
||||||
|
|
||||||
for (ic = 0; ic < size - 5; ic++)
|
for (ic = 0; ic < size - 5; ic++)
|
||||||
if (COND(b,ic,lastcall,id) && get_le32(b+ic+1)+ic+1 >= size)
|
|
||||||
{
|
{
|
||||||
|
if (!COND(b,ic,lastcall,id))
|
||||||
|
continue;
|
||||||
|
jc = get_le32(b+ic+1)+ic+1;
|
||||||
|
if (jc < size)
|
||||||
|
{
|
||||||
|
if (jc + addvalue >= (1u << 24)) // hi 8 bits won't be cto8
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
buf[b[ic+1]] |= 1;
|
buf[b[ic+1]] |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +87,7 @@ static int F(Filter *f)
|
|||||||
// try to detect 'real' calls only
|
// try to detect 'real' calls only
|
||||||
if (jc < size)
|
if (jc < size)
|
||||||
{
|
{
|
||||||
|
assert(jc + addvalue < (1u << 24)); // hi 8 bits won't be cto8
|
||||||
#ifdef U
|
#ifdef U
|
||||||
set_be32(b+ic+1,jc+addvalue+cto);
|
set_be32(b+ic+1,jc+addvalue+cto);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
@@ -0,0 +1,155 @@
|
|||||||
|
/* ppcbxx.h -- PowerPC Branch trick
|
||||||
|
|
||||||
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
|
Copyright (C) 2004-2007 John F. Reiser
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
and/or modify them under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; see the file COPYING.
|
||||||
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
|
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
|
John F. Reiser
|
||||||
|
<jreiser@users.sourceforge.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// filter / scan
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define W_CTO 4 /* width of cto; must match stub/ppc_bxx.S */
|
||||||
|
|
||||||
|
static int F(Filter *f)
|
||||||
|
{
|
||||||
|
#ifdef U
|
||||||
|
// filter
|
||||||
|
upx_byte *b = f->buf;
|
||||||
|
const unsigned addvalue = f->addvalue;
|
||||||
|
#else
|
||||||
|
// scan
|
||||||
|
const upx_byte *b = f->buf;
|
||||||
|
#endif
|
||||||
|
const unsigned size = umin(f->buf_len, -(~0u<<(32 - (6+ W_CTO))));
|
||||||
|
const unsigned size4 = size -4;
|
||||||
|
|
||||||
|
unsigned ic;
|
||||||
|
unsigned calls = 0, noncalls = 0;
|
||||||
|
unsigned lastnoncall = size, lastcall = 0;
|
||||||
|
|
||||||
|
// find 26-2-W_CTO bits of displacements that contain no targets
|
||||||
|
{
|
||||||
|
unsigned char buf[256];
|
||||||
|
unsigned short wbuf[256];
|
||||||
|
const size_t WW = (size_t)0 - ((~(size_t)0) << W_CTO); // ???
|
||||||
|
memset(wbuf, 0, sizeof(wbuf));
|
||||||
|
memset(buf , 0, WW);
|
||||||
|
memset(buf + WW, 1, 256 - WW);
|
||||||
|
|
||||||
|
for (ic = 0; ic<=size4; ic+=4) if (COND(b,ic)) {
|
||||||
|
unsigned const off = (int)(get_be32(b+ic)<<6) >>6;
|
||||||
|
if (size <= (off & (~0u<<2))+ic) {
|
||||||
|
buf[(~(~0u<<W_CTO)) & (off>>(26 - W_CTO))] |= 1;
|
||||||
|
++wbuf[0xff&(off>>18)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getcto(f, buf) < 0) {
|
||||||
|
if (0!=W_CTO) // FIXME: what is this ???
|
||||||
|
return -1;
|
||||||
|
f->cto = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const unsigned char cto8 = f->cto;
|
||||||
|
#ifdef U
|
||||||
|
const unsigned cto = (unsigned)f->cto << (24+2 - W_CTO);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (ic = 0; ic<=size4; ic+=4) if (COND(b,ic)) {
|
||||||
|
unsigned const word = get_be32(b+ic);
|
||||||
|
unsigned const off = (int)(word<<6) >>6;
|
||||||
|
unsigned const jc = (off & (~0u<<2))+ic;
|
||||||
|
// try to detect 'real' calls only
|
||||||
|
if (jc < size) {
|
||||||
|
#ifdef U
|
||||||
|
set_be32(b+ic,(0xfc000003&word) | (jc+addvalue+cto));
|
||||||
|
#endif
|
||||||
|
calls++;
|
||||||
|
lastcall = ic;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert(0==W_CTO // FIXME: what is this ???
|
||||||
|
|| (~(~0u<<W_CTO) & (word>>(24+2 - W_CTO))) != cto8); // this should not happen
|
||||||
|
lastnoncall = ic;
|
||||||
|
noncalls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f->calls = calls;
|
||||||
|
f->noncalls = noncalls;
|
||||||
|
f->lastcall = lastcall;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
printf("\ncalls=%d noncalls=%d text_size=%x calltrickoffset=%x\n",
|
||||||
|
calls,noncalls,size,cto8);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// unfilter
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifdef U
|
||||||
|
static int U(Filter *f)
|
||||||
|
{
|
||||||
|
upx_byte *b = f->buf;
|
||||||
|
const unsigned size4 = umin(f->buf_len - 4, -(~0u<<(32 - (6+ W_CTO))));
|
||||||
|
const unsigned addvalue = f->addvalue;
|
||||||
|
|
||||||
|
unsigned ic;
|
||||||
|
|
||||||
|
for (ic = 0; ic<=size4; ic+=4) if (COND(b,ic)) {
|
||||||
|
unsigned const word = get_be32(b+ic);
|
||||||
|
if ((~(~0u<<W_CTO) & (word>>(24+2 - W_CTO))) == f->cto) {
|
||||||
|
unsigned const jc = word & (~(~0u<<(26 - W_CTO)) & (~0u<<2));
|
||||||
|
set_be32(b+ic, (0xfc000003&word)|(0x03fffffc&(jc-ic-addvalue)));
|
||||||
|
f->calls++;
|
||||||
|
f->lastcall = ic;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
f->noncalls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef F
|
||||||
|
#undef U
|
||||||
|
|
||||||
|
#undef W_CTO
|
||||||
|
|
||||||
|
/*
|
||||||
|
vi:ts=4:et:nowrap
|
||||||
|
*/
|
||||||
|
|
||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
+29
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,13 +22,19 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
markus@oberhumer.com ml1050@users.sourceforge.net
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
|
|
||||||
|
static unsigned
|
||||||
|
umin(unsigned const a, unsigned const b)
|
||||||
|
{
|
||||||
|
return (a<=b) ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define set_dummy(p, v) ((void)0)
|
#define set_dummy(p, v) ((void)0)
|
||||||
#define get_8(p) (*(p))
|
#define get_8(p) (*(p))
|
||||||
@@ -145,6 +151,19 @@
|
|||||||
#undef COND_CALL
|
#undef COND_CALL
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// PowerPC branch [incl. call] trick
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define COND(b,x) (18==(get_be32(b+x)>>26))
|
||||||
|
#define F f_ppcbxx
|
||||||
|
#define U u_ppcbxx
|
||||||
|
#include "filter/ppcbxx.h"
|
||||||
|
#define F s_ppcbxx
|
||||||
|
#include "filter/ppcbxx.h"
|
||||||
|
#undef COND
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// database for use in class Filter
|
// database for use in class Filter
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -205,6 +224,10 @@ const FilterImp::FilterEntry FilterImp::filters[] = {
|
|||||||
{ 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
{ 0x46, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
||||||
{ 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
{ 0x49, 6, 0x00ffffff, f_ctok32_e8e9_bswap_le, u_ctok32_e8e9_bswap_le, s_ctok32_e8e9_bswap_le },
|
||||||
|
|
||||||
|
// 24-bit calltrick for arm
|
||||||
|
{ 0x50, 8, 0x01ffffff, f_ct24arm_le, u_ct24arm_le, s_ct24arm_le },
|
||||||
|
{ 0x51, 8, 0x01ffffff, f_ct24arm_be, u_ct24arm_be, s_ct24arm_be },
|
||||||
|
|
||||||
// 32-bit cto calltrick with jmp and jcc(swap 0x0f/0x8Y) and relative renumbering
|
// 32-bit cto calltrick with jmp and jcc(swap 0x0f/0x8Y) and relative renumbering
|
||||||
{ 0x80, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
|
{ 0x80, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
|
||||||
{ 0x81, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
|
{ 0x81, 8, 0x00ffffff, f_ctojr32_e8e9_bswap_le, u_ctojr32_e8e9_bswap_le, s_ctojr32_e8e9_bswap_le },
|
||||||
@@ -230,6 +253,9 @@ const FilterImp::FilterEntry FilterImp::filters[] = {
|
|||||||
{ 0xb1,99, 0, f_sub32_2, u_sub32_2, s_sub32_2 },
|
{ 0xb1,99, 0, f_sub32_2, u_sub32_2, s_sub32_2 },
|
||||||
{ 0xb2,99, 0, f_sub32_3, u_sub32_3, s_sub32_3 },
|
{ 0xb2,99, 0, f_sub32_3, u_sub32_3, s_sub32_3 },
|
||||||
{ 0xb3,99, 0, f_sub32_4, u_sub32_4, s_sub32_4 },
|
{ 0xb3,99, 0, f_sub32_4, u_sub32_4, s_sub32_4 },
|
||||||
|
|
||||||
|
// PowerPC branch+call trick
|
||||||
|
{ 0xd0, 8, 0, f_ppcbxx, u_ppcbxx, s_ppcbxx },
|
||||||
};
|
};
|
||||||
|
|
||||||
const int FilterImp::n_filters = TABLESIZE(filters);
|
const int FilterImp::n_filters = TABLESIZE(filters);
|
||||||
|
|||||||
+144
-59
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -27,6 +27,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
#include "compress.h"
|
||||||
|
#include "packmast.h"
|
||||||
|
#include "packer.h"
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -48,8 +51,8 @@ void show_head(void)
|
|||||||
fg = con_fg(f,FG_GREEN);
|
fg = con_fg(f,FG_GREEN);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" Ultimate Packer for eXecutables\n"
|
" Ultimate Packer for eXecutables\n"
|
||||||
" Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004\n"
|
" Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007\n"
|
||||||
"UPX %-12s Markus F.X.J. Oberhumer & Laszlo Molnar %20s\n\n",
|
"UPX %-10s Markus Oberhumer, Laszlo Molnar & John Reiser %14s\n\n",
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32)
|
#if (ACC_OS_DOS16 || ACC_OS_DOS32)
|
||||||
V("d"),
|
V("d"),
|
||||||
#elif (ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
#elif (ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
||||||
@@ -88,7 +91,77 @@ void show_usage(void)
|
|||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void show_help(int x)
|
struct PackerNames
|
||||||
|
{
|
||||||
|
struct Entry {
|
||||||
|
const char* fname;
|
||||||
|
const char* sname;
|
||||||
|
};
|
||||||
|
Entry names[64];
|
||||||
|
size_t names_count;
|
||||||
|
const options_t *o;
|
||||||
|
PackerNames() : names_count(0), o(NULL) { }
|
||||||
|
void add(const Packer *p)
|
||||||
|
{
|
||||||
|
p->assertPacker();
|
||||||
|
assert(names_count < 64);
|
||||||
|
names[names_count].fname = p->getFullName(o);
|
||||||
|
names[names_count].sname = p->getName();
|
||||||
|
names_count++;
|
||||||
|
}
|
||||||
|
static Packer* visit(Packer *p, void *user)
|
||||||
|
{
|
||||||
|
PackerNames *self = (PackerNames *) user;
|
||||||
|
self->add(p);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
static int __acc_cdecl_qsort cmp_fname(const void *a, const void *b) {
|
||||||
|
return strcmp(((const Entry *) a)->fname, ((const Entry *) b)->fname);
|
||||||
|
}
|
||||||
|
static int __acc_cdecl_qsort cmp_sname(const void *a, const void *b) {
|
||||||
|
return strcmp(((const Entry *) a)->sname, ((const Entry *) b)->sname);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void show_all_packers(FILE *f, int verbose)
|
||||||
|
{
|
||||||
|
options_t o; o.reset();
|
||||||
|
PackerNames pn; pn.o = &o;
|
||||||
|
PackMaster::visitAllPackers(pn.visit, NULL, &o, &pn);
|
||||||
|
qsort(pn.names, pn.names_count, sizeof(PackerNames::Entry), pn.cmp_fname);
|
||||||
|
size_t pos = 0;
|
||||||
|
for (size_t i = 0; i < pn.names_count; ++i)
|
||||||
|
{
|
||||||
|
const char *fn = pn.names[i].fname;
|
||||||
|
const char *sn = pn.names[i].sname;
|
||||||
|
if (verbose)
|
||||||
|
{
|
||||||
|
con_fprintf(f, " %-32s %s\n", fn, sn);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pos == 0) {
|
||||||
|
con_fprintf(f, " %s", fn);
|
||||||
|
pos = 2 + strlen(fn);
|
||||||
|
} else if (pos + 1 + strlen(fn) > 80) {
|
||||||
|
con_fprintf(f, "\n %s", fn);
|
||||||
|
pos = 2 + strlen(fn);
|
||||||
|
} else {
|
||||||
|
con_fprintf(f, " %s", fn);
|
||||||
|
pos += 1 + strlen(fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!verbose && pn.names_count)
|
||||||
|
con_fprintf(f, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
void show_help(int verbose)
|
||||||
{
|
{
|
||||||
FILE *f = con_term;
|
FILE *f = con_term;
|
||||||
int fg;
|
int fg;
|
||||||
@@ -105,8 +178,8 @@ void show_help(int x)
|
|||||||
" -d decompress -l list compressed file\n"
|
" -d decompress -l list compressed file\n"
|
||||||
" -t test compressed file -V display version number\n"
|
" -t test compressed file -V display version number\n"
|
||||||
" -h give %s help -L display software license\n%s",
|
" -h give %s help -L display software license\n%s",
|
||||||
x == 0 ? "" : " --best compress best (can be slow for big files)\n",
|
verbose == 0 ? "" : " --best compress best (can be slow for big files)\n",
|
||||||
x == 0 ? "more" : "this", x == 0 ? "" : "\n");
|
verbose == 0 ? "more" : "this", verbose == 0 ? "" : "\n");
|
||||||
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options:\n");
|
con_fprintf(f,"Options:\n");
|
||||||
@@ -114,22 +187,29 @@ void show_help(int x)
|
|||||||
|
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" -q be quiet -v be verbose\n"
|
" -q be quiet -v be verbose\n"
|
||||||
" -oFILE write output to `FILE'\n"
|
" -oFILE write output to 'FILE'\n"
|
||||||
//" -f force overwrite of output files and compression of suspicious files\n"
|
//" -f force overwrite of output files and compression of suspicious files\n"
|
||||||
" -f force compression of suspicious files\n"
|
" -f force compression of suspicious files\n"
|
||||||
"%s%s"
|
"%s%s"
|
||||||
, (x == 0) ? " -k keep backup files\n" : ""
|
, (verbose == 0) ? " -k keep backup files\n" : ""
|
||||||
#if 1
|
#if 1
|
||||||
, (x > 0) ? " --no-color, --mono, --color, --no-progress change look\n" : ""
|
, (verbose > 0) ? " --no-color, --mono, --color, --no-progress change look\n" : ""
|
||||||
#else
|
#else
|
||||||
, ""
|
, ""
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
if (x > 0)
|
if (verbose > 0)
|
||||||
{
|
{
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"\nBackup options:\n");
|
con_fprintf(f,"\nCompression tuning options:\n");
|
||||||
|
fg = con_fg(f,fg);
|
||||||
|
con_fprintf(f,
|
||||||
|
" --brute try all available compression methods & filters [slow]\n"
|
||||||
|
" --ultra-brute try even more compression variants [very slow]\n"
|
||||||
|
"\n");
|
||||||
|
fg = con_fg(f,FG_YELLOW);
|
||||||
|
con_fprintf(f,"Backup options:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" -k, --backup keep backup files\n"
|
" -k, --backup keep backup files\n"
|
||||||
@@ -196,7 +276,8 @@ void show_help(int x)
|
|||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --all-methods try all available compression methods\n"
|
" --all-methods try all available compression methods\n"
|
||||||
" --8-bit uses 8 bit size compression [default: 32 bit]\n"
|
" --8-bit uses 8 bit size compression [default: 32 bit]\n"
|
||||||
" --console-run enables client/host transfer compatibility\n"
|
" --8mb-ram 8 megabyte memory limit [default: 2 mb]\n"
|
||||||
|
" --boot-only disables client/host transfer compatibility\n"
|
||||||
" --no-align don't align to 2048 bytes [enables: --console-run]\n"
|
" --no-align don't align to 2048 bytes [enables: --console-run]\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
@@ -220,7 +301,7 @@ void show_help(int x)
|
|||||||
" --le produce LE output [default: EXE]\n"
|
" --le produce LE output [default: EXE]\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for win32/pe & rtm32/pe:\n");
|
con_fprintf(f,"Options for win32/pe, rtm32/pe & arm/pe:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --compress-exports=0 do not compress the export section\n"
|
" --compress-exports=0 do not compress the export section\n"
|
||||||
@@ -228,9 +309,9 @@ void show_help(int x)
|
|||||||
" --compress-icons=0 do not compress any icons\n"
|
" --compress-icons=0 do not compress any icons\n"
|
||||||
" --compress-icons=1 compress all but the first icon\n"
|
" --compress-icons=1 compress all but the first icon\n"
|
||||||
" --compress-icons=2 compress all but the first icon directory [default]\n"
|
" --compress-icons=2 compress all but the first icon directory [default]\n"
|
||||||
|
" --compress-icons=3 compress all icons\n"
|
||||||
" --compress-resources=0 do not compress any resources at all\n"
|
" --compress-resources=0 do not compress any resources at all\n"
|
||||||
" --strip-loadconf=0 do not strip SEH load config [default]\n"
|
" --keep-resource=list do not compress resources specified by list\n"
|
||||||
" --strip-loadconf=1 strip SEH load config [DANGEROUS]\n"
|
|
||||||
" --strip-relocs=0 do not strip relocations\n"
|
" --strip-relocs=0 do not strip relocations\n"
|
||||||
" --strip-relocs=1 strip relocations [default]\n"
|
" --strip-relocs=1 strip relocations [default]\n"
|
||||||
" --all-methods try all available compression methods\n"
|
" --all-methods try all available compression methods\n"
|
||||||
@@ -238,37 +319,23 @@ void show_help(int x)
|
|||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
con_fprintf(f,
|
con_fprintf(f, "file.. executables to (de)compress\n");
|
||||||
"file.. executables to (de)compress\n"
|
|
||||||
"\n");
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
|
||||||
con_fprintf(f,"This version supports:\n");
|
|
||||||
fg = con_fg(f,fg);
|
|
||||||
con_fprintf(f," "
|
|
||||||
" atari/tos,"
|
|
||||||
" bvmlinuz/386,"
|
|
||||||
" djgpp2/coff,"
|
|
||||||
" dos/com,"
|
|
||||||
" dos/exe,"
|
|
||||||
" dos/sys,"
|
|
||||||
"\n "
|
|
||||||
//" elks/8086,"
|
|
||||||
" linux/386,"
|
|
||||||
" linux/elf386,"
|
|
||||||
" linux/sh386,"
|
|
||||||
" ps1/exe,"
|
|
||||||
" rtm32/pe,"
|
|
||||||
" tmt/adam,"
|
|
||||||
"\n "
|
|
||||||
" vmlinux/386,"
|
|
||||||
" vmlinuz/386,"
|
|
||||||
" watcom/le,"
|
|
||||||
//" win16/ne,"
|
|
||||||
" win32/pe"
|
|
||||||
"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net\n"
|
|
||||||
//"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n"
|
|
||||||
"");
|
|
||||||
|
|
||||||
|
if (verbose > 0)
|
||||||
|
{
|
||||||
|
fg = con_fg(f,FG_YELLOW);
|
||||||
|
con_fprintf(f,"\nThis version supports:\n");
|
||||||
|
fg = con_fg(f,fg);
|
||||||
|
show_all_packers(f, verbose);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_fprintf(f,"\nType '%s --help' for more detailed help.\n", progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
con_fprintf(f,"\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net\n"
|
||||||
|
// "\nUPX comes with ABSOLUTELY NO WARRANTY; for details type 'upx -L'.\n"
|
||||||
|
"");
|
||||||
|
|
||||||
#if defined(DEBUG) || defined(TESTING)
|
#if defined(DEBUG) || defined(TESTING)
|
||||||
fg = con_fg(f,FG_RED);
|
fg = con_fg(f,FG_RED);
|
||||||
@@ -334,25 +401,43 @@ void show_license(void)
|
|||||||
|
|
||||||
void show_version(int x)
|
void show_version(int x)
|
||||||
{
|
{
|
||||||
FILE *f = stdout;
|
FILE *fp = stdout;
|
||||||
|
const char *v;
|
||||||
UNUSED(x);
|
UNUSED(x);
|
||||||
|
UNUSED(v);
|
||||||
|
|
||||||
#if (0 && ACC_CC_GNUC)
|
fprintf(fp, "upx %s\n", UPX_VERSION_STRING);
|
||||||
fprintf(f,"upx %s (gcc 0x%06lx)\n", UPX_VERSION_STRING, ACC_CC_GNUC);
|
|
||||||
#else
|
|
||||||
fprintf(f,"upx %s\n", UPX_VERSION_STRING);
|
|
||||||
#endif
|
|
||||||
#if defined(WITH_NRV)
|
#if defined(WITH_NRV)
|
||||||
fprintf(f,"NRV data compression library %s\n", nrv_version_string());
|
v = upx_nrv_version_string();
|
||||||
|
if (v != NULL && v[0])
|
||||||
|
fprintf(fp, "NRV data compression library %s\n", v);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if defined(WITH_UCL)
|
||||||
fprintf(f,"UCL data compression library %s\n", ucl_version_string());
|
v = upx_ucl_version_string();
|
||||||
|
if (v != NULL && v[0])
|
||||||
|
fprintf(fp, "UCL data compression library %s\n", v);
|
||||||
#endif
|
#endif
|
||||||
fprintf(f,"Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer\n");
|
#if defined(WITH_ZLIB)
|
||||||
fprintf(f,"Copyright (C) 1996-2004 Laszlo Molnar\n");
|
v = upx_zlib_version_string();
|
||||||
fprintf(f,"Copyright (C) 2000-2004 John F. Reiser\n");
|
if (v != NULL && v[0])
|
||||||
fprintf(f,"Copyright (C) 2002-2004 Jens Medoch\n");
|
fprintf(fp, "zlib data compression library %s\n", v);
|
||||||
fprintf(f,"UPX comes with ABSOLUTELY NO WARRANTY; for details type `%s -L'.\n", progname);
|
#endif
|
||||||
|
#if defined(WITH_LZMA)
|
||||||
|
v = upx_lzma_version_string();
|
||||||
|
if (v != NULL && v[0])
|
||||||
|
fprintf(fp, "LZMA SDK version %s\n", v);
|
||||||
|
#endif
|
||||||
|
fprintf(fp, "Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer\n");
|
||||||
|
fprintf(fp, "Copyright (C) 1996-2007 Laszlo Molnar\n");
|
||||||
|
fprintf(fp, "Copyright (C) 2000-2007 John F. Reiser\n");
|
||||||
|
fprintf(fp, "Copyright (C) 2002-2007 Jens Medoch\n");
|
||||||
|
#if defined(WITH_ZLIB)
|
||||||
|
fprintf(fp, "Copyright (C) 1995" "-2005 Jean-loup Gailly and Mark Adler\n");
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_LZMA)
|
||||||
|
fprintf(fp, "Copyright (C) 1999" "-2006 Igor Pavlov\n");
|
||||||
|
#endif
|
||||||
|
fprintf(fp, "UPX comes with ABSOLUTELY NO WARRANTY; for details type '%s -L'.\n", progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2007 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user