Compare commits

..

384 Commits

Author SHA1 Message Date
David Given
7cde8e3aa6 Merge pull request #824 from davidgiven/ab
Update ab to the new ninja version.
2025-08-27 19:47:09 +01:00
David Given
34fe6f0a5f _Actually_ update ab. 2025-08-27 20:23:46 +02:00
David Given
76c9674f3f Update ab. 2025-08-27 20:21:29 +02:00
David Given
addbabd123 Disable make parallelism (although I'm not sure this will help). 2025-08-27 19:57:24 +02:00
David Given
46b90d9c36 Merge pull request #825 from boamaod/master
Correct Juku E5104 documentation
2025-08-27 13:44:49 +01:00
Märt Põder
7ee67082aa Fix ambigious description about "both sides" and update links 2025-08-27 13:22:09 +03:00
David Given
e8042ed5f3 Adjust parallelism settings again. 2025-08-27 11:40:34 +02:00
David Given
8828874c25 Don't run more than one ninja instance at a time. 2025-08-27 11:22:53 +02:00
David Given
1bdb093319 Update ab. 2025-08-27 02:10:08 +02:00
David Given
a1e2191ad5 mingw is less aggressive about dead code removal that other gccs are, so
we need to add dependencies in places where they're really not used.
2025-08-27 03:06:31 +02:00
David Given
e61fcf1d9b utils.shell now takes a command string rather than an argv list. 2025-08-27 02:28:29 +02:00
David Given
610ef0dc4b Remember to put set -e in front of command scripts. 2025-08-27 02:27:40 +02:00
David Given
273d38f237 Fix command detection when a command string contains multiple words. 2025-08-27 00:11:57 +02:00
David Given
8194a08382 Update ab. 2025-08-26 23:09:47 +02:00
David Given
6170b704b1 Fix escaping of $$ strings; then escape them again before passing to ninja! 2025-08-26 21:30:50 +02:00
David Given
b05f5e7caa Warning fix. 2025-08-26 14:29:27 +02:00
David Given
4b38fc6044 Update ab again. 2025-08-26 02:06:32 +02:00
David Given
cee16a75ca Fix Windows dependencies. 2025-08-26 01:37:28 +02:00
David Given
9fd85a8289 Add missing file. 2025-08-26 01:28:53 +02:00
David Given
2f1eff1474 Update documentation. 2025-08-26 01:27:33 +02:00
David Given
8c582b8d72 Update to the new ninja-fied ab. 2025-08-26 01:23:58 +02:00
David Given
e49673329d Merge pull request #823 from davidgiven/cleanup
Do some cleanup since the last changes.
2025-08-21 19:31:57 +02:00
David Given
07ebed83bf Fix some documentation from the global options change. 2025-08-21 19:14:26 +02:00
David Given
1def87fdc3 Remove the rawReadDiskCommand() function, as it's no longer used. 2025-08-21 19:00:29 +02:00
David Given
d91fed7dd4 Update documentation. 2025-08-21 18:59:02 +02:00
David Given
5f2f7e70ef Remove rawread and merge. 2025-08-21 18:55:46 +02:00
David Given
83432beff6 Merge pull request #822 from davidgiven/config
Overhaul the config file CLI.
2025-08-21 18:42:21 +02:00
David Given
979b550178 Looks like our string_view fix hasn't worked --- tweak. 2025-08-21 01:19:19 +02:00
David Given
9062a531f3 Migrate the 40track etc extension configs to actual options. Add the
ability to have --group=value options to make this cleaner.
2025-08-21 00:53:50 +02:00
David Given
e2a6fbcf3c Update a few places which used -c for other purposes. 2025-08-20 21:30:06 +02:00
David Given
ec16931f3a Update documentation for -c. 2025-08-20 21:23:02 +02:00
David Given
0ec0ca7495 Config files are now specified with -c, rather than via filename
arguments, because otherwise you get really unhelpful error messages
when you get things wrong.
2025-08-20 21:19:34 +02:00
David Given
51fa7c9371 Fix broken link.
Closes: #799
2025-08-20 00:23:21 +02:00
David Given
6c69f10fe7 Merge pull request #821 from davidgiven/protobuf
Expose the .app on OSX (in a zipfile).
2025-08-20 00:17:43 +02:00
David Given
206e85a356 Expose the .app on OSX (in a zipfile).
Closes: #800
2025-08-20 00:02:43 +02:00
David Given
8d7dd4867b Merge pull request #820 from davidgiven/protobuf
Apply the fix from #811 to make everything build against Protobuf 31.
2025-08-19 23:43:26 +02:00
David Given
d1524f78fb Apply the fix from #811 to make everything build against Protobuf 31. 2025-08-19 23:28:19 +02:00
David Given
b26735d520 Merge pull request #819 from davidgiven/fl2
Add some flux file manipulation tools.
2025-08-19 22:58:05 +02:00
David Given
603baee777 Fix a subtle bug that was causing misparsing of indexed fields on OSX. I hate
C++.
2025-08-19 22:43:45 +02:00
David Given
e105b7f498 Merge from master. 2025-08-19 20:13:41 +02:00
David Given
bb3fbccb50 Merge pull request #818 from davidgiven/convert
Add a fe-convert (plus all the necessary backend work).
2025-08-19 19:59:12 +02:00
David Given
c8edcd963d Merge pull request #817 from davidgiven/ab
Update ab.
2025-08-19 01:32:40 +02:00
David Given
3b60cdc707 Remove the -j from the build scripts for OSX. 2025-08-19 01:15:47 +02:00
David Given
ea061d65c9 Update ab. 2025-08-19 01:14:33 +02:00
David Given
da64c0237f Update documentation. 2025-08-19 01:11:40 +02:00
David Given
d2b1602881 Add a working fluxfile cp. 2025-08-19 00:55:53 +02:00
David Given
1afd45068c Merge. 2025-08-19 00:18:59 +02:00
David Given
f01b30e112 Make fluxfile rm work. 2025-08-19 00:18:47 +02:00
David Given
b5f7fbe14e Finally come up with a fluxfile ls I can live with. 2025-08-18 23:59:57 +02:00
David Given
8b6073ccbb Try making the error collector non-constexpr? 2025-08-18 22:14:48 +02:00
David Given
f902c759df Try the suggested workaround in lexy for older compilers. 2025-08-18 22:10:06 +02:00
David Given
996fdbc0f5 More overhauling of the proto layer; fluxfile ls now works. 2025-08-18 00:37:42 +02:00
David Given
9ff3e3b42a Finally make the getters and setters work with repeated fields. 2025-08-17 23:04:14 +02:00
David Given
0a5604521e Merge in fluxfile stuff. 2025-08-17 21:12:27 +02:00
David Given
786636ef5d Don't allow writing Apple 2 flux images to SCP files, because there
isn't space for the quarter-step tracks.
2025-08-17 11:42:34 +02:00
David Given
18bdb27225 fluxengine convert now uses the same syntax as the other tools. 2025-08-17 11:26:16 +02:00
David Given
faca35dec0 Update documentation. 2025-08-17 10:51:50 +02:00
David Given
f8813daae3 Attempt to make work on Windows. 2025-08-17 10:47:54 +02:00
David Given
da5a20390f Fix unhelpful message. 2025-08-17 10:40:34 +02:00
David Given
3ab3db92f5 Add basic support for TI-99 disks. 2025-08-17 10:40:07 +02:00
David Given
a3cd3dd9dc Adjust dependencies. 2025-08-17 09:45:54 +02:00
David Given
918868e9e8 Try updating the Ubuntu version. 2025-08-17 09:43:10 +02:00
David Given
cf05a25445 Does _error_collector need a constexpr constructor and destructor? 2025-08-17 01:01:32 +02:00
David Given
5d5399a267 Add another weirdly missing file. 2025-08-17 00:55:10 +02:00
David Given
2de7af0ba5 Add weirdly missing file. 2025-08-17 00:52:01 +02:00
David Given
0382c304ad Warning fix. 2025-08-17 00:46:50 +02:00
David Given
182d9946fe Add missing file. 2025-08-17 00:40:55 +02:00
David Given
f24e4029b4 Flux sources now add the locations of their data to _extraConfig ---
which is now honoured. Fix a bunch of bugs in some of the flux sources
and sinks. The converter now actually works, maybe.
2025-08-17 00:38:25 +02:00
David Given
4ebda29171 Rename track -> cylinder in lots of places. 2025-08-16 17:39:55 +02:00
David Given
53026f3d02 Rework the way locations are handled to use the new locations
microformat rather than the old RangeProto.
2025-08-16 16:59:44 +02:00
David Given
99c0e95a2f Added a routine for parsing location lists using Lexy. 2025-08-15 23:39:21 +02:00
David Given
dfa56c6b08 Raw import of Lexy. 2025-08-14 23:36:31 +02:00
David Given
0419df4b2d Another archival checkin... 2025-08-13 23:00:08 +02:00
David Given
70bdcd0978 Non-functioning archival checkin. 2025-08-12 20:31:54 +01:00
David Given
022df995aa Update for newer C++. 2025-08-11 16:21:03 +01:00
David Given
dcbe7ec41d Raw import of alphanum. 2025-08-11 16:14:27 +01:00
David Given
df4d27eefe Better support for repeated fields in the config language. Add a helper
for showing all config fields in a proto.
2025-08-10 22:22:58 +01:00
David Given
8f233f55e9 Add fluxfile ls. 2025-07-28 23:20:41 +01:00
David Given
7db49aec21 Merge pull request #814 from davidgiven/build
Update ab.
2025-07-28 13:36:21 +02:00
David Given
b5eaec0778 Try more Windows fix? 2025-07-28 12:23:41 +01:00
David Given
06b126a2e7 Typo fix. 2025-07-27 23:20:32 +01:00
David Given
ed96ebac79 Another Windows fix. 2025-07-27 23:08:37 +01:00
David Given
c6e34d2d88 Alternative Windows fix. 2025-07-27 22:50:43 +01:00
David Given
53ac8bad79 Hopefully fix Windows. 2025-07-27 21:43:26 +01:00
David Given
d2e163bc3b More Windows build debugging. 2025-07-27 21:33:52 +01:00
David Given
1404123281 Windows debugging. 2025-07-27 21:20:28 +01:00
David Given
01a7afd28a Merge from master. 2025-07-27 20:48:27 +01:00
David Given
3a42911e6f Update ab. 2025-07-27 20:48:10 +01:00
David Given
8e5d52f2c7 Update ab. 2025-07-24 23:25:41 +02:00
David Given
dfff5d7230 Merge pull request #796 from davidgiven/layout
Fix and expand the layout support to allow libdsk `altback` layouts.
2025-07-21 00:29:10 +02:00
David Given
19b63786c8 Merge from master. 2025-07-21 00:01:41 +02:00
David Given
5293e1c18b Merge pull request #792 from davidgiven/builds
Make an attempt to switch to WSL 1 for better builds.
2025-04-24 21:07:12 +02:00
David Given
f200bb8b00 Update documentation. 2025-04-24 21:06:32 +02:00
David Given
ed11a5c412 Update release build script to match. 2025-04-24 21:04:21 +02:00
David Given
cdcc63f519 Disable the Debian 11 build, as it doesn't work. Try WSL1 again. 2025-04-24 20:49:44 +02:00
David Given
7096e9fd9c Disable Windows verbose builds. 2025-04-24 19:41:46 +02:00
David Given
c8fe56ea95 Switch the sandbox back to hardlinks. 2025-04-24 19:41:38 +02:00
David Given
8a2a58b1a5 Hopefully beat the OSX build into working. 2025-04-24 01:16:54 +02:00
David Given
42aec98368 Add missing file. 2025-04-22 23:11:43 +02:00
David Given
6d73371a79 Update ab. 2025-04-22 23:10:51 +02:00
David Given
4d60ff8e67 Update ab. 2025-03-20 02:11:10 +01:00
David Given
311ff4a89f Add in some missing dependencies. 2025-03-19 03:01:10 +01:00
David Given
5d57957a6e Add missing dependency. 2025-03-18 01:19:58 +01:00
David Given
f89adce02d Add missing file. 2025-03-18 01:08:09 +01:00
David Given
3e505f47bc It now builds properly! 2025-03-18 01:05:07 +01:00
David Given
06e29142e6 Arch files are now built as one library per subdirectory, and everything
is autodetected.
2025-03-18 00:37:07 +01:00
David Given
15a69f6dcb Make build with the new ab --- but the tests fail. 2025-03-17 22:33:54 +01:00
David Given
0f763fe06b Patch up for the libfmt change and update to c++20.Patch up for the
libfmt change and update to c++20.
2025-03-12 01:22:18 +01:00
David Given
f5adb89338 Upgrade dep/fmt to 11.1.4. 2025-03-12 01:07:17 +01:00
Märt Põder
36b120bdbe Add Juku 5104 floppies with a new filesystem_track_order option 2024-11-30 15:31:24 +02:00
David Given
cc169d414f Add experimental support for libdsk 'altback' mode layouts. 2024-11-29 22:39:34 +01:00
David Given
0fcb2075e0 Move filesystem_track_ordering from ImageReaderProto/ImageWriterProto to
ImgInputOutputProto; it now only applies to img files. Make it honour the
appropriate track layout setting too.
2024-11-29 22:30:33 +01:00
David Given
2bda78fb40 Distinguish between filesystem track ordering and image track ordering
(although currently only the filesystem ordering is used).
2024-11-29 22:07:58 +01:00
David Given
e878c6eef6 Remove the unused sector_order field from FilesystemProto. 2024-11-29 21:24:32 +01:00
David Given
9ce405cec5 Remove the broken install rule. 2024-11-24 23:10:48 +01:00
David Given
f064d413b3 Add a docker test for Manjaro Linux. 2024-11-24 22:50:44 +01:00
David Given
e5a3331f24 Enable debug tracing. 2024-11-22 21:44:56 +01:00
David Given
6f99f88b29 Merge from master. 2024-11-22 21:22:24 +01:00
David Given
8ff0153708 Add fedora 40 docker test. 2024-11-22 21:21:05 +01:00
David Given
c7273c06da Add docker tests for Fedora 41. 2024-11-22 21:17:34 +01:00
David Given
cd36caccc7 Warning fix. 2024-11-22 20:34:00 +01:00
David Given
a022aab28a Change the wx library order. 2024-11-09 20:52:47 +01:00
David Given
949e9c216d No, we need to stick with WSL2. 2024-11-09 19:35:03 +01:00
David Given
3fcf7d4e69 More adjust. 2024-11-09 19:11:00 +01:00
David Given
e335621558 Adjust. 2024-11-09 19:04:50 +01:00
David Given
9a0357c67b Fix filename. 2024-11-09 18:56:30 +01:00
David Given
0953039369 Try using WSL 1 with Fedora 41. 2024-11-09 18:52:34 +01:00
David Given
d4a8eb5847 More. 2024-11-09 18:19:14 +01:00
David Given
d48ab7c84e Adjust Docker setup script. 2024-11-09 18:00:15 +01:00
David Given
c43b88ac0b Try doing a Debian 11 build on github. 2024-11-09 17:59:02 +01:00
David Given
76ffbb96ba Remember to update the autorelease script for the new Fedora rpmsphere. 2024-11-09 14:05:25 +01:00
David Given
b6b28c8a02 Merge pull request #791 from davidgiven/docker
Make work on Debian 11.
2024-11-09 13:37:27 +01:00
David Given
a736e1da05 Upgrade rpm sphere to release 40. 2024-11-09 00:35:28 +01:00
David Given
a8cc280574 Looks like we need special options for OSX. 2024-11-08 22:15:35 +01:00
David Given
da9d9385b9 Another try at fixing the custom formatter. 2024-11-08 21:32:59 +01:00
David Given
149e5c6fba Make work on Debian 11. Add some Docker tests to make sure it keeps working on
Debian 11.
2024-11-08 21:07:17 +01:00
David Given
e14da81b48 Merge pull request #790 from davidgiven/ab
Update ab. Again.
2024-11-07 21:20:43 +01:00
David Given
49a0a6fdb3 Fix things caused by the ab upgrade. 2024-11-07 21:16:27 +01:00
David Given
da678dc52d Update ab. 2024-11-07 21:07:20 +01:00
David Given
6ff68f3f06 Update ab. 2024-11-07 21:06:56 +01:00
David Given
33feda7208 Update ab. 2024-10-23 14:34:38 +02:00
David Given
38af98ec9b Reformat. 2024-10-19 18:02:16 +02:00
David Given
d6a11d7164 Merge pull request #786 from davidgiven/refactor
Even more refactoring.
2024-10-19 17:32:44 +02:00
David Given
33d241c33e Move common.proto into config. 2024-10-19 16:58:44 +02:00
David Given
944ac97ba4 Move layout proto into config. 2024-10-19 16:44:02 +02:00
David Given
bb6e8dc6b2 Move the drive proto into config. 2024-10-19 16:34:34 +02:00
David Given
ed604f6284 Finally eliminate the +lib target. 2024-10-19 13:18:28 +02:00
David Given
3c67a67ae7 Merge pull request #785 from davidgiven/ab
Update ab.
2024-10-19 00:49:14 +02:00
David Given
f3e7a4e439 Update ab. 2024-10-19 00:27:38 +02:00
David Given
fb5bb874dd Update ab. 2024-10-19 00:19:05 +02:00
David Given
d3ccb4b0d7 Merge pull request #784 from davidgiven/refactor
Even more cleanup.
2024-10-18 21:15:04 +02:00
David Given
d096d7742f Adjust the number of OSX cpus. 2024-10-16 22:57:21 +02:00
David Given
92b5accb90 Tidy rule count. 2024-10-16 22:37:47 +02:00
David Given
1bcc8f45b5 Modularise encoders. Change arch to not depend on +lib. 2024-10-16 22:00:51 +02:00
David Given
5eef01377f Modularise decoders. 2024-10-16 21:52:53 +02:00
David Given
4c140b1b90 Modularise arch. 2024-10-16 21:17:59 +02:00
David Given
4bcbf2b089 Fix bad documentation which got checked in somehow. 2024-10-16 21:17:43 +02:00
David Given
6d3969ab79 Split the dependency so that the encoders/decoders don't depend on arch. 2024-10-16 21:00:48 +02:00
David Given
ea35551b9d Merge. 2024-10-16 20:28:46 +02:00
David Given
0d4c747a05 Merge pull request #783 from davidgiven/osx
More build script fixes.
2024-10-16 17:52:41 +02:00
David Given
6cc7d7b8fe Update build script... again. 2024-10-16 14:22:59 +02:00
David Given
3d0f82e4c6 Update ab. 2024-10-16 14:21:47 +02:00
David Given
26abcbaf81 Adjust OSX scripts... again. 2024-10-16 14:12:09 +02:00
David Given
f7efaa37f5 Merge pull request #782 from davidgiven/osx
Fix OSX builds.
2024-10-16 01:38:34 +02:00
David Given
167bb0287e Fix a stray header. 2024-10-16 01:29:35 +02:00
David Given
3020705012 Modularise imagewriter. 2024-10-16 01:12:35 +02:00
David Given
ecd80775d8 Modularise fluxsource. 2024-10-16 01:00:48 +02:00
David Given
c42e73f17a Modularise fluxsink and usb. 2024-10-16 00:41:57 +02:00
David Given
ec271a67ad Move the flx stuff into external. 2024-10-16 00:00:09 +02:00
David Given
ce4a9cfbd7 OSX 15 runners seem hard to find? 2024-10-15 23:36:58 +02:00
David Given
45f769893c Try and update the build scripts to use a matrix. 2024-10-15 23:07:36 +02:00
David Given
8a23046187 Fix another protocc invocation. 2024-10-15 22:48:48 +02:00
David Given
ca8f2a886e Was this the problem? 2024-10-15 22:45:50 +02:00
David Given
9dc6bdb03b Return of debugging. 2024-10-15 22:37:21 +02:00
David Given
c9b3e5e7e5 Bride of debugging. 2024-10-15 22:32:57 +02:00
David Given
f0ce9c1431 Even more debugging. 2024-10-15 22:12:48 +02:00
David Given
0b22593572 More debugging. 2024-10-15 22:11:06 +02:00
David Given
2fd1115ec9 Add debugging. 2024-10-15 22:05:42 +02:00
David Given
38d4bbdba1 Try upgrading the OSX version on CI. 2024-10-15 21:45:31 +02:00
David Given
cb9325843e Merge pull request #781 from davidgiven/refactor
More refactoring and modularisation.
2024-10-15 21:44:56 +02:00
David Given
900ba11623 Move csvreader into external. Why was it in core? 2024-10-15 00:56:57 +02:00
David Given
7da4e15b73 Move the Kryoflux and Catweasel stuff into external. 2024-10-15 00:52:02 +02:00
David Given
7983a4b883 Move the external file format stuff into its own module. 2024-10-15 00:46:46 +02:00
David Given
ea4a147751 Move fluxmapreader/fluxpattern into data. 2024-10-15 00:00:27 +02:00
David Given
33495e812e Update ab. 2024-10-14 23:29:09 +02:00
David Given
c6e2958665 Update ab. 2024-10-14 23:14:36 +02:00
David Given
86ede224ac Merge pull request #778 from davidgiven/refactor
Even more cleanup refactoring.
2024-10-14 00:35:08 +02:00
David Given
e07a906731 Silence some warnings. 2024-10-13 23:39:03 +02:00
David Given
76d139c29e Remember to add a virtual descructor to LogRenderer. 2024-10-13 23:32:41 +02:00
David Given
4b8487f164 Add missing file. 2024-10-13 23:27:12 +02:00
David Given
a006e0bf6f Overhaul the log stuff to actually work again (better). 2024-10-13 23:26:12 +02:00
David Given
c5373480ba Move a lot of the data-handling utilities into their own module. 2024-10-13 13:35:48 +02:00
David Given
e1f2494966 Create a config module containing all the configuration, proto and flags
stuff.
2024-10-13 11:57:18 +02:00
David Given
9ddfa5a56b Move the logger into core. 2024-10-13 11:39:33 +02:00
David Given
6339cd6b31 Move the routines which render log messages out of logger.cc; this breaks the
dependency which required logger.cc to have access to the entire rest of the
system. Although we still need to forward declare all the log messages.
2024-10-13 11:20:27 +02:00
David Given
7e80e255a4 Config no longer depends on Flux/Image/Encode/Decode, breaking a circular
dependency.
2024-10-12 01:49:13 +02:00
David Given
c6cbae4bc4 Merge pull request #777 from davidgiven/refactor
Lots more refactoring to build in a more modular way (and with a dramatically improved ab).
2024-10-11 22:45:59 +02:00
David Given
68f239765c Update ab. 2024-10-11 21:49:15 +02:00
David Given
77c57d7344 Update ab. 2024-10-09 23:03:35 +02:00
David Given
259c5d67e6 Update ab. 2024-10-09 22:36:42 +02:00
David Given
4c2fa27717 Update ab. 2024-10-09 15:40:01 +02:00
David Given
f5b14cadf8 Use "" to access the fmt headers, not <>, or else Windows can't find the
fallback library.
2024-10-09 15:10:22 +02:00
David Given
e154e41bc0 Alternate flag for thin archives. 2024-10-09 01:49:35 +02:00
David Given
1f2ebe8c33 Fixup due to bad intermediate files... 2024-10-09 01:37:15 +02:00
David Given
28444b7907 imagewriter protos built separately. 2024-10-09 01:30:28 +02:00
David Given
75f41fc630 imagereader proto built separately. 2024-10-09 01:28:07 +02:00
David Given
d091479f29 decoders protos now built separately. 2024-10-09 01:25:54 +02:00
David Given
665ceb9ea6 Add missing file. 2024-10-08 23:24:07 +02:00
David Given
27ab1e3e5a Refactor a lot of the proto stuff. 2024-10-08 23:18:30 +02:00
David Given
a777470cda Update ab. 2024-10-02 19:46:50 +02:00
David Given
f48d1c5196 Add progress info to MKDOC. 2024-10-02 11:38:24 +02:00
David Given
cee893b845 Merge pull request #774 from davidgiven/refactor
Do a lot of badly needed refactoring so that things aren't built as one huge library.
2024-10-02 11:34:24 +02:00
David Given
07ccb6319a Tweak dependencies. 2024-10-02 01:16:38 +02:00
David Given
a6981ff7ef Split the FluxmapReader and FluxPattern files. 2024-10-02 00:42:06 +02:00
David Given
fc8d0283b1 Remove the applesauce.cc and test, as it's not used any more. 2024-10-02 00:28:04 +02:00
David Given
5e892e8fc3 Fixup for Applesauce. 2024-10-02 00:23:39 +02:00
David Given
8b124e5ced Merge. 2024-10-01 23:58:48 +02:00
David Given
65dc707c29 Merge pull request #773 from davidgiven/applesauce
Add basic support for Applesauce hardware.
2024-10-01 23:52:37 +02:00
David Given
65fb3e9e76 Detect index marks and interleave them into the flux stream. 2024-10-01 22:26:02 +02:00
David Given
3a0c02459d Add documentation for the Applesauce. 2024-10-01 21:50:33 +02:00
David Given
33f3c97b03 Crudely hack in a lock against writing, as I'll have to wait for the v3
firmware.
2024-10-01 21:30:53 +02:00
David Given
c55032531c Move the VFS stuff into its own library. 2024-10-01 21:06:14 +02:00
David Given
12f999e9e4 Move hexdump into core. 2024-10-01 21:00:22 +02:00
David Given
817cf03592 Fixup after last checkin. 2024-10-01 20:55:02 +02:00
David Given
ca940d1599 Refactor core libraries into their own library. 2024-10-01 20:36:53 +02:00
David Given
d00fba02a0 Rename greaseWeazle to greaseweazle (as it needs doing). 2024-09-30 22:03:17 +02:00
David Given
045e5e7303 Rename write_clock to write_clock_ns, because it is. Tweak the default value
for correctness.
2024-09-30 22:02:09 +02:00
David Given
6fd98e3c67 Writing with the Applesauce now mostly works, although there's still stuff to
be dealt with.
2024-09-29 23:40:19 +02:00
David Given
98279e44ef Remove stray logging. 2024-09-29 23:39:59 +02:00
David Given
22b78cee56 Report which flag could not be recognised on error. 2024-09-29 23:39:32 +02:00
David Given
8f7203e38b Fix testpattern: to actually work. 2024-09-29 23:12:02 +02:00
David Given
38b8cd2574 Reads mostly work; writes not yet. 2024-09-29 13:05:46 +02:00
David Given
6b28f36b97 getVersion() doesn't need to be a public USB method. 2024-09-28 23:44:33 +02:00
David Given
d394b21920 Got our first track read! 2024-09-28 23:39:30 +02:00
David Given
14255a5076 Successfully read raw Applesauce data. 2024-09-28 23:07:05 +02:00
David Given
8fa1a887ce Initial work towards Applesauce support --- you can connect to the device and
test bandwidth.
2024-09-28 20:04:54 +02:00
David Given
fb6fa969a8 Update release script. 2024-09-28 17:05:41 +02:00
David Given
2840831017 Initial boilerplate for the Applesauce. 2024-09-28 17:03:59 +02:00
David Given
a4a83c6cfc Merge pull request #770 from davidgiven/ab
Update ab.
2024-09-28 16:55:52 +02:00
David Given
2c508cf51d Give artifacts unique names. 2024-09-28 16:08:59 +02:00
David Given
e02aa00d07 WSL2 works, so use it for the release script. 2024-09-28 13:35:48 +02:00
David Given
dc384c3635 Pre-release doesn't work. 2024-09-28 12:44:12 +02:00
David Given
69db44d1cf Try WSL 2. 2024-09-28 12:42:50 +02:00
David Given
6fdc9a252a Update ab. 2024-09-28 12:35:22 +02:00
David Given
11166a3c5c Try using the prerelease wsl. 2024-09-28 12:19:00 +02:00
David Given
3b2a3c6e3a Make the _progress script a bit more robust. 2024-09-28 12:12:58 +02:00
David Given
d890383ad2 Update ab. 2024-09-28 12:07:10 +02:00
David Given
4c4b6ee045 Try setting WSL1 explicitly. 2024-09-19 16:31:31 +02:00
David Given
a55196e7e5 Update ab. 2024-09-19 16:15:27 +02:00
David Given
866d5a2933 Update ab. 2024-09-19 00:55:45 +02:00
David Given
8cba89722b Mutter mutter. 2024-09-12 00:19:11 +02:00
David Given
6d1c623716 Typo fix. 2024-09-12 00:17:26 +02:00
David Given
a8c7ffc77d Update Fedora WSL. 2024-09-12 00:15:16 +02:00
David Given
fb05b6ac6d Merge pull request #769 from davidgiven/ab
Update ab.
2024-09-11 23:17:11 +02:00
David Given
0e83b2e7df Try building with macos-13. 2024-09-11 21:37:22 +02:00
David Given
1baaa4402d Merge. 2024-09-10 21:24:50 +02:00
David Given
2af61e4aca Update ab. 2024-09-10 21:22:17 +02:00
David Given
db235dae5e Merge. 2024-09-10 21:21:54 +02:00
David Given
241878bd0e New fmt requires a slight API change. 2024-09-10 21:12:58 +02:00
David Given
1386e343ec New fmt requires a slight API change. 2024-09-10 21:12:58 +02:00
David Given
9ff51ec8ef Update CI script. 2024-09-10 19:53:44 +02:00
David Given
45036b708f Update CI script. 2024-09-10 19:53:44 +02:00
David Given
ec3b5b10df Adjust default Brother head_bias, and fix the documentation.
Fixes: #768
2024-09-10 18:32:03 +02:00
David Given
4817298dbb Update ab. 2024-09-10 17:55:45 +02:00
David Given
af0ce4cf35 Update ab. 2024-09-02 23:51:03 +02:00
David Given
3c3d8d080c Merge pull request #763 from davidgiven/protos
Encode all the protos in one go (per library), as it's vastly faster.
2024-08-12 17:43:35 +02:00
David Given
dc6af483a5 Remember to build the drivetypes table. 2024-08-12 17:32:13 +02:00
David Given
9a0b487f4b Remember to build the formats table. 2024-08-12 17:26:28 +02:00
David Given
cac4d1ce86 Encode all the protos in one go (per library), as it's vastly faster. 2024-08-12 12:36:39 +02:00
David Given
7a3a31a929 Merge pull request #759 from davidgiven/a2r
Improve the A2R writer.
2024-07-31 23:45:51 +02:00
David Given
eee6f95b15 Typo fix. 2024-07-31 13:48:06 +02:00
David Given
7a3d10451d Rework the A2R writer to be a bit less broken. 2024-07-30 22:54:59 +02:00
David Given
e4f1a5a06f Merge pull request #752 from davidgiven/tartu
Add encoder support for the Tartu format.
2024-05-14 21:48:36 +02:00
David Given
500fcde21b Merge. 2024-05-14 21:41:30 +02:00
David Given
eb363a4b2a Update Tartu documentation. 2024-05-14 21:40:50 +02:00
David Given
8a78e609b0 And fix everywhere else... 2024-05-13 23:41:37 +02:00
David Given
15c67b8cc1 Bash into workingness on OSX. 2024-05-13 23:27:53 +02:00
David Given
00e9c5a07f Add support for updating file metadata (only the SRA bits, really). 2024-05-13 21:44:58 +02:00
David Given
7643457374 Add support for renaming files. 2024-05-13 21:12:42 +02:00
David Given
78d5584e21 Add creeate, put and delete support to the CP/M filesystem driver. 2024-05-13 00:32:57 +02:00
David Given
1d1143a893 Merge from master. 2024-05-10 00:19:57 +02:00
David Given
91093e1304 Merge pull request #754 from davidgiven/greaseweazle
Correctly twiddle DTR on Linux/OSX when changing baud rates.
2024-05-01 19:11:57 +02:00
David Given
1175a06f3d Merge from master. 2024-05-01 16:23:59 +02:00
David Given
6e5abd1189 Merge from master. 2024-05-01 16:23:38 +02:00
David Given
34f97384e7 Merge pull request #753 from davidgiven/osx
Fix OSX build problems.
2024-05-01 16:23:09 +02:00
David Given
653a6a0189 Be more consistent about DTR toggling (needed to reset serial devices). 2024-05-01 12:54:22 +02:00
David Given
f0b1b61eac Merge pull request #749 from p-j-b/fix-hang-windows-adafruit-floppy-greaseweazle
Set DTR after calling SetCommState
2024-05-01 12:46:08 +02:00
David Given
c0fd121bdf Restore build script to normal. 2024-05-01 00:25:41 +02:00
David Given
b805b86ddb Fix truncate arg ordering because of stupid OSX. 2024-05-01 00:25:10 +02:00
David Given
654e7e750c Fix truncate arg ordering because of stupid OSX. 2024-05-01 00:25:10 +02:00
David Given
7501fcfe8b Looks like compiling protobuf files now requires access to the protobuf
libraries.
2024-05-01 00:18:18 +02:00
David Given
fdb7837e03 Looks like compiling protobuf files now requires access to the protobuf
libraries.
2024-05-01 00:18:18 +02:00
David Given
1c57cea483 Try and debug the OSX build failure. 2024-05-01 00:00:30 +02:00
David Given
0c8e8d4d69 Remember to mark the 40-track format as being such. 2024-04-30 23:09:45 +02:00
David Given
8876aae2cc Calculate gaps in bits, not bytes (more accurate). Pad the end of the track to
avoid weirdness reading the last sector.
2024-04-30 23:09:30 +02:00
David Given
3e053b32e2 Display a useful command to repeat a test if one fails. 2024-04-30 23:07:10 +02:00
David Given
0611728537 Don't try to change the build system just yet. 2024-04-30 21:32:58 +02:00
David Given
a84cf83ce5 Add a prototype Tartu encoder. 2024-04-30 00:56:26 +02:00
David Given
c064aa7862 Merge pull request #751 from davidgiven/tartu
Add support for the Tartu Palivere.
2024-04-23 22:21:05 +02:00
David Given
195f7126cc Update link. 2024-04-23 21:58:42 +02:00
David Given
50d466c9c1 Update Tartu documentation. 2024-04-23 21:56:42 +02:00
David Given
5763574634 Update documentation. 2024-04-21 01:18:17 +02:00
David Given
2da568b3e8 Update the Tartu documentation. 2024-04-21 00:35:39 +02:00
David Given
2732d9aec8 Get the Tartu checksums working, and hook up the CP/M filesystem code. 2024-04-21 00:17:11 +02:00
David Given
15d34aff15 Work-in-progress Tartu decoder. 2024-04-20 01:20:49 +02:00
David Given
af3e257c78 Add boilerplate for the Tartu. 2024-04-19 21:10:49 +02:00
p-j-b
c2248c7e4a Added CLRDTR and SETDTR to setBaudRate
Fixes hang in Windows with Adafruit Floppy GreaseWeazle
2024-04-02 13:05:29 +01:00
David Given
a7967b6dc3 More release script tweaks. 2024-03-31 22:50:55 +02:00
David Given
c1f47921e6 Adjust release script. 2024-03-31 22:38:21 +02:00
David Given
cda93d516b Merge pull request #748 from davidgiven/windows
Switch from MSYS builds to WSL/Fedora builds.
2024-03-31 22:31:36 +02:00
David Given
8f9c12b26c Update the release build script. 2024-03-31 22:18:56 +02:00
David Given
cdb4e9ed21 Typo fix. 2024-03-31 22:00:27 +02:00
David Given
1a612c3db5 Pull the .a file out of fallback targets at make time, not at config time. 2024-03-31 21:53:40 +02:00
David Given
72ab957134 Remember to build C++ files with g++. 2024-03-31 21:44:12 +02:00
David Given
621523db62 Try not to build fallback packages unless necessary. 2024-03-31 21:30:26 +02:00
David Given
cdf9cc387c Finally, it works! 2024-03-31 18:42:37 +02:00
David Given
b84ecd289d Again. 2024-03-31 18:25:36 +02:00
David Given
d4cb8f414a Again. 2024-03-31 18:06:19 +02:00
David Given
8180c1f79e Again. 2024-03-31 17:47:16 +02:00
David Given
b23b21a7bf Again. 2024-03-31 17:38:36 +02:00
David Given
b30eff294d Again. 2024-03-31 15:45:54 +02:00
David Given
cacb397198 Again. 2024-03-31 15:36:28 +02:00
David Given
0f8c7d6969 Again. 2024-03-31 15:13:43 +02:00
David Given
7b35232cad Again. 2024-03-31 14:47:44 +02:00
David Given
43624796db Again. 2024-03-31 14:30:52 +02:00
David Given
bc17c624d3 Again. 2024-03-31 14:10:53 +02:00
David Given
61476ea0cc Again. 2024-03-31 13:59:19 +02:00
David Given
f0663030e1 Again. 2024-03-31 13:39:19 +02:00
David Given
989a11931b Add libssp. 2024-03-31 13:27:00 +02:00
David Given
94372a7f09 Again. 2024-03-31 13:12:39 +02:00
David Given
5c2702c6ab Again. 2024-03-31 13:07:07 +02:00
David Given
586c09f5c3 Again. 2024-03-31 12:53:49 +02:00
David Given
7a94123f0d Again. 2024-03-31 12:31:58 +02:00
David Given
4cad34a8a4 Update ccpp.yml 2024-03-31 00:30:14 +01:00
David Given
c0ef3215df Update ccpp.yml 2024-03-30 23:48:40 +01:00
David Given
08982aae7a Update ccpp.yml 2024-03-30 23:34:38 +01:00
David Given
6366ac6639 Update ccpp.yml 2024-03-30 23:08:14 +01:00
David Given
3807d22a78 Update ccpp.yml 2024-03-30 22:57:18 +01:00
David Given
3adbfd7ef5 Update ccpp.yml 2024-03-30 22:52:56 +01:00
David Given
7e40dfa5da Update ccpp.yml 2024-03-30 22:45:15 +01:00
David Given
62ddca2bb4 Update ccpp.yml 2024-03-30 22:44:20 +01:00
David Given
1a59e5065d Update ccpp.yml 2024-03-30 22:36:39 +01:00
David Given
52c0c409e9 Update ccpp.yml 2024-03-30 22:35:28 +01:00
David Given
e74b16d28b Update ccpp.yml 2024-03-30 22:29:37 +01:00
David Given
c2369bcc31 Again. 2024-03-30 22:23:26 +01:00
David Given
2636352a49 Try doing real work. 2024-03-30 23:03:57 +01:00
David Given
222a88f097 Again. 2024-03-30 21:01:14 +01:00
David Given
dbc691726d Again. 2024-03-30 20:55:04 +01:00
David Given
9ff3aedf18 Again. 2024-03-30 20:53:20 +01:00
David Given
8303a1fbca Again. 2024-03-30 20:51:12 +01:00
David Given
0f584ee343 Can we install the Fedora WSL system? 2024-03-30 20:50:18 +01:00
David Given
aafad0a628 Install the rest of the packages. 2024-03-30 20:35:08 +01:00
David Given
9d03951da9 Try installing OpenSUSE packages. 2024-03-30 20:28:53 +01:00
David Given
b15d6cb8e5 Try out a WSL github workflow. 2024-03-30 20:25:42 +01:00
David Given
f9c1816e6f Format. 2024-03-30 19:29:48 +01:00
David Given
d960b020ea Get the executables building on WSL2 Fedora. 2024-03-30 19:14:02 +01:00
David Given
72e9d57b15 Raw import of libfmt. 2024-03-30 14:09:18 +01:00
David Given
968b90dbab Merge pull request #747 from davidgiven/ab
Convert to the latest ab.
2024-03-30 00:35:22 +01:00
David Given
2bccdcc93b Disable more Windows builds. 2024-03-30 00:25:01 +01:00
David Given
ce2a5eb6d9 Disable Windows builds. 2024-03-30 00:23:26 +01:00
David Given
353e4f6210 Try to fix OSX build. 2024-03-30 00:20:56 +01:00
David Given
c115de9d40 Update to build with ab. 2024-03-29 23:53:05 +01:00
David Given
df83b558bf Merge pull request #742 from davidgiven/devices
Don't print the detection banner if no devices were detected.
2024-01-30 22:59:18 +01:00
David Given
7c2b5f116d Don't print the detection banner if no devices were detected. 2024-01-30 22:58:40 +01:00
David Given
30fe75f9bf Merge pull request #741 from davidgiven/devices
Add a command to list detectable devices on the command line.
2024-01-30 22:57:01 +01:00
David Given
401e7a9edb The rpm command now defaults to use real hardware, like it should. 2024-01-30 22:36:16 +01:00
David Given
fd4ddc56f2 Add a command to list detectable devices on the command line. 2024-01-30 21:44:11 +01:00
David Given
83d907bf71 Do parallel builds on OSX. 2024-01-30 21:28:03 +01:00
David Given
327bc76c6e Another try at making OSX builds work. 2024-01-22 22:31:51 +01:00
David Given
fdd39fb2d8 Try to fix OSX builds. 2024-01-22 22:16:49 +01:00
David Given
bfcfa8eb19 Merge pull request #738 from davidgiven/overrides
Fix a whole pile of missing 'override' keywords.
2024-01-22 21:08:27 +01:00
David Given
7095c03e28 Fix a whole pile of missing 'override' keywords. 2024-01-22 20:55:38 +01:00
David Given
45e796f15f Merge pull request #736 from davidgiven/ab
Remove stray files.
2024-01-07 23:20:02 +01:00
David Given
3d1dcd6874 imagemagick is just too much trouble for creating icons, so use png2ico instead. 2024-01-08 00:05:18 +01:00
David Given
0033d0759f 32-bit imagemagick has gone. 2024-01-07 21:29:06 +01:00
David Given
53f7dfe6c9 Remove stray files. 2024-01-07 21:24:53 +01:00
David Given
75446de29b Merge pull request #732 from davidgiven/acorn
Update the acorndfs format so that writes actually work.
2023-12-12 23:45:47 +00:00
David Given
1d119d6921 Update the acorndfs format so that writes actually work. 2023-12-13 00:31:12 +01:00
David Given
7462bd995f Merge pull request #731 from davidgiven/ab
Update ab. You can now build individual tools individually.
2023-12-12 22:31:48 +00:00
David Given
0dd99efad3 Update ab. 2023-12-12 23:17:06 +01:00
David Given
1234e81463 Update ab. You can now build individual tools individually. 2023-12-12 23:11:09 +01:00
David Given
ea13d66e6b Merge pull request #725 from davidgiven/dmk
Add support for DMK directory streams.
2023-11-02 01:35:24 +01:00
David Given
a7cb7eb995 Add missing files... 2023-11-02 01:22:09 +01:00
David Given
29f5feb34d Add support for DMK directory streams. 2023-11-02 01:17:44 +01:00
769 changed files with 85814 additions and 25807 deletions

View File

@@ -10,97 +10,117 @@ jobs:
build-linux:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: apt
run: |
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev wx-common
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev
- name: make
run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j`nproc` -C fluxengine
#build-linux-debian-11:
# runs-on: ubuntu-22.04
# container: debian:11
# steps:
# - uses: actions/checkout@v4
# with:
# repository: 'davidgiven/fluxengine'
# path: 'fluxengine'
# - uses: actions/checkout@v4
# with:
# repository: 'davidgiven/fluxengine-testdata'
# path: 'fluxengine-testdata'
# - name: apt update
# run: apt update
# - name: apt
# run: >
# apt install -y python3 make xz-utils python3 python3-hamcrest
# protobuf-compiler libprotobuf-dev libsqlite3-dev
# libfmt-dev libprotobuf-dev wx-common pkg-config
# libudev-dev g++ libwxgtk3.0-gtk3-dev
# - name: make
# run: make -C fluxengine
build-macos-current:
runs-on: macos-latest
strategy:
matrix:
runs-on: [macos-13, macos-latest]
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
run: |
brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
- name: make
run: gmake -j`nproc` -C fluxengine
run: gmake -C fluxengine
- name: Upload build artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: ${{ github.event.repository.name }}.${{ github.sha }}
path: fluxengine/FluxEngine.pkg
name: ${{ github.event.repository.name }}.${{ github.sha }}.fluxengine.${{ runner.arch }}.pkg
path: |
fluxengine/FluxEngine.pkg
fluxengine/FluxEngine.app.zip
build-windows:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
update: true
msystem: MINGW32
install: >-
diffutils
make
mingw-w64-i686-binutils
mingw-w64-i686-fmt
mingw-w64-i686-gcc
mingw-w64-i686-libusb
mingw-w64-i686-nsis
mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf
mingw-w64-i686-python
mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib
mingw-w64-i686-imagemagick
vim
zip
- name: update-protobuf
- name: setup WSL
run: |
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
- uses: actions/checkout@v2
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/41.0.0/Fedora-Remix-for-WSL-SL_41.0.0.0_x64_arm64.msixbundle -o fedora.msixbundle
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix
unzip Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix install.tar.gz
wsl --update
wsl --set-default-version 1
wsl --import fedora fedora install.tar.gz
wsl --set-default fedora
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm'
wsl sh -c 'dnf -y install gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico ninja-build'
- name: fix line endings
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: build
run: MAGICK_TIME_LIMIT=100 make -j`nproc` -C fluxengine
- name: run
run: |
wsl sh -c 'make -C fluxengine BUILDTYPE=windows -j$(nproc)'
- name: nsis
run: |
cd fluxengine
strip fluxengine.exe -o fluxengine-stripped.exe
strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe
makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi
wsl sh -c 'cd fluxengine && strip fluxengine.exe -o fluxengine-stripped.exe'
wsl sh -c 'cd fluxengine && strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe'
wsl sh -c 'cd fluxengine && makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi'
- name: zip
run: |
cd fluxengine
zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe
wsl sh -c 'cd fluxengine && zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe'
- name: Upload build artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: ${{ github.event.repository.name }}.${{ github.sha }}
name: ${{ github.event.repository.name }}.${{ github.sha }}.windows.zip
path: fluxengine/fluxengine-windows.zip

View File

@@ -12,50 +12,43 @@ on:
jobs:
dev-release:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
- name: setup WSL
run: |
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/41.0.0/Fedora-Remix-for-WSL-SL_41.0.0.0_x64_arm64.msixbundle -o fedora.msixbundle
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix
unzip Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix install.tar.gz
wsl --update
wsl --set-default-version 1
wsl --import fedora fedora install.tar.gz
wsl --set-default fedora
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm'
wsl sh -c 'dnf -y install gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico ninja-build'
- name: fix line endings
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- uses: actions/checkout@v4
with:
update: true
msystem: MINGW32
install: >-
diffutils
make
mingw-w64-i686-binutils
mingw-w64-i686-fmt
mingw-w64-i686-gcc
mingw-w64-i686-libusb
mingw-w64-i686-nsis
mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf
mingw-w64-i686-python
mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib
mingw-w64-i686-imagemagick
vim
zip
- uses: actions/checkout@v3
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- name: update-protobuf
- name: run
run: |
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
- name: build
run: |
MAGICK_TIME_LIMIT=100 make -j`nproc`
wsl sh -c 'cd fluxengine && make BUILDTYPE=windows -j$(nproc)'
- name: nsis
run: |
strip fluxengine.exe -o fluxengine-stripped.exe
strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe
makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi
wsl sh -c 'cd fluxengine && strip fluxengine.exe -o fluxengine-stripped.exe'
wsl sh -c 'cd fluxengine && strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe'
wsl sh -c 'cd fluxengine && makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi'
- name: zip
run: |
zip -9 fluxengine.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex
wsl sh -c 'cd fluxengine && zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe'
- name: date
run: |
@@ -66,6 +59,7 @@ jobs:
with:
tag-name: dev
force-branch: false
git-directory: 'fluxengine'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -84,20 +78,28 @@ jobs:
with:
name: Development build ${{ env.RELEASE_DATE }}
files: |
fluxengine.zip
fluxengine-installer.exe
fluxengine/fluxengine.zip
fluxengine/fluxengine-installer.exe
tag_name: dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-macos:
runs-on: macos-latest
strategy:
matrix:
runs-on: [macos-13, macos-latest]
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
- name: make
run: gmake
run: |
gmake
mv FluxEngine.pkg FluxEngine-${{ runner.arch }}.pkg
mv FluxEngine.app.zip FluxEngine-${{ runner.arch }}.app.zip
- name: tag
uses: EndBug/latest-tag@latest
@@ -113,7 +115,8 @@ jobs:
token: ${{ github.token }}
tag: dev
assets: |
FluxEngine.pkg
FluxEngine-${{ runner.arch }}.pkg
FluxEngine-${{ runner.arch }}.app.zip
fail-if-no-assets: false
- name: release
@@ -121,7 +124,8 @@ jobs:
with:
name: Development build ${{ env.RELEASE_DATE }}
files: |
FluxEngine.pkg
FluxEngine-${{ runner.arch }}.pkg
FluxEngine-${{ runner.arch }}.app.zip
tag_name: dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,9 +1,55 @@
CC = gcc
CXX = g++ -std=c++17
CFLAGS = -g -O3
LDFLAGS =
ifeq ($(BUILDTYPE),)
buildtype_Darwin = osx
buildtype_Haiku = haiku
BUILDTYPE := $(buildtype_$(shell uname -s ))
ifeq ($(BUILDTYPE),)
BUILDTYPE := unix
endif
endif
export BUILDTYPE
OBJ = .obj
ifeq ($(BUILDTYPE),windows)
MINGW = i686-w64-mingw32-
CC = $(MINGW)gcc
CXX = $(MINGW)g++ -std=c++20
CFLAGS += -g -O3 \
-Wno-unknown-warning-option \
-ffunction-sections \
-fdata-sections
CXXFLAGS += \
-fext-numeric-literals \
-Wno-deprecated-enum-float-conversion \
-Wno-deprecated-enum-enum-conversion
LDFLAGS += -static -Wl,--gc-sections
AR = $(MINGW)ar
PKG_CONFIG = $(MINGW)pkg-config -static
WINDRES = $(MINGW)windres
WX_CONFIG = /usr/i686-w64-mingw32/sys-root/mingw/bin/wx-config-3.0 --static=yes
EXT = .exe
else
CC = gcc
CXX = g++ -std=c++20
CFLAGS = -g -O3 \
-Wno-unknown-warning-option
CXXFLAGS += \
-Wno-deprecated-enum-float-conversion \
-Wno-deprecated-enum-enum-conversion
LDFLAGS =
AR = ar
PKG_CONFIG = pkg-config
ifeq ($(BUILDTYPE),osx)
else
LDFLAGS += -pthread -Wl,--no-as-needed
endif
endif
HOSTCC = gcc
HOSTCXX = g++ -std=c++20
HOSTCFLAGS = -g -O3
HOSTLDFLAGS =
REALOBJ = .obj
OBJ = $(REALOBJ)/$(BUILDTYPE)
DESTDIR ?=
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
@@ -44,22 +90,27 @@ all: +all README.md
binaries: all
tests: all
README.md: $(OBJ)/scripts+mkdocindex/scripts+mkdocindex$(EXT)
@echo MKDOC $@
README.md: $(OBJ)/scripts/+mkdocindex/mkdocindex$(EXT)
@echo $(PROGRESSINFO)MKDOC $@
@csplit -s -f$(OBJ)/README. README.md '/<!-- FORMATSSTART -->/' '%<!-- FORMATSEND -->%'
@(cat $(OBJ)/README.00 && $< && cat $(OBJ)/README.01) > README.md
.PHONY: tests
.PHONY: install install-bin
install:: all install-bin
install-bin:
@echo "INSTALL"
$(hide) install -D -v "$(OBJ)/src+fluxengine/src+fluxengine" "$(DESTDIR)$(BINDIR)/fluxengine"
$(hide) install -D -v "$(OBJ)/src/gui+gui/gui+gui" "$(DESTDIR)$(BINDIR)/fluxengine-gui"
$(hide) install -D -v "$(OBJ)/tools+brother120tool/tools+brother120tool" "$(DESTDIR)$(BINDIR)/brother120tool"
$(hide) install -D -v "$(OBJ)/tools+brother240tool/tools+brother240tool" "$(DESTDIR)$(BINDIR)/brother240tool"
$(hide) install -D -v "$(OBJ)/tools+upgrade-flux-file/tools+upgrade-flux-file" "$(DESTDIR)$(BINDIR)/upgrade-flux-file"
clean::
$(hide) rm -rf $(REALOBJ)
include build/ab.mk
DOCKERFILES = \
debian11 \
debian12 \
fedora40 \
fedora41 \
manjaro
docker-%: tests/docker/Dockerfile.%
docker build -t $* -f $< .
.PHONY: dockertests
dockertests: $(foreach f,$(DOCKERFILES), docker-$(strip $f) .WAIT)

View File

@@ -4,11 +4,8 @@ FluxEngine
(If you're reading this on GitHub, the formatting's a bit messed up. [Try the
version on cowlark.com instead.](http://cowlark.com/fluxengine/))
**Breaking news!** As of 2022-09-09, there's new [filesystem
support](doc/filesystem.md). Read (and sometimes write) files directly from
(and to) your disks, with eight different file systems! It works in the GUI,
too, which is available for Linux (and other Unix clones), Windows and OSX. See
the details below.
**Breaking news!** As of 2024-10-01, the FluxEngine client software works
(to a point) with [Applesauce](doc/applesauce.md) hardware.
<div style="text-align: center">
<a href="doc/screenshot.jpg"><img src="doc/screenshot.jpg" style="width:60%" alt="screenshot of the GUI in action"></a>
@@ -35,12 +32,14 @@ Don't believe me? Watch the demo reel!
</div>
**New!** The FluxEngine client software now works with
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) hardware. So, if you
can't find a PSoC5 development kit, or don't want to use the Cypress Windows
tools for programming it, you can use one of these instead. Very nearly all
FluxEngine features are available with the Greaseweazle and it works out-of-the
box. See the [dedicated Greaseweazle documentation page](doc/greaseweazle.md)
for more information.
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) and
[Applesauce](https://applesaucefdc.com/) hardware. So, if you can't find a PSoC5
development kit, or don't want to use the Cypress Windows tools for programming
it, you can use one of these instead. Very nearly all FluxEngine features are
available with the Greaseweazle and it works out-of-the box; the Applesauce is a
bit less supported but still works. See the [dedicated Greaseweazle
documentation page](doc/greaseweazle.md) or the [Applesauce
page](doc/applesauce.md) for more information.
Where?
------
@@ -126,6 +125,7 @@ choices because they can store multiple types of file system.
| [`hplif`](doc/disk-hplif.md) | Hewlett-Packard LIF: a variety of disk formats used by HP | 🦄 | 🦄 | LIF |
| [`ibm`](doc/disk-ibm.md) | IBM PC: Generic PC 3.5"/5.25" disks | 🦄 | 🦄 | FATFS |
| [`icl30`](doc/disk-icl30.md) | ICL Model 30: CP/M; 263kB 35-track DSSD | 🦖 | | CPMFS |
| [`juku`](doc/disk-juku.md) | Juku E5104: CP/M | | | CPMFS |
| [`mac`](doc/disk-mac.md) | Macintosh: 400kB/800kB 3.5" GCR | 🦄 | 🦄 | MACHFS |
| [`micropolis`](doc/disk-micropolis.md) | Micropolis: 100tpi MetaFloppy disks | 🦄 | 🦄 | |
| [`ms2000`](doc/disk-ms2000.md) | : MS2000 Microdisk Development System | | | MICRODOS |
@@ -136,6 +136,8 @@ choices because they can store multiple types of file system.
| [`rolandd20`](doc/disk-rolandd20.md) | Roland D20: 3.5" electronic synthesiser disks | 🦄 | 🦖 | ROLAND |
| [`rx50`](doc/disk-rx50.md) | Digital RX50: 400kB 5.25" 80-track 10-sector SSDD | 🦖 | 🦖 | |
| [`smaky6`](doc/disk-smaky6.md) | Smaky 6: 308kB 5.25" 77-track 16-sector SSDD, hard sectored | 🦖 | | SMAKY6 |
| [`tartu`](doc/disk-tartu.md) | Tartu: The Palivere and variations | 🦄 | 🦖 | CPMFS |
| [`ti99`](doc/disk-ti99.md) | TI-99: 90kB 35-track SSSD | 🦖 | | |
| [`tids990`](doc/disk-tids990.md) | Texas Instruments DS990: 1126kB 8" DSSD | 🦖 | 🦖 | |
| [`tiki`](doc/disk-tiki.md) | Tiki 100: CP/M | | | CPMFS |
| [`victor9k`](doc/disk-victor9k.md) | Victor 9000 / Sirius One: 1224kB 5.25" DSDD GCR | 🦖 | 🦖 | |
@@ -257,6 +259,15 @@ package, written by Robert Leslie et al, taken from
https://www.mars.org/home/rob/proj/hfs. It is GPL 2.0 licensed. Please see the
contents of the directory for the full text.
As an exception, `dep/lexy` contains a partial copy of the lexy package, written
by foonathen@github, taken from https://github.com/foonathan/lexy. It is BSL 1.0
licensed. Please see the contents of the directory for the full text.
As an exception, `dep/alphanum` contains a copy of the alphanum package,
written by Dave Koelle, taken from
https://web.archive.org/web/20210207124255/davekoelle.com/alphanum.html. It is
MIT licensed. Please see the source for the full text.
__Important:__ Because of all these exceptions, if you distribute the
FluxEngine package as a whole, you must comply with the terms of _all_ of the
licensing terms. This means that __effectively the FluxEngine package is

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "aeslanier.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "arch/aeslanier/aeslanier.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>

View File

@@ -1,7 +1,7 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "agat.h"
#include "lib/bytes.h"
#include "arch/agat/agat.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
uint8_t agatChecksum(const Bytes& bytes)

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message AgatDecoderProto {}

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "agat.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "arch/agat/agat.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>

View File

@@ -1,11 +1,11 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "agat.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "lib/layout.h"
#include "arch/agat/agat.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "lib/data/layout.h"
#include "arch/agat/agat.pb.h"
#include "lib/encoders/encoders.pb.h"

View File

@@ -1,7 +1,7 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "amiga.h"
#include "lib/bytes.h"
#include "arch/amiga/amiga.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
uint32_t amigaChecksum(const Bytes& bytes)

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message AmigaDecoderProto {}

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "amiga.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/amiga/amiga.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
#include <string.h>

View File

@@ -1,10 +1,10 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "amiga.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/amiga/amiga.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/amiga/amiga.pb.h"
#include "lib/encoders/encoders.pb.h"

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message Apple2DecoderProto {
optional uint32 side_one_track_offset = 1

View File

@@ -1,13 +1,14 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "apple2.h"
#include "lib/data/sector.h"
#include "arch/apple2/apple2.h"
#include "arch/apple2/apple2.pb.h"
#include "lib/decoders/decoders.pb.h"
#include "lib/bytes.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>

View File

@@ -1,14 +1,14 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "arch/apple2/apple2.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "lib/sector.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "lib/encoders/encoders.pb.h"
#include <ctype.h>
#include "lib/bytes.h"
#include "lib/core/bytes.h"
static int encode_data_gcr(uint8_t data)
{

97
arch/arch.cc Normal file
View File

@@ -0,0 +1,97 @@
#include "lib/core/globals.h"
#include "lib/encoders/encoders.h"
#include "lib/decoders/decoders.h"
#include "lib/config/config.h"
#include "arch/agat/agat.h"
#include "arch/aeslanier/aeslanier.h"
#include "arch/amiga/amiga.h"
#include "arch/apple2/apple2.h"
#include "arch/brother/brother.h"
#include "arch/c64/c64.h"
#include "arch/f85/f85.h"
#include "arch/fb100/fb100.h"
#include "arch/ibm/ibm.h"
#include "arch/macintosh/macintosh.h"
#include "arch/micropolis/micropolis.h"
#include "arch/mx/mx.h"
#include "arch/northstar/northstar.h"
#include "arch/rolandd20/rolandd20.h"
#include "arch/smaky6/smaky6.h"
#include "arch/tartu/tartu.h"
#include "arch/tids990/tids990.h"
#include "arch/victor9k/victor9k.h"
#include "arch/zilogmcz/zilogmcz.h"
#include "arch/arch.h"
std::unique_ptr<Encoder> Arch::createEncoder(Config& config)
{
if (!config.hasEncoder())
error("no encoder configured");
return createEncoder(config->encoder());
}
std::unique_ptr<Encoder> Arch::createEncoder(const EncoderProto& config)
{
static const std::map<int,
std::function<std::unique_ptr<Encoder>(const EncoderProto&)>>
encoders = {
{EncoderProto::kAgat, createAgatEncoder },
{EncoderProto::kAmiga, createAmigaEncoder },
{EncoderProto::kApple2, createApple2Encoder },
{EncoderProto::kBrother, createBrotherEncoder },
{EncoderProto::kC64, createCommodore64Encoder},
{EncoderProto::kIbm, createIbmEncoder },
{EncoderProto::kMacintosh, createMacintoshEncoder },
{EncoderProto::kMicropolis, createMicropolisEncoder },
{EncoderProto::kNorthstar, createNorthstarEncoder },
{EncoderProto::kTartu, createTartuEncoder },
{EncoderProto::kTids990, createTids990Encoder },
{EncoderProto::kVictor9K, createVictor9kEncoder },
};
auto encoder = encoders.find(config.format_case());
if (encoder == encoders.end())
error("no encoder specified");
return (encoder->second)(config);
}
std::unique_ptr<Decoder> Arch::createDecoder(Config& config)
{
if (!config.hasDecoder())
error("no decoder configured");
return createDecoder(config->decoder());
}
std::unique_ptr<Decoder> Arch::createDecoder(const DecoderProto& config)
{
static const std::map<int,
std::function<std::unique_ptr<Decoder>(const DecoderProto&)>>
decoders = {
{DecoderProto::kAgat, createAgatDecoder },
{DecoderProto::kAeslanier, createAesLanierDecoder },
{DecoderProto::kAmiga, createAmigaDecoder },
{DecoderProto::kApple2, createApple2Decoder },
{DecoderProto::kBrother, createBrotherDecoder },
{DecoderProto::kC64, createCommodore64Decoder},
{DecoderProto::kF85, createDurangoF85Decoder },
{DecoderProto::kFb100, createFb100Decoder },
{DecoderProto::kIbm, createIbmDecoder },
{DecoderProto::kMacintosh, createMacintoshDecoder },
{DecoderProto::kMicropolis, createMicropolisDecoder },
{DecoderProto::kMx, createMxDecoder },
{DecoderProto::kNorthstar, createNorthstarDecoder },
{DecoderProto::kRolandd20, createRolandD20Decoder },
{DecoderProto::kSmaky6, createSmaky6Decoder },
{DecoderProto::kTartu, createTartuDecoder },
{DecoderProto::kTids990, createTids990Decoder },
{DecoderProto::kVictor9K, createVictor9kDecoder },
{DecoderProto::kZilogmcz, createZilogMczDecoder },
};
auto decoder = decoders.find(config.format_case());
if (decoder == decoders.end())
error("no decoder specified");
return (decoder->second)(config);
}

16
arch/arch.h Normal file
View File

@@ -0,0 +1,16 @@
#pragma once
class Encoder;
class Decoder;
class DecoderProto;
class EncoderProto;
class Config;
namespace Arch
{
std::unique_ptr<Decoder> createDecoder(Config& config);
std::unique_ptr<Decoder> createDecoder(const DecoderProto& config);
std::unique_ptr<Encoder> createEncoder(Config& config);
std::unique_ptr<Encoder> createEncoder(const EncoderProto& config);
}

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "brother.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "lib/crc.h"
#include "arch/brother/brother.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "lib/core/crc.h"
#include <ctype.h>
const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD);

View File

@@ -1,10 +1,10 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "brother.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/brother/brother.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/brother/brother.pb.h"
#include "lib/encoders/encoders.pb.h"

View File

@@ -1,26 +1,61 @@
from build.c import cxxlibrary
from build.protobuf import proto, protocc
from build.protobuf import proto, protocc, protolib
from os.path import *
from glob import glob
import sys
proto(
name="arch_proto",
srcs=[
"./aeslanier/aeslanier.proto",
"./agat/agat.proto",
"./amiga/amiga.proto",
"./apple2/apple2.proto",
"./brother/brother.proto",
"./c64/c64.proto",
"./f85/f85.proto",
"./fb100/fb100.proto",
"./ibm/ibm.proto",
"./macintosh/macintosh.proto",
"./micropolis/micropolis.proto",
"./mx/mx.proto",
"./northstar/northstar.proto",
"./rolandd20/rolandd20.proto",
"./smaky6/smaky6.proto",
"./tids990/tids990.proto",
"./victor9k/victor9k.proto",
"./zilogmcz/zilogmcz.proto",
],
archs = [f for f in glob("*", root_dir="arch") if isfile(f"arch/{f}/{f}.proto")]
ps = []
pls = []
cls = []
for a in archs:
ps += [
proto(
name=f"proto_{a}",
srcs=[f"arch/{a}/{a}.proto"],
deps=["lib/config+common_proto"],
)
]
pls += [
protocc(
name=f"proto_lib_{a}",
srcs=[f".+proto_{a}"],
deps=["lib/config+common_proto_lib"],
)
]
cls += [
cxxlibrary(
name=f"arch_{a}",
srcs=glob(f"arch/{a}/*.cc") + glob(f"arch/{a}/*.h"),
hdrs={f"arch/{a}/{a}.h": f"arch/{a}/{a}.h"},
deps=[
"lib/core",
"lib/data",
"lib/config",
"lib/encoders",
"lib/decoders",
],
)
]
protolib(
name="proto",
srcs=ps + ["lib/config+common_proto"],
)
cxxlibrary(name="proto_lib", deps=pls)
cxxlibrary(
name="arch",
srcs=[
"./arch.cc",
],
hdrs={
"arch/arch.h": "./arch.h",
},
deps=cls
+ ["lib/core", "lib/data", "lib/config", "lib/encoders", "lib/decoders"],
)

View File

@@ -1,5 +1,5 @@
#include "lib/globals.h"
#include "c64.h"
#include "lib/core/globals.h"
#include "arch/c64/c64.h"
/*
* Track Sectors/track # Sectors Storage in Bytes Clock rate

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message Commodore64DecoderProto {}

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "c64.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/c64/c64.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>

View File

@@ -1,17 +1,17 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "c64.h"
#include "lib/crc.h"
#include "lib/sector.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/c64/c64.h"
#include "lib/core/crc.h"
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "arch/c64/c64.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "lib/data/layout.h"
#include <ctype.h>
#include "lib/bytes.h"
#include "lib/core/bytes.h"
static bool lastBit;

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "f85.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/f85/f85.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "fb100.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/fb100/fb100.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "lib/decoders/rawbits.h"
#include "fmt/format.h"
#include <string.h>

View File

@@ -1,13 +1,14 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "ibm.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "arch/ibm/ibm.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "arch/ibm/ibm.pb.h"
#include "lib/proto.h"
#include "lib/layout.h"
#include "lib/config/proto.h"
#include "lib/data/layout.h"
#include <string.h>
static_assert(std::is_trivially_copyable<IbmIdam>::value,

View File

@@ -1,15 +1,15 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/config/config.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "ibm.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/ibm/ibm.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/ibm/ibm.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "fmt/format.h"
#include "lib/proto.h"
#include "lib/layout.h"
#include "lib/config/proto.h"
#include "lib/data/layout.h"
#include <ctype.h>
/* IAM record separator:

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message IbmDecoderProto {
// Next: 11

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "macintosh.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/macintosh/macintosh.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>

View File

@@ -1,13 +1,13 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "macintosh.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/macintosh/macintosh.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "lib/data/layout.h"
#include "arch/macintosh/macintosh.pb.h"
#include <ctype.h>

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message MacintoshDecoderProto {}

View File

@@ -1,10 +1,11 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "micropolis.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/micropolis/micropolis.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"

View File

@@ -1,9 +1,9 @@
#include "lib/globals.h"
#include "micropolis.h"
#include "lib/sector.h"
#include "lib/core/globals.h"
#include "arch/micropolis/micropolis.h"
#include "lib/data/sector.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "lib/image.h"
#include "lib/data/image.h"
#include "lib/encoders/encoders.pb.h"
static void write_sector(std::vector<bool>& bits,

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message MicropolisDecoderProto {
enum ChecksumType {

View File

@@ -1,10 +1,11 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "arch/mx/mx.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include <string.h>
const int SECTOR_SIZE = 256;

View File

@@ -11,13 +11,14 @@
* sure that the hardSectorId is correct.
*/
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "northstar.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/northstar/northstar.h"
#include "lib/core/bytes.h"
#include "lib/decoders/decoders.pb.h"
#include "fmt/format.h"

View File

@@ -1,10 +1,10 @@
#include "lib/globals.h"
#include "northstar.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "lib/core/globals.h"
#include "arch/northstar/northstar.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "lib/image.h"
#include "lib/data/image.h"
#include "lib/encoders/encoders.pb.h"
#define GAP_FILL_SIZE_SD 30

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message NorthstarDecoderProto {}

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "rolandd20.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "arch/rolandd20/rolandd20.h"
#include <string.h>
/* Sector header record:

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "smaky6.h"
#include "lib/bytes.h"
#include "lib/crc.h"
#include "lib/data/sector.h"
#include "arch/smaky6/smaky6.h"
#include "lib/core/bytes.h"
#include "lib/core/crc.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
#include <string.h>

View File

@@ -1,6 +1,4 @@
syntax = "proto2";
import "lib/common.proto";
message Smaky6DecoderProto {}

81
arch/tartu/decoder.cc Normal file
View File

@@ -0,0 +1,81 @@
#include "lib/core/globals.h"
#include "lib/config/config.h"
#include "lib/decoders/decoders.h"
#include "arch/tartu/tartu.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include <string.h>
constexpr uint64_t HEADER_BITS = 0xaaaaaaaa44895554LL;
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
static const FluxPattern HEADER_PATTERN(64, HEADER_BITS);
static const FluxPattern DATA_PATTERN(64, DATA_BITS);
const FluxMatchers ANY_RECORD_PATTERN{&HEADER_PATTERN, &DATA_PATTERN};
class TartuDecoder : public Decoder
{
public:
TartuDecoder(const DecoderProto& config):
Decoder(config),
_config(config.tartu())
{
}
void beginTrack() override {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw64() != HEADER_BITS)
return;
auto bits = readRawBits(16 * 4);
auto bytes = decodeFmMfm(bits).slice(0, 4);
ByteReader br(bytes);
uint8_t track = br.read_8();
_sector->logicalTrack = track >> 1;
_sector->logicalSide = track & 1;
br.skip(1); /* seems always to be 1 */
_sector->logicalSector = br.read_8();
uint8_t wantChecksum = br.read_8();
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
if (wantChecksum == gotChecksum)
_sector->status = Sector::DATA_MISSING;
_sector->status = Sector::DATA_MISSING;
}
void decodeDataRecord() override
{
if (readRaw64() != DATA_BITS)
return;
const auto& bits = readRawBits(129 * 16);
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
_sector->data = bytes.slice(0, 128);
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
uint8_t gotChecksum = ~sumBytes(_sector->data);
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
private:
const TartuDecoderProto& _config;
};
std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new TartuDecoder(config));
}

115
arch/tartu/encoder.cc Normal file
View File

@@ -0,0 +1,115 @@
#include "lib/core/globals.h"
#include "lib/config/config.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "arch/tartu/tartu.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/sector.h"
#include <string.h>
class TartuEncoder : public Encoder
{
public:
TartuEncoder(const EncoderProto& config):
Encoder(config),
_config(config.tartu())
{
}
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
_clockRateUs = _config.clock_period_us();
int bitsPerRevolution =
(_config.target_rotational_period_ms() * 1000.0) / _clockRateUs;
const auto& sector = *sectors.begin();
_bits.resize(bitsPerRevolution);
_cursor = 0;
writeFillerRawBitsUs(_config.gap1_us());
bool first = true;
for (const auto& sectorData : sectors)
{
if (!first)
writeFillerRawBitsUs(_config.gap4_us());
first = false;
writeSector(sectorData);
}
if (_cursor > _bits.size())
error("track data overrun");
writeFillerRawBitsUs(_config.target_rotational_period_ms() * 1000.0);
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(_bits,
calculatePhysicalClockPeriod(_clockRateUs * 1e3,
_config.target_rotational_period_ms() * 1e6));
return fluxmap;
}
private:
void writeBytes(const Bytes& bytes)
{
encodeMfm(_bits, _cursor, bytes, _lastBit);
}
void writeRawBits(uint64_t data, int width)
{
_cursor += width;
_lastBit = data & 1;
for (int i = 0; i < width; i++)
{
unsigned pos = _cursor - i - 1;
if (pos < _bits.size())
_bits[pos] = data & 1;
data >>= 1;
}
}
void writeFillerRawBitsUs(double us)
{
unsigned count = (us / _clockRateUs) / 2;
for (int i = 0; i < count; i++)
writeRawBits(0b10, 2);
};
void writeSector(const std::shared_ptr<const Sector>& sectorData)
{
writeRawBits(_config.header_marker(), 64);
{
Bytes bytes;
ByteWriter bw(bytes);
bw.write_8(
(sectorData->logicalTrack << 1) | sectorData->logicalSide);
bw.write_8(1);
bw.write_8(sectorData->logicalSector);
bw.write_8(~sumBytes(bytes.slice(0, 3)));
writeBytes(bytes);
}
writeFillerRawBitsUs(_config.gap3_us());
writeRawBits(_config.data_marker(), 64);
{
Bytes bytes;
ByteWriter bw(bytes);
bw.append(sectorData->data);
bw.write_8(~sumBytes(bytes.slice(0, sectorData->data.size())));
writeBytes(bytes);
}
}
private:
const TartuEncoderProto& _config;
double _clockRateUs;
std::vector<bool> _bits;
unsigned _cursor;
bool _lastBit;
};
std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new TartuEncoder(config));
}

7
arch/tartu/tartu.h Normal file
View File

@@ -0,0 +1,7 @@
#ifndef TARTU_H
#define TARTU_H
extern std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config);
extern std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config);
#endif

27
arch/tartu/tartu.proto Normal file
View File

@@ -0,0 +1,27 @@
syntax = "proto2";
import "lib/config/common.proto";
message TartuDecoderProto {}
message TartuEncoderProto {
optional double clock_period_us = 1
[ default = 2.0, (help) = "clock rate on the real device (for MFM)" ];
optional double target_rotational_period_ms = 2
[ default=200, (help) = "rotational period of target disk" ];
optional double gap1_us = 3
[ default = 1200,
(help) = "size of gap 1 (the post-index gap)" ];
optional double gap3_us = 4
[ default = 150,
(help) = "size of gap 3 (the pre-data gap)" ];
optional double gap4_us = 5
[ default = 180,
(help) = "size of gap 4 (the post-data or format gap)" ];
optional uint64 header_marker = 6
[ default = 0xaaaaaaaa44895554,
(help) = "64-bit raw bit pattern of header record marker" ];
optional uint64 data_marker = 7
[ default = 0xaaaaaaaa44895545,
(help) = "64-bit raw bit pattern of data record marker" ];
}

View File

@@ -1,13 +1,14 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "arch/tids990/tids990.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include <string.h>
#include <fmt/format.h>
#include "fmt/format.h"
/* The Texas Instruments DS990 uses MFM with a scheme similar to a simplified
* version of the IBM record scheme (it's actually easier to parse than IBM).

View File

@@ -1,13 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "tids990.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/tids990/tids990.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/tids990/tids990.pb.h"
#include "lib/encoders/encoders.pb.h"
#include <fmt/format.h>
#include "fmt/format.h"
static int charToInt(char c)
{

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message Tids990DecoderProto {}

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "victor9k.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/victor9k/victor9k.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>

View File

@@ -1,17 +1,17 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "victor9k.h"
#include "lib/crc.h"
#include "lib/sector.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/victor9k/victor9k.h"
#include "lib/core/crc.h"
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "arch/victor9k/victor9k.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "lib/data/layout.h"
#include <ctype.h>
#include "lib/bytes.h"
#include "lib/core/bytes.h"
static bool lastBit;

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message Victor9kDecoderProto {}

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "zilogmcz.h"
#include "lib/bytes.h"
#include "lib/crc.h"
#include "lib/data/sector.h"
#include "arch/zilogmcz/zilogmcz.h"
#include "lib/core/bytes.h"
#include "lib/core/crc.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>

194
build.lua
View File

@@ -1,194 +0,0 @@
vars.cflags = { "$(CFLAGS)" }
vars.cxxflags = { "$(CXXFLAGS)" }
vars.ldflags = { "-pthread" }
include "build/protobuf.lua"
include "build/dependency.lua"
include "build/tests.lua"
dependency {
name = "fmt_dep",
pkg_config = "fmt",
}
dependency {
name = "stb_dep",
pkg_config = "stb",
fallback = "dep/stb+stb"
}
dependency {
name = "protobuf_dep",
pkg_config = "protobuf"
}
dependency {
name = "zlib_dep",
pkg_config = "zlib"
}
proto_cc_library {
name = "config_lib",
srcs = {
"./lib/common.proto",
"./lib/config.proto",
"./lib/decoders/decoders.proto",
"./lib/drive.proto",
"./lib/encoders/encoders.proto",
"./lib/fl2.proto",
"./lib/fluxsink/fluxsink.proto",
"./lib/fluxsource/fluxsource.proto",
"./lib/imagereader/imagereader.proto",
"./lib/imagewriter/imagewriter.proto",
"./lib/mapper.proto",
"./lib/usb/usb.proto",
"./arch/aeslanier/aeslanier.proto",
"./arch/agat/agat.proto",
"./arch/amiga/amiga.proto",
"./arch/apple2/apple2.proto",
"./arch/brother/brother.proto",
"./arch/c64/c64.proto",
"./arch/f85/f85.proto",
"./arch/fb100/fb100.proto",
"./arch/ibm/ibm.proto",
"./arch/macintosh/macintosh.proto",
"./arch/micropolis/micropolis.proto",
"./arch/mx/mx.proto",
"./arch/northstar/northstar.proto",
"./arch/rolandd20/rolandd20.proto",
"./arch/tids990/tids990.proto",
"./arch/victor9k/victor9k.proto",
"./arch/zilogmcz/zilogmcz.proto",
}
}
clibrary {
name = "protocol_lib",
hdrs = { "./protocol.h" }
}
clibrary {
name = "libfluxengine",
srcs = {
"./arch/aeslanier/decoder.cc",
"./arch/agat/agat.cc",
"./arch/agat/decoder.cc",
"./arch/amiga/amiga.cc",
"./arch/amiga/decoder.cc",
"./arch/amiga/encoder.cc",
"./arch/apple2/decoder.cc",
"./arch/apple2/encoder.cc",
"./arch/brother/decoder.cc",
"./arch/brother/encoder.cc",
"./arch/c64/c64.cc",
"./arch/c64/decoder.cc",
"./arch/c64/encoder.cc",
"./arch/f85/decoder.cc",
"./arch/fb100/decoder.cc",
"./arch/ibm/decoder.cc",
"./arch/ibm/encoder.cc",
"./arch/macintosh/decoder.cc",
"./arch/macintosh/encoder.cc",
"./arch/micropolis/decoder.cc",
"./arch/micropolis/encoder.cc",
"./arch/mx/decoder.cc",
"./arch/northstar/decoder.cc",
"./arch/northstar/encoder.cc",
"./arch/rolandd20/rolandd20.cc",
"./arch/tids990/decoder.cc",
"./arch/tids990/encoder.cc",
"./arch/victor9k/decoder.cc",
"./arch/victor9k/encoder.cc",
"./arch/zilogmcz/decoder.cc",
"./lib/bitmap.cc",
"./lib/bytes.cc",
"./lib/crc.cc",
"./lib/csvreader.cc",
"./lib/decoders/decoders.cc",
"./lib/decoders/fluxdecoder.cc",
"./lib/decoders/fluxmapreader.cc",
"./lib/decoders/fmmfm.cc",
"./lib/encoders/encoders.cc",
"./lib/flags.cc",
"./lib/fluxmap.cc",
"./lib/fluxsink/aufluxsink.cc",
"./lib/fluxsink/fl2fluxsink.cc",
"./lib/fluxsink/fluxsink.cc",
"./lib/fluxsink/hardwarefluxsink.cc",
"./lib/fluxsink/scpfluxsink.cc",
"./lib/fluxsink/vcdfluxsink.cc",
"./lib/fluxsource/cwffluxsource.cc",
"./lib/fluxsource/erasefluxsource.cc",
"./lib/fluxsource/fl2fluxsource.cc",
"./lib/fluxsource/fluxsource.cc",
"./lib/fluxsource/hardwarefluxsource.cc",
"./lib/fluxsource/kryoflux.cc",
"./lib/fluxsource/kryofluxfluxsource.cc",
"./lib/fluxsource/scpfluxsource.cc",
"./lib/fluxsource/testpatternfluxsource.cc",
"./lib/globals.cc",
"./lib/hexdump.cc",
"./lib/image.cc",
"./lib/imagereader/d64imagereader.cc",
"./lib/imagereader/d88imagereader.cc",
"./lib/imagereader/dimimagereader.cc",
"./lib/imagereader/diskcopyimagereader.cc",
"./lib/imagereader/fdiimagereader.cc",
"./lib/imagereader/imagereader.cc",
"./lib/imagereader/imdimagereader.cc",
"./lib/imagereader/imgimagereader.cc",
"./lib/imagereader/jv3imagereader.cc",
"./lib/imagereader/nfdimagereader.cc",
"./lib/imagereader/nsiimagereader.cc",
"./lib/imagereader/td0imagereader.cc",
"./lib/imagewriter/d64imagewriter.cc",
"./lib/imagewriter/d88imagewriter.cc",
"./lib/imagewriter/diskcopyimagewriter.cc",
"./lib/imagewriter/imagewriter.cc",
"./lib/imagewriter/imgimagewriter.cc",
"./lib/imagewriter/ldbsimagewriter.cc",
"./lib/imagewriter/nsiimagewriter.cc",
"./lib/imagewriter/rawimagewriter.cc",
"./lib/imginputoutpututils.cc",
"./lib/ldbs.cc",
"./lib/logger.cc",
"./lib/mapper.cc",
"./lib/proto.cc",
"./lib/readerwriter.cc",
"./lib/sector.cc",
"./lib/usb/fluxengineusb.cc",
"./lib/usb/greaseweazle.cc",
"./lib/usb/greaseweazleusb.cc",
"./lib/usb/serial.cc",
"./lib/usb/usb.cc",
"./lib/usb/usbfinder.cc",
"./lib/utils.cc",
"protocol.h",
},
deps = {
"+config_lib",
"+protocol_lib",
"+fmt_dep",
"+protobuf_dep",
"+zlib_dep",
"dep/libusbp+libusbp",
},
dep_cflags = { "-Ilib", "-Iarch", "-I." },
vars = {
["+cflags"] = { "-Ilib", "-Iarch", "-I." }
}
}
installable {
name = "all",
map = {
["fluxengine"] = "src+fluxengine",
["fluxengine-gui"] = "src/gui+fluxengine",
["brother120tool"] = "tools+brother120tool",
["brother240tool"] = "tools+brother240tool",
["upgrade-flux-file"] = "tools+upgrade-flux-file",
}
}
include "tests/build.lua"

247
build.py
View File

@@ -7,226 +7,28 @@ from glob import glob
import config
import re
# Hack for building on Fedora/WSL; executables get the .exe extension,
# but the build system detects it as Linux.
import build.toolchain
toolchain.Toolchain.EXE = "$(EXT)"
package(name="protobuf_lib", package="protobuf")
package(name="z_lib", package="zlib")
package(name="fmt_lib", package="fmt")
package(name="fmt_lib", package="fmt", fallback="dep/fmt")
package(name="sqlite3_lib", package="sqlite3")
clibrary(name="protocol", hdrs={"protocol.h": "./protocol.h"})
proto(name="fl2_proto", srcs=["lib/fl2.proto"])
protocc(name="fl2_proto_lib", srcs=["+fl2_proto"])
cxxlibrary(
name="lib",
srcs=[
"./lib/bitmap.cc",
"./lib/bytes.cc",
"./lib/config.cc",
"./lib/crc.cc",
"./lib/csvreader.cc",
"./lib/decoders/decoders.cc",
"./lib/decoders/fluxdecoder.cc",
"./lib/decoders/fluxmapreader.cc",
"./lib/decoders/fmmfm.cc",
"./lib/encoders/encoders.cc",
"./lib/fl2.cc",
"./lib/flags.cc",
"./lib/fluxmap.cc",
"./lib/fluxsink/a2rfluxsink.cc",
"./lib/fluxsink/aufluxsink.cc",
"./lib/fluxsink/fl2fluxsink.cc",
"./lib/fluxsink/fluxsink.cc",
"./lib/fluxsink/hardwarefluxsink.cc",
"./lib/fluxsink/scpfluxsink.cc",
"./lib/fluxsink/vcdfluxsink.cc",
"./lib/fluxsource/a2rfluxsource.cc",
"./lib/fluxsource/cwffluxsource.cc",
"./lib/fluxsource/erasefluxsource.cc",
"./lib/fluxsource/fl2fluxsource.cc",
"./lib/fluxsource/fluxsource.cc",
"./lib/fluxsource/flx.cc",
"./lib/fluxsource/flxfluxsource.cc",
"./lib/fluxsource/hardwarefluxsource.cc",
"./lib/fluxsource/kryoflux.cc",
"./lib/fluxsource/kryofluxfluxsource.cc",
"./lib/fluxsource/memoryfluxsource.cc",
"./lib/fluxsource/scpfluxsource.cc",
"./lib/fluxsource/testpatternfluxsource.cc",
"./lib/globals.cc",
"./lib/hexdump.cc",
"./lib/image.cc",
"./lib/imagereader/d64imagereader.cc",
"./lib/imagereader/d88imagereader.cc",
"./lib/imagereader/dimimagereader.cc",
"./lib/imagereader/diskcopyimagereader.cc",
"./lib/imagereader/fdiimagereader.cc",
"./lib/imagereader/imagereader.cc",
"./lib/imagereader/imdimagereader.cc",
"./lib/imagereader/imgimagereader.cc",
"./lib/imagereader/jv3imagereader.cc",
"./lib/imagereader/nfdimagereader.cc",
"./lib/imagereader/nsiimagereader.cc",
"./lib/imagereader/td0imagereader.cc",
"./lib/imagewriter/d64imagewriter.cc",
"./lib/imagewriter/d88imagewriter.cc",
"./lib/imagewriter/diskcopyimagewriter.cc",
"./lib/imagewriter/imagewriter.cc",
"./lib/imagewriter/imdimagewriter.cc",
"./lib/imagewriter/imgimagewriter.cc",
"./lib/imagewriter/ldbsimagewriter.cc",
"./lib/imagewriter/nsiimagewriter.cc",
"./lib/imagewriter/rawimagewriter.cc",
"./lib/layout.cc",
"./lib/ldbs.cc",
"./lib/logger.cc",
"./lib/proto.cc",
"./lib/readerwriter.cc",
"./lib/sector.cc",
"./lib/usb/fluxengineusb.cc",
"./lib/usb/greaseweazle.cc",
"./lib/usb/greaseweazleusb.cc",
"./lib/usb/serial.cc",
"./lib/usb/usb.cc",
"./lib/usb/usbfinder.cc",
"./lib/utils.cc",
"./lib/vfs/acorndfs.cc",
"./lib/vfs/amigaffs.cc",
"./lib/vfs/appledos.cc",
"./lib/vfs/applesingle.cc",
"./lib/vfs/brother120fs.cc",
"./lib/vfs/cbmfs.cc",
"./lib/vfs/cpmfs.cc",
"./lib/vfs/fatfs.cc",
"./lib/vfs/fluxsectorinterface.cc",
"./lib/vfs/imagesectorinterface.cc",
"./lib/vfs/lif.cc",
"./lib/vfs/machfs.cc",
"./lib/vfs/microdos.cc",
"./lib/vfs/philefs.cc",
"./lib/vfs/prodos.cc",
"./lib/vfs/roland.cc",
"./lib/vfs/smaky6fs.cc",
"./lib/vfs/vfs.cc",
"./lib/vfs/zdos.cc",
"./arch/aeslanier/decoder.cc",
"./arch/agat/agat.cc",
"./arch/agat/decoder.cc",
"./arch/agat/encoder.cc",
"./arch/amiga/amiga.cc",
"./arch/amiga/decoder.cc",
"./arch/amiga/encoder.cc",
"./arch/apple2/decoder.cc",
"./arch/apple2/encoder.cc",
"./arch/brother/decoder.cc",
"./arch/brother/encoder.cc",
"./arch/c64/c64.cc",
"./arch/c64/decoder.cc",
"./arch/c64/encoder.cc",
"./arch/f85/decoder.cc",
"./arch/fb100/decoder.cc",
"./arch/ibm/decoder.cc",
"./arch/ibm/encoder.cc",
"./arch/macintosh/decoder.cc",
"./arch/macintosh/encoder.cc",
"./arch/micropolis/decoder.cc",
"./arch/micropolis/encoder.cc",
"./arch/mx/decoder.cc",
"./arch/northstar/decoder.cc",
"./arch/northstar/encoder.cc",
"./arch/rolandd20/decoder.cc",
"./arch/smaky6/decoder.cc",
"./arch/tids990/decoder.cc",
"./arch/tids990/encoder.cc",
"./arch/victor9k/decoder.cc",
"./arch/victor9k/encoder.cc",
"./arch/zilogmcz/decoder.cc",
],
hdrs={
"arch/ibm/ibm.h": "./arch/ibm/ibm.h",
"arch/apple2/data_gcr.h": "./arch/apple2/data_gcr.h",
"arch/apple2/apple2.h": "./arch/apple2/apple2.h",
"arch/smaky6/smaky6.h": "./arch/smaky6/smaky6.h",
"arch/tids990/tids990.h": "./arch/tids990/tids990.h",
"arch/zilogmcz/zilogmcz.h": "./arch/zilogmcz/zilogmcz.h",
"arch/amiga/amiga.h": "./arch/amiga/amiga.h",
"arch/f85/data_gcr.h": "./arch/f85/data_gcr.h",
"arch/f85/f85.h": "./arch/f85/f85.h",
"arch/mx/mx.h": "./arch/mx/mx.h",
"arch/aeslanier/aeslanier.h": "./arch/aeslanier/aeslanier.h",
"arch/northstar/northstar.h": "./arch/northstar/northstar.h",
"arch/brother/data_gcr.h": "./arch/brother/data_gcr.h",
"arch/brother/brother.h": "./arch/brother/brother.h",
"arch/brother/header_gcr.h": "./arch/brother/header_gcr.h",
"arch/macintosh/data_gcr.h": "./arch/macintosh/data_gcr.h",
"arch/macintosh/macintosh.h": "./arch/macintosh/macintosh.h",
"arch/agat/agat.h": "./arch/agat/agat.h",
"arch/fb100/fb100.h": "./arch/fb100/fb100.h",
"arch/victor9k/data_gcr.h": "./arch/victor9k/data_gcr.h",
"arch/victor9k/victor9k.h": "./arch/victor9k/victor9k.h",
"arch/rolandd20/rolandd20.h": "./arch/rolandd20/rolandd20.h",
"arch/micropolis/micropolis.h": "./arch/micropolis/micropolis.h",
"arch/c64/data_gcr.h": "./arch/c64/data_gcr.h",
"arch/c64/c64.h": "./arch/c64/c64.h",
"lib/a2r.h": "./lib/a2r.h",
"lib/bitmap.h": "./lib/bitmap.h",
"lib/bytes.h": "./lib/bytes.h",
"lib/config.h": "./lib/config.h",
"lib/crc.h": "./lib/crc.h",
"lib/csvreader.h": "./lib/csvreader.h",
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
"lib/decoders/rawbits.h": "./lib/decoders/rawbits.h",
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
"lib/scp.h": "./lib/scp.h",
"lib/fl2.h": "./lib/fl2.h",
"lib/flags.h": "./lib/flags.h",
"lib/flux.h": "./lib/flux.h",
"lib/fluxmap.h": "./lib/fluxmap.h",
"lib/fluxsink/fluxsink.h": "./lib/fluxsink/fluxsink.h",
"lib/fluxsource/fluxsource.h": "lib/fluxsource/fluxsource.h",
"lib/fluxsource/flx.h": "lib/fluxsource/flx.h",
"lib/fluxsource/kryoflux.h": "lib/fluxsource/kryoflux.h",
"lib/globals.h": "./lib/globals.h",
"lib/image.h": "./lib/image.h",
"lib/imagereader/imagereader.h": "./lib/imagereader/imagereader.h",
"lib/imagewriter/imagewriter.h": "./lib/imagewriter/imagewriter.h",
"lib/layout.h": "./lib/layout.h",
"lib/ldbs.h": "./lib/ldbs.h",
"lib/logger.h": "./lib/logger.h",
"lib/proto.h": "./lib/proto.h",
"lib/readerwriter.h": "./lib/readerwriter.h",
"lib/sector.h": "./lib/sector.h",
"lib/usb/greaseweazle.h": "./lib/usb/greaseweazle.h",
"lib/usb/usb.h": "./lib/usb/usb.h",
"lib/usb/usbfinder.h": "./lib/usb/usbfinder.h",
"lib/utils.h": "./lib/utils.h",
"lib/vfs/applesingle.h": "./lib/vfs/applesingle.h",
"lib/vfs/sectorinterface.h": "./lib/vfs/sectorinterface.h",
"lib/vfs/vfs.h": "./lib/vfs/vfs.h",
},
deps=[
"+fl2_proto_lib",
"+protocol",
"lib+config_proto_lib",
"dep/adflib",
"dep/agg",
"dep/fatfs",
"dep/hfsutils",
"dep/libusbp",
"dep/stb",
],
)
corpustests = []
if not glob("../fluxengine-testdata/data"):
print("fluxengine-testdata not found; skipping corpus tests")
else:
corpus = [
("acorndfs", "", "--200"),
("agat", "", ""),
("amiga", "", ""),
("apple2", "", "--140 40track_drive"),
("apple2", "", "--140 --drivetype=40"),
("atarist", "", "--360"),
("atarist", "", "--370"),
("atarist", "", "--400"),
@@ -236,17 +38,17 @@ else:
("atarist", "", "--800"),
("atarist", "", "--820"),
("bk", "", ""),
("brother", "", "--120 40track_drive"),
("brother", "", "--120 --drivetype=40"),
("brother", "", "--240"),
(
"commodore",
"scripts/commodore1541_test.textpb",
"--171 40track_drive",
"--171 --drivetype=40",
),
(
"commodore",
"scripts/commodore1541_test.textpb",
"--192 40track_drive",
"--192 --drivetype=40",
),
("commodore", "", "--800"),
("commodore", "", "--1620"),
@@ -258,16 +60,18 @@ else:
("ibm", "", "--1232"),
("ibm", "", "--1440"),
("ibm", "", "--1680"),
("ibm", "", "--180 40track_drive"),
("ibm", "", "--160 40track_drive"),
("ibm", "", "--320 40track_drive"),
("ibm", "", "--360 40track_drive"),
("ibm", "", "--180 --drivetype=40"),
("ibm", "", "--160 --drivetype=40"),
("ibm", "", "--320 --drivetype=40"),
("ibm", "", "--360 --drivetype=40"),
("ibm", "", "--720_96"),
("ibm", "", "--720_135"),
("mac", "scripts/mac400_test.textpb", "--400"),
("mac", "scripts/mac800_test.textpb", "--800"),
("n88basic", "", ""),
("rx50", "", ""),
("tartu", "", "--390 --drivetype=40"),
("tartu", "", "--780"),
("tids990", "", ""),
("victor9k", "", "--612"),
("victor9k", "", "--1224"),
@@ -281,15 +85,15 @@ else:
ins=["src+fluxengine"],
deps=["scripts/encodedecodetest.sh"],
commands=[
"{deps[0]} "
"$[deps[0]] "
+ c[0]
+ " "
+ format
+ " {ins[0]} '"
+ " $[ins[0]] '"
+ c[1]
+ "' '"
+ c[2]
+ "' $(dir {outs[0]}) > /dev/null"
+ "' $[dirname(filenameof(outs[0]))] > /dev/null"
],
label="CORPUSTEST",
)
@@ -305,6 +109,13 @@ export(
"brother240tool$(EXT)": "tools+brother240tool",
"upgrade-flux-file$(EXT)": "tools+upgrade-flux-file",
}
| ({"FluxEngine.pkg": "src/gui+fluxengine_pkg"} if config.osx else {}),
| (
{
"FluxEngine.pkg": "src/gui+fluxengine_pkg",
"FluxEngine.app.zip": "src/gui+fluxengine_app_zip",
}
if config.osx
else {}
),
deps=["tests", "src/formats+docs", "scripts+mkdocindex"] + corpustests,
)

49
build/_sandbox.py Normal file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/python3
from os.path import *
import argparse
import os
import shutil
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--sandbox")
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-l", "--link", action="store_true")
parser.add_argument("-e", "--export", action="store_true")
parser.add_argument("files", nargs="*")
args = parser.parse_args()
assert args.sandbox, "You must specify a sandbox directory"
assert args.link ^ args.export, "You can't link and export at the same time"
if args.link:
os.makedirs(args.sandbox, exist_ok=True)
for f in args.files:
sf = join(args.sandbox, f)
if args.verbose:
print("link", sf)
os.makedirs(dirname(sf), exist_ok=True)
try:
os.symlink(abspath(f), sf)
except PermissionError:
shutil.copy(f, sf)
if args.export:
for f in args.files:
sf = join(args.sandbox, f)
if args.verbose:
print("export", sf)
df = dirname(f)
if df:
os.makedirs(df, exist_ok=True)
try:
os.remove(f)
except FileNotFoundError:
pass
os.rename(sf, f)
main()

25
build/_zip.py Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/python3
from os.path import *
import argparse
import os
from zipfile import ZipFile
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-z", "--zipfile")
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-f", "--file", nargs=2, action="append")
args = parser.parse_args()
assert args.zipfile, "You must specify a zipfile to create"
with ZipFile(args.zipfile, mode="w") as zf:
for zipname, filename in args.file:
if args.verbose:
print(filename, "->", zipname)
zf.write(filename, arcname=zipname)
main()

View File

@@ -1,24 +1,96 @@
ifeq ($(findstring 4.,$(MAKE_VERSION)),)
MAKENOT4 := $(if $(findstring 3.9999, $(lastword $(sort 3.9999 $(MAKE_VERSION)))),yes,no)
ifeq ($(MAKENOT4),yes)
$(error You need GNU Make 4.x for this (if you're on OSX, use gmake).)
endif
OBJ ?= .obj
PYTHON ?= python3
CC ?= gcc
CXX ?= g++
AR ?= ar
CFLAGS ?= -g -Og
LDFLAGS ?= -g
hide = @
PKG_CONFIG ?= pkg-config
HOST_PKG_CONFIG ?= $(PKG_CONFIG)
ECHO ?= echo
CP ?= cp
HOSTCC ?= gcc
HOSTCXX ?= g++
HOSTAR ?= ar
HOSTCFLAGS ?= -g -Og
HOSTCXXFLAGS ?= $(HOSTCFLAGS)
HOSTLDFLAGS ?= -g
CC ?= $(HOSTCC)
CXX ?= $(HOSTCXX)
AR ?= $(HOSTAR)
CFLAGS ?= $(HOSTCFLAGS)
CXXFLAGS ?= $(CFLAGS)
LDFLAGS ?= $(HOSTLDFLAGS)
NINJA ?= ninja
ifdef VERBOSE
hide =
else
ifdef V
hide =
else
hide = @
endif
endif
# If enabled, shows a nice display of how far through the build you are. This
# doubles Make startup time. Also, on Make 4.3 and above, rebuilds don't show
# correct progress information.
AB_ENABLE_PROGRESS_INFO ?= true
WINDOWS := no
OSX := no
LINUX := no
ifeq ($(OS),Windows_NT)
WINDOWS := yes
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
LINUX := yes
endif
ifeq ($(UNAME_S),Darwin)
OSX := yes
endif
endif
ifeq ($(OS), Windows_NT)
EXT ?= .exe
endif
EXT ?=
include $(OBJ)/build.mk
CWD=$(shell pwd)
define newline
endef
define check_for_command
$(shell command -v $1 >/dev/null || (echo "Required command '$1' missing" >/dev/stderr && kill $$PPID))
endef
$(call check_for_command,ninja)
$(call check_for_command,cmp)
$(call check_for_command,$(PYTHON))
pkg-config-hash = $(shell ($(PKG_CONFIG) --list-all && $(HOST_PKG_CONFIG) --list-all) | md5sum)
build-files = $(shell find . -name .obj -prune -o \( -name 'build.py' -a -type f \) -print) $(wildcard build/*.py) $(wildcard config.py)
build-file-timestamps = $(shell ls -l $(build-files) | md5sum)
# Wipe the build file (forcing a regeneration) if the make environment is different.
# (Conveniently, this includes the pkg-config hash calculated above.)
ignored-variables = MAKE_RESTARTS .VARIABLES MAKECMDGOALS MAKEFLAGS MFLAGS
$(shell mkdir -p $(OBJ))
$(file >$(OBJ)/newvars.txt,$(foreach v,$(filter-out $(ignored-variables),$(.VARIABLES)),$(v)=$($(v))$(newline)))
$(shell touch $(OBJ)/vars.txt)
#$(shell diff -u $(OBJ)/vars.txt $(OBJ)/newvars.txt > /dev/stderr)
$(shell cmp -s $(OBJ)/newvars.txt $(OBJ)/vars.txt || (rm -f $(OBJ)/build.ninja && echo "Environment changed --- regenerating" > /dev/stderr))
$(shell mv $(OBJ)/newvars.txt $(OBJ)/vars.txt)
.PHONY: update-ab
update-ab:
@@ -30,13 +102,18 @@ update-ab:
.PHONY: clean
clean::
@echo CLEAN
$(hide) rm -rf $(OBJ) bin
$(hide) rm -rf $(OBJ)
export PYTHONHASHSEED = 1
build-files = $(shell find . -name 'build.py') build/*.py config.py
$(OBJ)/build.mk: Makefile $(build-files)
$(OBJ)/build.ninja $(OBJ)/build.targets &:
@echo "AB"
@mkdir -p $(OBJ)
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ) build/ab.py -t +all -o $@ \
build.py || rm -f $@
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ)/__pycache__ build/ab.py \
-o $(OBJ) build.py \
-v $(OBJ)/vars.txt \
|| (rm -f $@ && false)
include $(OBJ)/build.targets
.PHONY: $(ninja-targets)
.NOTPARALLEL:
$(ninja-targets): $(OBJ)/build.ninja
+$(hide) $(NINJA) -f $(OBJ)/build.ninja $@

2
build/ab.ninja Normal file
View File

@@ -0,0 +1,2 @@
rule rule
command = $command

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,251 +0,0 @@
local OBJDIR = "$(OBJDIR)"
local function objdir(e)
return concatpath(OBJDIR, e.cwd, e.name)
end
definerule("normalrule",
{
ins = { type="targets" },
deps = { type="targets", default={} },
outs = { type="targets", default={} },
outleaves = { type="strings" },
label = { type="string", optional=true },
objdir = { type="string", optional=true },
commands = { type="strings" },
},
function (e)
local dir = e.objdir or objdir(e)
local realouts = {}
for _, v in pairs(e.outleaves) do
realouts[#realouts+1] = concatpath(dir, v)
end
local vars = inherit(e.vars, {
dir = dir
})
local result = simplerule {
name = e.name,
ins = e.ins,
deps = e.deps,
outs = concat(realouts, filenamesof(e.outs)),
label = e.label,
commands = e.commands,
vars = vars,
}
result.dir = dir
return result
end
)
local function is_clike(f)
return f:find("%.c$") or f:find("%.cc$") or f:find("%.cpp$")
end
definerule("cfile",
{
srcs = { type="targets" },
deps = { type="targets", default={} }
},
function (e)
local cflags = e.vars.cflags
local cxxflags = e.vars.cxxflags
for _, target in ipairs(targetsof(e.deps)) do
if target.is.clibrary then
cflags = concat(cflags, target.dep_cflags)
cxxflags = concat(cxxflags, target.dep_cxxflags)
end
end
local src = filter(filenamesof(e.srcs), is_clike)
local cmd
local cxx = false
if src[1]:find("%.c$") then
cmd = "$(CC) -c -o %{outs[1]} %{ins[1]} %{hdrpaths} %{cflags}"
else
cmd = "$(CXX) -c -o %{outs[1]} %{ins[1]} %{hdrpaths} %{cflags} %{cxxflags}"
cxx = true
end
local outleaf = basename(e.name)..".o"
local rule = normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
deps = e.deps,
outleaves = {outleaf},
label = e.label,
commands = cmd,
vars = {
hdrpaths = {},
cflags = cflags,
cxxflags = cxxflags,
}
}
rule.is.cxxfile = cxx
return rule
end
)
local function do_cfiles(e)
local outs = {}
local srcs = filenamesof(e.srcs)
for _, f in ipairs(sorted(filter(srcs, is_clike))) do
local ofile
if f:find(OBJDIR, 1, true) == 1 then
ofile = e.name.."/"..f:sub(#OBJDIR+1)..".o"
else
ofile = e.name.."/"..f..".o"
end
outs[#outs+1] = cfile {
name = ofile,
srcs = { f },
deps = e.deps
}
end
return outs
end
definerule("clibrary",
{
srcs = { type="targets", default={} },
deps = { type="targets", default={} },
hdrs = { type="targets", default={} },
dep_cflags = { type="strings", default={} },
dep_cxxflags = { type="strings", default={} },
dep_ldflags = { type="strings", default={} },
dep_libs = { type="strings", default={} },
},
function (e)
local ins = do_cfiles(e)
local cxx = false
for _, f in ipairs(ins) do
if f.is.cxxfile then
cxx = true
break
end
end
local mkdirs = {}
local copies = {}
local outs = {}
local function copy_file(src, dest)
mkdirs[#mkdirs+1] = "mkdir -p %{dir}/"..dirname(dest)
copies[#copies+1] = "cp "..src.." %{dir}/"..dest
outs[#outs+1] = objdir(e).."/"..dest
end
local deps = {}
for k, v in pairs(e.hdrs) do
deps[#deps+1] = v
if type(k) == "number" then
v = filenamesof(v)
for _, v in ipairs(v) do
if not startswith(e.cwd, v) then
error(string.format("filename '%s' is not local to '%s' --- "..
"you'll have to specify the output filename manually", v, e.cwd))
end
copy_file(v, v:gsub("^"..e.cwd, ""))
end
else
v = filenamesof(v)
if #v ~= 1 then
error("each mapped hdrs item can only cope with a single file")
end
copy_file(v[1], k)
end
end
ins = sorted(filenamesof(ins))
local has_ar = (#ins ~= 0)
local lib = normalrule {
name = e.name,
cwd = e.cwd,
ins = sorted(filenamesof(ins)),
deps = deps,
outs = outs,
outleaves = { e.name..".a" },
label = e.label,
commands = {
sorted(mkdirs),
sorted(copies),
has_ar and "rm -f %{outs[1]} && $(AR) cqs %{outs[1]} %{ins}" or {},
}
}
lib.dep_cflags = concat(e.dep_cflags, "-I"..lib.dir)
lib.dep_cxxflags = e.dep_cxxflags
lib.dep_ldflags = e.dep_ldflags
lib.dep_libs = concat(e.dep_libs, has_ar and matching(filenamesof(lib), "%.a$") or {})
lib.dep_cxx = cxx
for _, d in pairs(targetsof(e.deps)) do
lib.dep_cflags = concat(lib.dep_cflags, d.dep_cflags)
lib.dep_cxxflags = concat(lib.dep_cxxflags, d.dep_cxxflags)
lib.dep_ldflags = concat(lib.dep_ldflags, d.dep_ldflags)
lib.dep_libs = concat(lib.dep_libs, d.dep_libs)
lib.dep_cxx = lib.dep_cxx or d.dep_cxx
end
return lib
end
)
definerule("cprogram",
{
srcs = { type="targets", default={} },
deps = { type="targets", default={} },
},
function (e)
local deps = e.deps
local ins = {}
local cxx = false
if (#e.srcs > 0) then
local objs = do_cfiles(e)
for _, obj in pairs(objs) do
if obj.is.cxxfile then
cxx = true
end
ins[#ins+1] = obj
end
end
local libs = {}
local cflags = {}
local cxxflags = {}
local ldflags = {}
for _, lib in pairs(e.deps) do
cflags = concat(cflags, lib.dep_cflags)
cxxflags = concat(cxxflags, lib.dep_cxxflags)
ldflags = concat(ldflags, lib.dep_ldflags)
libs = concat(libs, lib.dep_libs)
cxx = cxx or lib.dep_cxx
end
local command
if cxx then
command = "$(CXX) $(LDFLAGS) %{ldflags} -o %{outs[1]} %{ins} %{libs} %{libs}"
else
command = "$(CC) $(LDFLAGS) %{ldflags} -o %{outs[1]} %{ins} %{libs} %{libs}"
end
return normalrule {
name = e.name,
cwd = e.cwd,
deps = deps,
ins = ins,
outleaves = { e.name },
commands = { command },
vars = {
cflags = cflags,
cxxflags = cxxflags,
ldflags = ldflags,
libs = libs,
}
}
end
)

View File

@@ -1,30 +1,122 @@
from os.path import basename, join
from build.ab import (
ABException,
Rule,
Targets,
TargetsMap,
filenameof,
flatten,
filenamesof,
normalrule,
stripext,
flatten,
simplerule,
emit,
G,
)
from build.utils import stripext, collectattrs
from build.toolchain import Toolchain, HostToolchain
from os.path import *
from types import SimpleNamespace
if G.OSX != "yes":
G.STARTGROUP = "-Wl,--start-group"
G.ENDGROUP = "-Wl,--end-group"
else:
G.STARTGROUP = ""
G.ENDGROUP = ""
Toolchain.CC = ["$(CC) -c -o $[outs[0]] $[ins[0]] $(CFLAGS) $[cflags]"]
Toolchain.CPP = ["$(CC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
Toolchain.CXX = ["$(CXX) -c -o $[outs[0]] $[ins[0]] $(CXXFLAGS) $[cflags]"]
Toolchain.AR = ["$(AR) cqs $[outs[0]] $[ins]"]
Toolchain.ARXX = ["$(AR) cqs $[outs[0]] $[ins]"]
Toolchain.CLINK = [
"$(CC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
]
Toolchain.CXXLINK = [
"$(CXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
]
Toolchain.is_source_file = (
lambda f: f.endswith(".c")
or f.endswith(".cc")
or f.endswith(".cpp")
or f.endswith(".S")
or f.endswith(".s")
or f.endswith(".m")
or f.endswith(".mm")
)
def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
outleaf = stripext(basename(filenameof(srcs[0]))) + suffix
# Given a set of dependencies, finds the set of relevant library targets (i.e.
# contributes *.a files) for compiling C programs. The actual list of libraries
# is in dep.clibrary_files.
def _toolchain_find_library_targets(deps):
lib_deps = []
for d in deps:
lib_deps = _combine(lib_deps, d.args.get("clibrary_deps", []))
return lib_deps
normalrule(
Toolchain.find_c_library_targets = _toolchain_find_library_targets
# Given a set of dependencies, finds the set of relevant header targets (i.e.
# contributes *.h files) for compiling C programs. The actual list of libraries
# is in dep.cheader_files.
def _toolchain_find_header_targets(deps, initial=[]):
hdr_deps = initial
for d in deps:
hdr_deps = _combine(hdr_deps, d.args.get("cheader_deps", []))
return hdr_deps
Toolchain.find_c_header_targets = _toolchain_find_header_targets
HostToolchain.CC = ["$(HOSTCC) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
HostToolchain.CPP = ["$(HOSTCC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
HostToolchain.CXX = ["$(HOSTCXX) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
HostToolchain.AR = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
HostToolchain.ARXX = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
HostToolchain.CLINK = [
"$(HOSTCC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
]
HostToolchain.CXXLINK = [
"$(HOSTCXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
]
def _combine(list1, list2):
r = list(list1)
for i in list2:
if i not in r:
r.append(i)
return r
def _indirect(deps, name):
r = []
for d in deps:
r = _combine(r, d.args.get(name, [d]))
return r
def cfileimpl(self, name, srcs, deps, suffix, commands, label, toolchain, cflags):
outleaf = "=" + stripext(basename(filenameof(srcs[0]))) + suffix
hdr_deps = toolchain.find_c_header_targets(deps)
other_deps = [
d
for d in deps
if ("cheader_deps" not in d.args) and ("clibrary_deps" not in d.args)
]
hdr_files = collectattrs(targets=hdr_deps, name="cheader_files")
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
t = simplerule(
replaces=self,
ins=srcs,
deps=deps,
deps=other_deps + hdr_files,
outs=[outleaf],
label=label,
commands=commands,
cflags=cflags,
args={"cflags": cflags},
)
@@ -32,145 +124,223 @@ def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
def cfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
suffix=".o",
commands=["$(CC) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"],
toolchain=Toolchain,
label="CC",
):
cfileimpl(self, name, srcs, deps, suffix, commands, label, "cfile", cflags)
cfileimpl(
self,
name,
srcs,
deps,
suffix,
toolchain.CC,
toolchain.PREFIX + label,
toolchain,
cflags,
)
@Rule
def cxxfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
suffix=".o",
commands=["$(CXX) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"],
toolchain=Toolchain,
label="CXX",
):
cfileimpl(
self, name, srcs, deps, suffix, commands, label, "cxxfile", cflags
self,
name,
srcs,
deps,
suffix,
toolchain.CXX,
toolchain.PREFIX + label,
toolchain,
cflags,
)
def findsources(name, srcs, deps, cflags, filerule):
def _removeprefix(self, prefix):
if self.startswith(prefix):
return self[len(prefix) :]
else:
return self[:]
def findsources(self, srcs, deps, cflags, filerule, toolchain, cwd):
for f in filenamesof(srcs):
if not toolchain.is_source_file(f):
cflags = cflags + [f"-I{dirname(f)}"]
deps = deps + [f]
objs = []
for s in flatten(srcs):
objs += [
filerule(
name=join(name, f.removeprefix("$(OBJ)/")),
name=join(self.localname, _removeprefix(f, G.OBJ + "/")),
srcs=[f],
deps=deps,
cflags=cflags,
cflags=sorted(set(cflags)),
toolchain=toolchain,
cwd=cwd,
args=getattr(self, "explicit_args", {}),
)
for f in filenamesof(s)
if f.endswith(".c") or f.endswith(".cc") or f.endswith(".cpp")
for f in filenamesof([s])
if toolchain.is_source_file(f)
]
if any(f.endswith(".o") for f in filenamesof(s)):
if any(f.endswith(".o") for f in filenamesof([s])):
objs += [s]
return objs
def libraryimpl(
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, kind
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
commands,
label,
filerule,
):
if not srcs and not hdrs:
raise ABException(
"clibrary contains no sources and no exported headers"
hdr_deps = toolchain.find_c_header_targets(deps) + [self]
lib_deps = toolchain.find_c_library_targets(deps) + [self]
hr = None
hf = []
ar = None
if hdrs:
cs = []
ins = hdrs.values()
outs = []
i = 0
for dest, src in hdrs.items():
s = filenamesof([src])
assert len(s) == 1, "the target of a header must return exactly one file"
cs += [f"$(CP) $[ins[{i}]] $[outs[{i}]]"]
outs += ["=" + dest]
i = i + 1
hr = simplerule(
name=f"{self.localname}_hdr",
ins=ins,
outs=outs,
commands=cs,
label=toolchain.PREFIX + "CHEADERS",
)
hr.args["cheader_deps"] = [hr]
hr.args["cheader_files"] = [hr]
hf = [f"-I{hr.dir}"]
libraries = [d for d in deps if hasattr(d, "clibrary")]
for library in libraries:
if library.clibrary.cflags:
cflags += library.clibrary.cflags
if library.clibrary.ldflags:
ldflags += library.clibrary.ldflags
for f in filenamesof(srcs):
if f.endswith(".h"):
deps += [f]
hdrcs = []
hdrins = list(hdrs.values())
hdrouts = []
i = 0
for dest, src in hdrs.items():
s = filenamesof(src)
if len(s) != 1:
raise ABException(
"a dependency of an export must have exactly one output file"
)
hdrcs += ["cp {ins[" + str(i) + "]} {outs[" + str(i) + "]}"]
hdrouts += [dest]
i = i + 1
if not hasattr(self, "clibrary"):
self.clibrary = SimpleNamespace()
if srcs:
hr = None
if hdrcs:
hr = normalrule(
name=f"{name}_hdrs",
ins=hdrins,
outs=hdrouts,
label="HEADERS",
commands=hdrcs,
)
hr.materialise()
actualsrcs = findsources(
name,
# Can't depend on the current target to get the library headers, because
# if we do it'll cause a dependency loop.
objs = findsources(
self,
srcs,
deps + ([f"{name}_hdrs"] if hr else []),
cflags + ([f"-I{hr.normalrule.objdir}"] if hr else []),
kind,
deps + ([hr] if hr else []),
cflags + hf,
filerule,
toolchain,
self.cwd,
)
normalrule(
replaces=self,
ins=actualsrcs,
outs=[basename(name) + ".a"],
ar = simplerule(
name=f"{self.localname}_lib",
ins=objs,
outs=[f"={self.localname}.a"],
deps=deps,
label=label,
commands=commands if actualsrcs else [],
commands=commands,
)
ar.materialise()
self.clibrary.ldflags = ldflags
self.clibrary.cflags = ["-I" + hr.normalrule.objdir] if hr else []
else:
r = normalrule(
replaces=self,
ins=hdrins,
outs=hdrouts,
label="HEADERS",
commands=hdrcs,
)
r.materialise()
self.clibrary.ldflags = ldflags
self.clibrary.cflags = ["-I" + r.normalrule.objdir]
self.outs = ([hr] if hr else []) + ([ar] if ar else [])
self.deps = self.outs
self.args["cheader_deps"] = hdr_deps
self.args["clibrary_deps"] = lib_deps
self.args["cheader_files"] = [hr] if hr else []
self.args["clibrary_files"] = [ar] if ar else []
self.args["caller_cflags"] = caller_cflags + hf
self.args["caller_ldflags"] = caller_ldflags
@Rule
def clibrary(
self,
name,
srcs: Targets = [],
deps: Targets = [],
hdrs: TargetsMap = {},
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
commands=["$(AR) cqs {outs[0]} {ins}"],
toolchain=Toolchain,
label="LIB",
cfilerule=cfile,
):
return libraryimpl(
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cfile
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.AR,
toolchain.PREFIX + label,
cfilerule,
)
@Rule
def hostclibrary(
self,
name,
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="LIB",
cfilerule=cfile,
):
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.AR,
toolchain.PREFIX + label,
cfilerule,
)
@@ -178,40 +348,92 @@ def clibrary(
def cxxlibrary(
self,
name,
srcs: Targets = [],
deps: Targets = [],
hdrs: TargetsMap = {},
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
commands=["$(AR) cqs {outs[0]} {ins}"],
label="LIB",
toolchain=Toolchain,
label="CXXLIB",
cxxfilerule=cxxfile,
):
return libraryimpl(
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cxxfile
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.ARXX,
toolchain.PREFIX + label,
cxxfilerule,
)
@Rule
def hostcxxlibrary(
self,
name,
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="CXXLIB",
cxxfilerule=cxxfile,
):
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.ARXX,
toolchain.PREFIX + label,
cxxfilerule,
)
def programimpl(
self, name, srcs, deps, cflags, ldflags, commands, label, filerule, kind
self,
name,
srcs,
deps,
cflags,
ldflags,
toolchain,
commands,
label,
filerule,
):
libraries = [d for d in deps if hasattr(d, "clibrary")]
for library in libraries:
if library.clibrary.cflags:
cflags += library.clibrary.cflags
if library.clibrary.ldflags:
ldflags += library.clibrary.ldflags
cfiles = findsources(self, srcs, deps, cflags, filerule, toolchain, self.cwd)
deps += [f for f in filenamesof(srcs) if f.endswith(".h")]
lib_deps = toolchain.find_c_library_targets(deps)
libs = collectattrs(targets=lib_deps, name="clibrary_files")
ldflags = collectattrs(targets=lib_deps, name="caller_ldflags", initial=ldflags)
ars = [f for f in filenamesof(libraries) if f.endswith(".a")]
normalrule(
simplerule(
replaces=self,
ins=(findsources(name, srcs, deps, cflags, filerule) + ars + ars),
outs=[basename(name) + "$(EXT)"],
ins=cfiles + libs,
outs=[f"={self.localname}{toolchain.EXE}"],
deps=deps,
label=label,
commands=commands,
ldflags=ldflags,
args={"ldflags": ldflags},
)
@@ -219,12 +441,13 @@ def programimpl(
def cprogram(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
commands=["$(CC) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"],
toolchain=Toolchain,
label="CLINK",
cfilerule=cfile,
):
programimpl(
self,
@@ -233,10 +456,36 @@ def cprogram(
deps,
cflags,
ldflags,
commands,
label,
cfile,
"cprogram",
toolchain,
toolchain.CLINK,
toolchain.PREFIX + label,
cfilerule,
)
@Rule
def hostcprogram(
self,
name,
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="CLINK",
cfilerule=cfile,
):
programimpl(
self,
name,
srcs,
deps,
cflags,
ldflags,
toolchain,
toolchain.CLINK,
toolchain.PREFIX + label,
cfilerule,
)
@@ -244,12 +493,13 @@ def cprogram(
def cxxprogram(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
commands=["$(CXX) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"],
toolchain=Toolchain,
label="CXXLINK",
cxxfilerule=cxxfile,
):
programimpl(
self,
@@ -258,8 +508,73 @@ def cxxprogram(
deps,
cflags,
ldflags,
commands,
label,
cxxfile,
"cxxprogram",
toolchain,
toolchain.CXXLINK,
toolchain.PREFIX + label,
cxxfilerule,
)
@Rule
def hostcxxprogram(
self,
name,
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="CXXLINK",
cxxfilerule=cxxfile,
):
programimpl(
self,
name,
srcs,
deps,
cflags,
ldflags,
toolchain,
toolchain.CXXLINK,
toolchain.PREFIX + label,
cxxfilerule,
)
def _cppfileimpl(self, name, srcs, deps, cflags, toolchain):
hdr_deps = _indirect(deps, "cheader_deps")
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
simplerule(
replaces=self,
ins=srcs,
outs=[f"={self.localname}"],
deps=deps,
commands=toolchain.CPP,
args={"cflags": cflags},
label=toolchain.PREFIX + "CPPFILE",
)
@Rule
def cppfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
cflags=[],
toolchain=Toolchain,
):
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)
@Rule
def hostcppfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
cflags=[],
toolchain=HostToolchain,
):
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)

View File

@@ -1,38 +1,83 @@
from build.ab import Rule, emit, Target
from types import SimpleNamespace
from build.ab import Rule, Target, G
import os
import subprocess
emit(
"""
PKG_CONFIG ?= pkg-config
PACKAGES := $(shell $(PKG_CONFIG) --list-all | cut -d' ' -f1)
"""
)
class _PkgConfig:
package_present = set()
package_properties = {}
pkgconfig = None
def __init__(self, cmd):
assert cmd, "no pkg-config environment variable supplied"
self.pkgconfig = cmd
r = subprocess.run(f"{cmd} --list-all", shell=True, capture_output=True)
ps = r.stdout.decode("utf-8")
self.package_present = {l.split(" ", 1)[0] for l in ps.splitlines()}
def has_package(self, name):
return name in self.package_present
def get_property(self, name, flag):
p = f"{name}.{flag}"
if p not in self.package_properties:
r = subprocess.run(
f"{self.pkgconfig} {flag} {name}",
shell=True,
capture_output=True,
)
self.package_properties[p] = r.stdout.decode("utf-8").strip()
return self.package_properties[p]
TargetPkgConfig = _PkgConfig(G.PKG_CONFIG)
HostPkgConfig = _PkgConfig(G.HOST_PKG_CONFIG)
def _package(self, name, package, fallback, pkgconfig):
if pkgconfig.has_package(package):
cflags = pkgconfig.get_property(package, "--cflags")
ldflags = pkgconfig.get_property(package, "--libs")
if cflags:
self.args["caller_cflags"] = [cflags]
if ldflags:
self.args["caller_ldflags"] = [ldflags]
self.args["clibrary_deps"] = [self]
self.args["cheader_deps"] = [self]
self.traits.update({"clibrary", "cxxlibrary"})
return
assert fallback, f"Required package '{package}' not installed"
if "cheader_deps" in fallback.args:
self.args["cheader_deps"] = fallback.args["cheader_deps"]
if "clibrary_deps" in fallback.args:
self.args["clibrary_deps"] = fallback.args["clibrary_deps"]
if "cheader_files" in fallback.args:
self.args["cheader_files"] = fallback.args["cheader_files"]
if "clibrary_files" in fallback.args:
self.args["clibrary_files"] = fallback.args["clibrary_files"]
self.ins = fallback.ins
self.outs = fallback.outs
self.deps = fallback.deps
self.traits = fallback.traits
@Rule
def package(self, name, package=None, fallback: Target = None):
emit("ifeq ($(filter %s, $(PACKAGES)),)" % package)
if fallback:
emit(f"PACKAGE_CFLAGS_{package} :=", fallback.clibrary.cflags)
emit(f"PACKAGE_LDFLAGS_{package} := ", fallback.clibrary.ldflags)
emit(f"PACKAGE_DEP_{package} := ", fallback.name)
else:
emit(f"$(error Required package '{package}' not installed.)")
emit("else")
emit(
f"PACKAGE_CFLAGS_{package} := $(shell $(PKG_CONFIG) --cflags {package})"
)
emit(
f"PACKAGE_LDFLAGS_{package} := $(shell $(PKG_CONFIG) --libs {package})"
)
emit(f"PACKAGE_DEP_{package} := ")
emit("endif")
_package(self, name, package, fallback, TargetPkgConfig)
self.clibrary = SimpleNamespace()
self.clibrary.cflags = [f"$(PACKAGE_CFLAGS_{package})"]
self.clibrary.ldflags = [f"$(PACKAGE_LDFLAGS_{package})"]
self.ins = []
self.outs = [f"$(PACKAGE_DEP_{package})"]
@Rule
def hostpackage(self, name, package=None, fallback: Target = None):
_package(self, name, package, fallback, HostPkgConfig)
def has_package(name):
return TargetPkgConfig.has_package(name)
def has_host_package(name):
return HostPkgConfig.has_package(name)

View File

@@ -1,33 +1,77 @@
from os.path import join
from build.ab import Rule, Targets, emit, normalrule, filenamesof, flatten
from build.c import cxxlibrary
import build.pkg
from types import SimpleNamespace
from build.ab import Rule, Targets, emit, simplerule, filenamesof, G
from build.utils import filenamesmatchingof, collectattrs
from os.path import join, abspath, dirname, relpath
from build.pkg import has_package
emit(
"""
PROTOC ?= protoc
ifeq ($(filter protobuf, $(PACKAGES)),)
$(error Required package 'protobuf' not installed.)"
endif
"""
)
G.setdefault("PROTOC", "protoc")
G.setdefault("HOSTPROTOC", "hostprotoc")
assert has_package("protobuf"), "required package 'protobuf' not installed"
def _getprotodeps(deps):
r = set()
for d in deps:
r.update(d.args.get("protodeps", {d}))
return sorted(r)
@Rule
def proto(self, name, srcs: Targets = [], deps: Targets = []):
normalrule(
protodeps = _getprotodeps(deps)
descriptorlist = ":".join(
[
relpath(f, start=self.dir)
for f in filenamesmatchingof(protodeps, "*.descriptor")
]
)
dirs = sorted({"$[dir]/" + dirname(f) for f in filenamesof(srcs)})
simplerule(
replaces=self,
ins=srcs,
outs=[f"{name}.descriptor"],
deps=deps,
commands=[
"$(PROTOC) --include_source_info --descriptor_set_out={outs[0]} {ins}"
],
outs=[f"={self.localname}.descriptor"],
deps=protodeps,
commands=(
["mkdir -p " + (" ".join(dirs))]
+ [f"$(CP) {f} $[dir]/{f}" for f in filenamesof(srcs)]
+ [
"cd $[dir] && "
+ (
" ".join(
[
"$(PROTOC)",
"--proto_path=.",
"--include_source_info",
f"--descriptor_set_out={self.localname}.descriptor",
]
+ (
[f"--descriptor_set_in={descriptorlist}"]
if descriptorlist
else []
)
+ ["$[ins]"]
)
)
]
),
label="PROTO",
args={
"protosrcs": filenamesof(srcs),
"protodeps": set(protodeps) | {self},
},
)
self.proto.srcs = filenamesof(srcs) + flatten(
[s.proto.srcs for s in flatten(deps)]
@Rule
def protolib(self, name, srcs: Targets = []):
simplerule(
replaces=self,
label="PROTOLIB",
args={
"protosrcs": collectattrs(targets=srcs, name="protosrcs"),
"protodeps": set(_getprotodeps(srcs)),
},
)
@@ -35,31 +79,102 @@ def proto(self, name, srcs: Targets = [], deps: Targets = []):
def protocc(self, name, srcs: Targets = [], deps: Targets = []):
outs = []
protos = []
for f in flatten([s.proto.srcs for s in flatten(srcs + deps)]):
if f.endswith(".proto"):
cc = f.replace(".proto", ".pb.cc")
h = f.replace(".proto", ".pb.h")
protos += [f]
srcs += [f]
outs += [cc, h]
r = normalrule(
name=f"{name}_srcs",
ins=protos,
allsrcs = collectattrs(targets=srcs, name="protosrcs")
assert allsrcs, "no sources provided"
for f in filenamesmatchingof(allsrcs, "*.proto"):
cc = f.replace(".proto", ".pb.cc")
h = f.replace(".proto", ".pb.h")
protos += [f]
outs += ["=" + cc, "=" + h]
protodeps = _getprotodeps(deps + srcs)
descriptorlist = ":".join(
[
relpath(f, start=self.dir)
for f in filenamesmatchingof(protodeps, "*.descriptor")
]
)
r = simplerule(
name=f"{self.localname}_srcs",
cwd=self.cwd,
ins=srcs,
outs=outs,
deps=deps,
commands=["$(PROTOC) --cpp_out={self.normalrule.objdir} {ins}"],
deps=protodeps,
commands=[
"cd $[dir] && "
+ (
" ".join(
[
"$(PROTOC)",
"--proto_path=.",
"--cpp_out=.",
f"--descriptor_set_in={descriptorlist}",
]
+ protos
)
)
],
label="PROTOCC",
)
r.materialise()
headers = {
f: join(r.normalrule.objdir, f) for f in outs if f.endswith(".pb.h")
}
headers = {f[1:]: join(r.dir, f[1:]) for f in outs if f.endswith(".pb.h")}
from build.c import cxxlibrary
cxxlibrary(
replaces=self,
srcs=[f"{name}_srcs"],
srcs=[r],
deps=deps,
hdrs=headers,
cflags=[f"-I{r.normalrule.objdir}"],
)
@Rule
def protojava(self, name, srcs: Targets = [], deps: Targets = []):
outs = []
allsrcs = collectattrs(targets=srcs, name="protosrcs")
assert allsrcs, "no sources provided"
protos = []
for f in filenamesmatchingof(allsrcs, "*.proto"):
protos += [f]
srcs += [f]
descriptorlist = ":".join(
[abspath(f) for f in filenamesmatchingof(srcs + deps, "*.descriptor")]
)
r = simplerule(
name=f"{self.localname}_srcs",
cwd=self.cwd,
ins=protos,
outs=[f"={self.localname}.srcjar"],
deps=srcs + deps,
commands=[
"mkdir -p $[dir]/srcs",
"cd $[dir]/srcs && "
+ (
" ".join(
[
"$(PROTOC)",
"--proto_path=.",
"--java_out=.",
f"--descriptor_set_in={descriptorlist}",
]
+ protos
)
),
"$(JAR) cf $[outs[0]] -C $[dir]/srcs .",
],
traits={"srcjar"},
label="PROTOJAVA",
)
from build.java import javalibrary
javalibrary(
replaces=self,
deps=[r] + deps,
)

View File

@@ -1,18 +0,0 @@
definerule("test",
{
srcs = { type="targets", default={} },
},
function (e)
if vars.TESTS == "yes" then
normalrule {
name = e.name,
ins = e.srcs,
outleaves = { "log.txt" },
commands = {
"%{ins} > %{outs}",
}
}
end
end
)

11
build/toolchain.py Normal file
View File

@@ -0,0 +1,11 @@
import platform
_is_windows = (platform.system() == "Windows")
class Toolchain:
PREFIX = ""
EXE = ".exe" if _is_windows else ""
class HostToolchain(Toolchain):
PREFIX = "HOST"

View File

@@ -1,14 +1,76 @@
from build.ab import Rule, normalrule, Target, filenameof, Targets
from os.path import basename
from build.ab import (
Rule,
Target,
Targets,
filenameof,
filenamesof,
cwdStack,
error,
simplerule,
G
)
from os.path import relpath, splitext, join, basename, isfile
from glob import iglob
import fnmatch
import subprocess
import shutil
def filenamesmatchingof(xs, pattern):
return fnmatch.filter(filenamesof(xs), pattern)
def stripext(path):
return splitext(path)[0]
def targetswithtraitsof(xs, trait):
return [t for t in xs if trait in t.traits]
def collectattrs(*, targets, name, initial=[]):
s = set(initial)
for a in [t.args.get(name, []) for t in targets]:
s.update(a)
return sorted(s)
def itemsof(pattern, root=None, cwd=None):
if not cwd:
cwd = cwdStack[-1]
if not root:
root = "."
pattern = join(cwd, pattern)
root = join(cwd, root)
result = {}
for f in iglob(pattern, recursive=True):
try:
if isfile(f):
result[relpath(f, root)] = f
except ValueError:
error(f"file '{f}' is not in root '{root}'")
return result
def does_command_exist(cmd):
basecmd = cmd.strip().split()[0]
return shutil.which(basecmd)
def shell(cmd):
r = subprocess.check_output([G.SHELL, "-c", cmd])
return r.decode("utf-8").strip()
@Rule
def objectify(self, name, src: Target, symbol):
normalrule(
simplerule(
replaces=self,
ins=["build/_objectify.py", src],
outs=[basename(filenameof(src)) + ".h"],
commands=["$(PYTHON) {ins[0]} {ins[1]} " + symbol + " > {outs}"],
outs=[f"={basename(filenameof(src))}.h"],
commands=["$(PYTHON) $[ins[0]] $[ins[1]] " + symbol + " > $[outs]"],
label="OBJECTIFY",
)
@@ -19,25 +81,25 @@ def test(
name,
command: Target = None,
commands=None,
ins: Targets = [],
deps: Targets = [],
ins: Targets = None,
deps: Targets = None,
label="TEST",
):
if command:
normalrule(
simplerule(
replaces=self,
ins=[command],
outs=["sentinel"],
commands=["{ins[0]}", "touch {outs}"],
outs=["=sentinel"],
commands=["$[ins[0]]", "touch $[outs[0]]"],
deps=deps,
label=label,
)
else:
normalrule(
simplerule(
replaces=self,
ins=ins,
outs=["sentinel"],
commands=commands + ["touch {outs}"],
outs=["=sentinel"],
commands=commands + ["touch $[outs[0]]"],
deps=deps,
label=label,
)

25
build/zip.py Normal file
View File

@@ -0,0 +1,25 @@
from build.ab import (
Rule,
simplerule,
TargetsMap,
filenameof,
)
@Rule
def zip(self, name, flags="", items: TargetsMap = {}, extension="zip", label="ZIP"):
cs = ["$(PYTHON) build/_zip.py -z $[outs]"]
ins = []
for k, v in items.items():
cs += [f"-f {k} {filenameof(v)}"]
ins += [v]
simplerule(
replaces=self,
ins=ins,
deps=["build/_zip.py"],
outs=[f"={self.localname}." + extension],
commands=[" ".join(cs)],
label=label,
)

View File

@@ -1,5 +1,11 @@
import platform
import os
windows = platform.system() == "Windows"
osx = platform.system() == "Darwin"
unix = not windows
if os.getenv("BUILDTYPE") == "windows":
windows = True
osx = False
unix = False
else:
windows = False
osx = platform.system() == "Darwin"
unix = True

View File

@@ -2,33 +2,34 @@
#define ADF_NATIV_H
#ifdef __cplusplus
extern "C" {
extern "C"
{
#endif
#include "adf_str.h"
#define NATIVE_FILE 8001
struct nativeDevice
{
FILE* fd;
};
struct nativeDevice
{
FILE* fd;
};
struct nativeFunctions
{
/* called by adfMount() */
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
/* called by adfReadBlock() */
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfWriteBlock() */
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfMount() */
BOOL (*adfIsDevNative)(char*);
/* called by adfUnMount() */
RETCODE (*adfReleaseDevice)(struct Device*);
};
struct nativeFunctions
{
/* called by adfMount() */
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
/* called by adfReadBlock() */
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfWriteBlock() */
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfMount() */
BOOL (*adfIsDevNative)(char*);
/* called by adfUnMount() */
RETCODE (*adfReleaseDevice)(struct Device*);
};
extern void adfInitNativeFct();
extern void adfInitNativeFct();
#ifdef __cplusplus
}

View File

@@ -35,7 +35,7 @@ clibrary(
"./config.h",
"./src/adflib.h",
],
cflags=["-Idep/adflib", "-Idep/adflib/src"],
cflags=["-Wno-stringop-overflow"],
hdrs={
"adf_blk.h": "./src/adf_blk.h",
"adf_defs.h": "./src/adf_defs.h",

View File

@@ -1,2 +1 @@
/* empty config.h to keep the source happy */

View File

@@ -27,25 +27,28 @@
*
*/
#include"adf_str.h"
#include"prefix.h"
#include "adf_str.h"
#include "prefix.h"
RETCODE adfReadBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
RETCODE adfWriteBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
RETCODE adfReadBitmapExtBlock(struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
RETCODE adfWriteBitmapExtBlock(struct Volume*, SECTNUM, struct bBitmapExtBlock* );
RETCODE adfWriteBitmapBlock(
struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
RETCODE adfReadBitmapExtBlock(
struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
RETCODE adfWriteBitmapExtBlock(
struct Volume*, SECTNUM, struct bBitmapExtBlock*);
SECTNUM adfGet1FreeBlock(struct Volume *vol);
RETCODE adfUpdateBitmap(struct Volume *vol);
SECTNUM adfGet1FreeBlock(struct Volume* vol);
RETCODE adfUpdateBitmap(struct Volume* vol);
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
RETCODE adfReadBitmap(struct Volume* , SECTNUM nBlock, struct bRootBlock* root);
RETCODE adfReadBitmap(struct Volume*, SECTNUM nBlock, struct bRootBlock* root);
BOOL adfIsBlockFree(struct Volume* vol, SECTNUM nSect);
void adfSetBlockFree(struct Volume* vol, SECTNUM nSect);
void adfSetBlockUsed(struct Volume* vol, SECTNUM nSect);
BOOL adfGetFreeBlocks(struct Volume* vol, int nbSect, SECTNUM* sectList);
RETCODE adfCreateBitmap(struct Volume *vol);
RETCODE adfWriteNewBitmap(struct Volume *vol);
void adfFreeBitmap(struct Volume *vol);
RETCODE adfCreateBitmap(struct Volume* vol);
RETCODE adfWriteNewBitmap(struct Volume* vol);
void adfFreeBitmap(struct Volume* vol);
#endif /* ADF_BITM_H */

View File

@@ -25,264 +25,255 @@
*
*/
#ifndef ADF_BLK_H
#define ADF_BLK_H 1
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define LOGICAL_BLOCK_SIZE 512
#define LOGICAL_BLOCK_SIZE 512
/* ----- FILE SYSTEM ----- */
#define FSMASK_FFS 1
#define FSMASK_INTL 2
#define FSMASK_DIRCACHE 4
#define isFFS(c) ((c)&FSMASK_FFS)
#define isOFS(c) (!((c)&FSMASK_FFS))
#define isINTL(c) ((c)&FSMASK_INTL)
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
#define FSMASK_FFS 1
#define FSMASK_INTL 2
#define FSMASK_DIRCACHE 4
#define isFFS(c) ((c)&FSMASK_FFS)
#define isOFS(c) (!((c)&FSMASK_FFS))
#define isINTL(c) ((c)&FSMASK_INTL)
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
/* ----- ENTRIES ----- */
/* access constants */
#define ACCMASK_D (1<<0)
#define ACCMASK_E (1<<1)
#define ACCMASK_W (1<<2)
#define ACCMASK_R (1<<3)
#define ACCMASK_A (1<<4)
#define ACCMASK_P (1<<5)
#define ACCMASK_S (1<<6)
#define ACCMASK_H (1<<7)
#define hasD(c) ((c)&ACCMASK_D)
#define hasE(c) ((c)&ACCMASK_E)
#define hasW(c) ((c)&ACCMASK_W)
#define hasR(c) ((c)&ACCMASK_R)
#define hasA(c) ((c)&ACCMASK_A)
#define hasP(c) ((c)&ACCMASK_P)
#define hasS(c) ((c)&ACCMASK_S)
#define hasH(c) ((c)&ACCMASK_H)
#define ACCMASK_D (1 << 0)
#define ACCMASK_E (1 << 1)
#define ACCMASK_W (1 << 2)
#define ACCMASK_R (1 << 3)
#define ACCMASK_A (1 << 4)
#define ACCMASK_P (1 << 5)
#define ACCMASK_S (1 << 6)
#define ACCMASK_H (1 << 7)
#define hasD(c) ((c)&ACCMASK_D)
#define hasE(c) ((c)&ACCMASK_E)
#define hasW(c) ((c)&ACCMASK_W)
#define hasR(c) ((c)&ACCMASK_R)
#define hasA(c) ((c)&ACCMASK_A)
#define hasP(c) ((c)&ACCMASK_P)
#define hasS(c) ((c)&ACCMASK_S)
#define hasH(c) ((c)&ACCMASK_H)
/* ----- BLOCKS ----- */
/* block constants */
#define BM_VALID -1
#define BM_INVALID 0
#define BM_VALID -1
#define BM_INVALID 0
#define HT_SIZE 72
#define BM_SIZE 25
#define MAX_DATABLK 72
#define MAXNAMELEN 30
#define MAXCMMTLEN 79
#define HT_SIZE 72
#define BM_SIZE 25
#define MAX_DATABLK 72
#define MAXNAMELEN 30
#define MAXCMMTLEN 79
/* block primary and secondary types */
#define T_HEADER 2
#define ST_ROOT 1
#define ST_DIR 2
#define ST_FILE -3
#define ST_LFILE -4
#define ST_LDIR 4
#define ST_LSOFT 3
#define T_LIST 16
#define T_DATA 8
#define T_DIRC 33
#define T_HEADER 2
#define ST_ROOT 1
#define ST_DIR 2
#define ST_FILE -3
#define ST_LFILE -4
#define ST_LDIR 4
#define ST_LSOFT 3
#define T_LIST 16
#define T_DATA 8
#define T_DIRC 33
/*--- blocks structures --- */
struct bBootBlock {
/*000*/ char dosType[4];
/*004*/ ULONG checkSum;
/*008*/ int32_t rootBlock;
/*00c*/ UCHAR data[500+512];
struct bBootBlock
{
/*000*/ char dosType[4];
/*004*/ ULONG checkSum;
/*008*/ int32_t rootBlock;
/*00c*/ UCHAR data[500 + 512];
};
struct bRootBlock {
/*000*/ int32_t type;
int32_t headerKey;
int32_t highSeq;
/*00c*/ int32_t hashTableSize;
int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
/*13c*/ int32_t bmPages[BM_SIZE];
/*1a0*/ int32_t bmExt;
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
/*1a8*/ int32_t cMins;
/*1ac*/ int32_t cTicks;
/*1b0*/ char nameLen;
/*1b1*/ char diskName[MAXNAMELEN+1];
char r2[8];
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
/*1e0*/ int32_t ticks; /* 1/50 seconds */
/*1e4*/ int32_t coDays; /* creation date OFS */
/*1e8*/ int32_t coMins;
/*1ec*/ int32_t coTicks;
int32_t nextSameHash; /* == 0 */
int32_t parent; /* == 0 */
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
/*1fc*/ int32_t secType; /* == 1 */
struct bRootBlock
{
/*000*/ int32_t type;
int32_t headerKey;
int32_t highSeq;
/*00c*/ int32_t hashTableSize;
int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
/*13c*/ int32_t bmPages[BM_SIZE];
/*1a0*/ int32_t bmExt;
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
/*1a8*/ int32_t cMins;
/*1ac*/ int32_t cTicks;
/*1b0*/ char nameLen;
/*1b1*/ char diskName[MAXNAMELEN + 1];
char r2[8];
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
/*1e0*/ int32_t ticks; /* 1/50 seconds */
/*1e4*/ int32_t coDays; /* creation date OFS */
/*1e8*/ int32_t coMins;
/*1ec*/ int32_t coTicks;
int32_t nextSameHash; /* == 0 */
int32_t parent; /* == 0 */
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
/*1fc*/ int32_t secType; /* == 1 */
};
struct bFileHeaderBlock {
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* current block number */
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
/*138*/ int32_t r1;
/*13c*/ int32_t r2;
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ uint32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN+1];
char r3[91-(MAXCMMTLEN+1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char fileName[MAXNAMELEN+1];
int32_t r4;
/*1d4*/ int32_t real; /* unused == 0 */
/*1d8*/ int32_t nextLink; /* link chain */
int32_t r5[5];
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
/*1f4*/ int32_t parent; /* parent directory */
/*1f8*/ int32_t extension; /* pointer to extension block */
/*1fc*/ int32_t secType; /* == -3 */
struct bFileHeaderBlock
{
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* current block number */
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
/*138*/ int32_t r1;
/*13c*/ int32_t r2;
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ uint32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN + 1];
char r3[91 - (MAXCMMTLEN + 1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char fileName[MAXNAMELEN + 1];
int32_t r4;
/*1d4*/ int32_t real; /* unused == 0 */
/*1d8*/ int32_t nextLink; /* link chain */
int32_t r5[5];
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
/*1f4*/ int32_t parent; /* parent directory */
/*1f8*/ int32_t extension; /* pointer to extension block */
/*1fc*/ int32_t secType; /* == -3 */
};
/*--- file header extension block structure ---*/
struct bFileExtBlock {
/*000*/ int32_t type; /* == 0x10 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq;
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
int32_t r[45];
int32_t info; /* == 0 */
int32_t nextSameHash; /* == 0 */
/*1f4*/ int32_t parent; /* header block */
/*1f8*/ int32_t extension; /* next header extension block */
/*1fc*/ int32_t secType; /* -3 */
struct bFileExtBlock
{
/*000*/ int32_t type; /* == 0x10 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq;
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
int32_t r[45];
int32_t info; /* == 0 */
int32_t nextSameHash; /* == 0 */
/*1f4*/ int32_t parent; /* header block */
/*1f8*/ int32_t extension; /* next header extension block */
/*1fc*/ int32_t secType; /* -3 */
};
struct bDirBlock {
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq; /* == 0 */
/*00c*/ int32_t hashTableSize; /* == 0 */
int32_t r1; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
int32_t r2[2];
/*140*/ int32_t access;
int32_t r4; /* == 0 */
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN+1];
char r5[91-(MAXCMMTLEN+1)];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char dirName[MAXNAMELEN+1];
int32_t r6;
/*1d4*/ int32_t real; /* ==0 */
/*1d8*/ int32_t nextLink; /* link list */
int32_t r7[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension; /* FFS : first directory cache */
/*1fc*/ int32_t secType; /* == 2 */
struct bDirBlock
{
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq; /* == 0 */
/*00c*/ int32_t hashTableSize; /* == 0 */
int32_t r1; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
int32_t r2[2];
/*140*/ int32_t access;
int32_t r4; /* == 0 */
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN + 1];
char r5[91 - (MAXCMMTLEN + 1)];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char dirName[MAXNAMELEN + 1];
int32_t r6;
/*1d4*/ int32_t real; /* ==0 */
/*1d8*/ int32_t nextLink; /* link list */
int32_t r7[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension; /* FFS : first directory cache */
/*1fc*/ int32_t secType; /* == 2 */
};
struct bOFSDataBlock{
/*000*/ int32_t type; /* == 8 */
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
/*008*/ int32_t seqNum; /* file data block number */
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
/*010*/ int32_t nextData; /* next data block */
/*014*/ ULONG checkSum;
/*018*/ UCHAR data[488];
struct bOFSDataBlock
{
/*000*/ int32_t type; /* == 8 */
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
/*008*/ int32_t seqNum; /* file data block number */
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
/*010*/ int32_t nextData; /* next data block */
/*014*/ ULONG checkSum;
/*018*/ UCHAR data[488];
/*200*/ };
/* --- bitmap --- */
struct bBitmapBlock {
/*000*/ ULONG checkSum;
/*004*/ ULONG map[127];
};
struct bBitmapExtBlock {
/*000*/ int32_t bmPages[127];
/*1fc*/ int32_t nextBlock;
};
struct bLinkBlock {
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* self pointer */
int32_t r1[3];
/*014*/ ULONG checkSum;
/*018*/ char realName[64];
int32_t r2[83];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN+1];
int32_t r3;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r4[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
int32_t r5;
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
};
struct bBitmapBlock
{
/*000*/ ULONG checkSum;
/*004*/ ULONG map[127];
};
struct bBitmapExtBlock
{
/*000*/ int32_t bmPages[127];
/*1fc*/ int32_t nextBlock;
};
struct bLinkBlock
{
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* self pointer */
int32_t r1[3];
/*014*/ ULONG checkSum;
/*018*/ char realName[64];
int32_t r2[83];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN + 1];
int32_t r3;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r4[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
int32_t r5;
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
};
/*--- directory cache block structure ---*/
struct bDirCacheBlock {
/*000*/ int32_t type; /* == 33 */
/*004*/ int32_t headerKey;
/*008*/ int32_t parent;
/*00c*/ int32_t recordsNb;
/*010*/ int32_t nextDirC;
/*014*/ ULONG checkSum;
/*018*/ uint8_t records[488];
};
struct bDirCacheBlock
{
/*000*/ int32_t type; /* == 33 */
/*004*/ int32_t headerKey;
/*008*/ int32_t parent;
/*00c*/ int32_t recordsNb;
/*010*/ int32_t nextDirC;
/*014*/ ULONG checkSum;
/*018*/ uint8_t records[488];
};
#endif /* ADF_BLK_H */
/*##########################################################################*/

View File

@@ -27,20 +27,28 @@
*
*/
#include "adf_str.h"
void adfGetCacheEntry(struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
int adfPutCacheEntry( struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
void adfGetCacheEntry(
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
int adfPutCacheEntry(
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
struct List* adfGetDirEntCache(struct Volume *vol, SECTNUM dir, BOOL recurs);
struct List* adfGetDirEntCache(struct Volume* vol, SECTNUM dir, BOOL recurs);
RETCODE adfCreateEmptyCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM nSect);
RETCODE adfAddInCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry);
RETCODE adfUpdateCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry, BOOL);
RETCODE adfDelFromCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM);
RETCODE adfCreateEmptyCache(
struct Volume* vol, struct bEntryBlock* parent, SECTNUM nSect);
RETCODE adfAddInCache(
struct Volume* vol, struct bEntryBlock* parent, struct bEntryBlock* entry);
RETCODE adfUpdateCache(struct Volume* vol,
struct bEntryBlock* parent,
struct bEntryBlock* entry,
BOOL);
RETCODE adfDelFromCache(
struct Volume* vol, struct bEntryBlock* parent, SECTNUM);
RETCODE adfReadDirCBlock(struct Volume *vol, SECTNUM nSect, struct bDirCacheBlock *dirc);
RETCODE adfReadDirCBlock(
struct Volume* vol, SECTNUM nSect, struct bDirCacheBlock* dirc);
RETCODE adfWriteDirCBlock(struct Volume*, int32_t, struct bDirCacheBlock* dirc);
#endif /* _ADF_CACHE_H */

View File

@@ -24,7 +24,6 @@
*
*/
#ifndef _ADF_DEFS_H
#define _ADF_DEFS_H 1
@@ -34,38 +33,33 @@
#define SECTNUM int32_t
#define RETCODE int32_t
#define TRUE 1
#define FALSE 0
#define TRUE 1
#define FALSE 0
#include <stdint.h>
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define BOOL int
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define BOOL int
/* defines max and min */
#ifndef max
#define max(a,b) (a)>(b) ? (a) : (b)
#define max(a, b) (a) > (b) ? (a) : (b)
#endif
#ifndef min
#define min(a,b) (a)<(b) ? (a) : (b)
#define min(a, b) (a) < (b) ? (a) : (b)
#endif
/* (*byte) to (*short) and (*byte) to (*long) conversion */
#define Short(p) ((p)[0]<<8 | (p)[1])
#define Long(p) (Short(p)<<16 | Short(p+2))
#define Short(p) ((p)[0] << 8 | (p)[1])
#define Long(p) (Short(p) << 16 | Short(p + 2))
/* swap short and swap long macros for little endian machines */
#define swapShort(p) ((p)[0]<<8 | (p)[1])
#define swapLong(p) (swapShort(p)<<16 | swapShort(p+2))
#define swapShort(p) ((p)[0] << 8 | (p)[1])
#define swapLong(p) (swapShort(p) << 16 | swapShort(p + 2))
#endif /* _ADF_DEFS_H */
/*##########################################################################*/

View File

@@ -26,45 +26,54 @@
*
*/
#include"adf_str.h"
#include"adf_err.h"
#include"adf_defs.h"
#include "adf_str.h"
#include "adf_err.h"
#include "adf_defs.h"
#include"prefix.h"
#include "prefix.h"
PREFIX RETCODE adfToRootDir(struct Volume *vol);
BOOL isDirEmpty(struct bDirBlock *dir);
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
PREFIX RETCODE adfToRootDir(struct Volume* vol);
BOOL isDirEmpty(struct bDirBlock* dir);
PREFIX RETCODE adfRemoveEntry(struct Volume* vol, SECTNUM pSect, char* name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
PREFIX struct List* adfGetRDirEnt(
struct Volume* vol, SECTNUM nSect, BOOL recurs);
PREFIX void adfFreeDirList(struct List* list);
RETCODE adfEntBlock2Entry(struct bEntryBlock *entryBlk, struct Entry *entry);
PREFIX void adfFreeEntry(struct Entry *entry);
RETCODE adfCreateFile(struct Volume* vol, SECTNUM parent, char *name,
struct bFileHeaderBlock *fhdr);
RETCODE adfEntBlock2Entry(struct bEntryBlock* entryBlk, struct Entry* entry);
PREFIX void adfFreeEntry(struct Entry* entry);
RETCODE adfCreateFile(struct Volume* vol,
SECTNUM parent,
char* name,
struct bFileHeaderBlock* fhdr);
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
SECTNUM adfCreateEntry(struct Volume *vol, struct bEntryBlock *dir, char *name, SECTNUM );
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *new);
SECTNUM adfCreateEntry(
struct Volume* vol, struct bEntryBlock* dir, char* name, SECTNUM);
PREFIX RETCODE adfRenameEntry(
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* new);
RETCODE adfReadEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
RETCODE adfWriteDirBlock(struct Volume* vol, SECTNUM nSect, struct bDirBlock *dir);
RETCODE adfWriteEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock *ent);
RETCODE adfReadEntryBlock(
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
RETCODE adfWriteDirBlock(
struct Volume* vol, SECTNUM nSect, struct bDirBlock* dir);
RETCODE adfWriteEntryBlock(
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
char* adfAccess2String(int32_t acc);
uint8_t adfIntlToUpper(uint8_t c);
int adfGetHashValue(uint8_t *name, BOOL intl);
void myToUpper( uint8_t *ostr, uint8_t *nstr, int,BOOL intl );
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
int adfGetHashValue(uint8_t* name, BOOL intl);
void myToUpper(uint8_t* ostr, uint8_t* nstr, int, BOOL intl);
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
PREFIX RETCODE adfParentDir(struct Volume* vol);
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
SECTNUM adfNameToEntryBlk(struct Volume *vol, int32_t ht[], char* name,
struct bEntryBlock *entry, SECTNUM *);
SECTNUM adfNameToEntryBlk(struct Volume* vol,
int32_t ht[],
char* name,
struct bEntryBlock* entry,
SECTNUM*);
PREFIX void printEntry(struct Entry* entry);
void adfFreeDirList(struct List* list);
#endif /* ADF_DIR_H */

View File

@@ -31,21 +31,21 @@
#include "adf_str.h"
#include "adf_defs.h"
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
PREFIX void adfUnMount(struct Volume *vol);
PREFIX void adfVolumeInfo(struct Volume *vol);
struct Volume* adfCreateVol( struct Device* dev, int32_t start, int32_t len,
char* volName, int volType );
PREFIX struct Volume* adfMount(struct Device* dev, int nPart, BOOL readOnly);
PREFIX void adfUnMount(struct Volume* vol);
PREFIX void adfVolumeInfo(struct Volume* vol);
struct Volume* adfCreateVol(
struct Device* dev, int32_t start, int32_t len, char* volName, int volType);
/*void adfReadBitmap(struct Volume* , int32_t nBlock, struct bRootBlock* root);
void adfUpdateBitmap(struct Volume*);
*/
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
#endif /* _ADF_DISK_H */

View File

@@ -7,7 +7,7 @@
* adf_dump.h
*
* $Id$
*
*
* This file is part of ADFLib.
*
* ADFLib is free software; you can redistribute it and/or modify
@@ -26,14 +26,13 @@
*
*/
PREFIX struct Device*
adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
PREFIX struct Device* adfCreateDumpDevice(
char* filename, int32_t cyl, int32_t heads, int32_t sec);
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
BOOL adfInitDumpDevice(struct Device* dev, char* name,BOOL);
BOOL adfReadDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
BOOL adfWriteDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
RETCODE adfReleaseDumpDevice(struct Device *dev);
BOOL adfInitDumpDevice(struct Device* dev, char* name, BOOL);
BOOL adfReadDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
BOOL adfWriteDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
RETCODE adfReleaseDumpDevice(struct Device* dev);
#endif /* ADF_DUMP_H */
/*##########################################################################*/

View File

@@ -7,7 +7,7 @@
* adf_env.h
*
* $Id$
*
*
* This file is part of ADFLib.
*
* ADFLib is free software; you can redistribute it and/or modify
@@ -26,13 +26,15 @@
*
*/
#include"prefix.h"
#include "prefix.h"
PREFIX void adfEnvInitDefault();
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*),
void(*n)(SECTNUM,int) );
PREFIX void adfSetEnvFct(void (*e)(char*),
void (*w)(char*),
void (*v)(char*),
void (*n)(SECTNUM, int));
PREFIX void adfEnvCleanUp();
PREFIX void adfChgEnvProp(int prop, void *new);
PREFIX void adfChgEnvProp(int prop, void* new);
PREFIX char* adfGetVersionNumber();
PREFIX char* adfGetVersionDate();

View File

@@ -26,39 +26,36 @@
*
*/
#define hasRC(rc, c) ((rc) & (c))
#define hasRC(rc,c) ((rc)&(c))
#define RC_OK 0
#define RC_ERROR -1
#define RC_OK 0
#define RC_ERROR -1
#define RC_MALLOC 1
#define RC_VOLFULL 2
#define RC_MALLOC 1
#define RC_VOLFULL 2
#define RC_FOPEN 1<<10
#define RC_NULLPTR 1<<12
#define RC_FOPEN 1 << 10
#define RC_NULLPTR 1 << 12
/* adfRead*Block() */
#define RC_BLOCKTYPE 1
#define RC_BLOCKSTYPE 1<<1
#define RC_BLOCKSUM 1<<2
#define RC_HEADERKEY 1<<3
#define RC_BLOCKREAD 1<<4
#define RC_BLOCKTYPE 1
#define RC_BLOCKSTYPE 1 << 1
#define RC_BLOCKSUM 1 << 2
#define RC_HEADERKEY 1 << 3
#define RC_BLOCKREAD 1 << 4
/* adfWrite*Block */
#define RC_BLOCKWRITE 1<<4
#define RC_BLOCKWRITE 1 << 4
/* adfReadBlock() */
#define RC_BLOCKOUTOFRANGE 1
#define RC_BLOCKNATREAD 1<<1
#define RC_BLOCKOUTOFRANGE 1
#define RC_BLOCKNATREAD 1 << 1
/* adfWriteBlock() */
/* RC_BLOCKOUTOFRANGE */
#define RC_BLOCKNATWRITE 1<<1
#define RC_BLOCKREADONLY 1<<2
#define RC_BLOCKNATWRITE 1 << 1
#define RC_BLOCKREADONLY 1 << 2
/* adfInitDumpDevice() */
/* RC_FOPEN */
@@ -66,17 +63,16 @@
/* adfNativeReadBlock(), adfReadDumpSector() */
#define RC_BLOCKSHORTREAD 1
#define RC_BLOCKFSEEK 1<<1
#define RC_BLOCKSHORTREAD 1
#define RC_BLOCKFSEEK 1 << 1
/* adfNativeWriteBlock(), adfWriteDumpSector() */
#define RC_BLOCKSHORTWRITE 1
#define RC_BLOCKSHORTWRITE 1
/* RC_BLOCKFSEEK */
/*-- adfReadRDSKblock --*/
#define RC_BLOCKID 1<<5
#define RC_BLOCKID 1 << 5
/*-- adfWriteRDSKblock() --*/
/*RC_BLOCKREADONLY*/

View File

@@ -26,35 +26,40 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include"adf_str.h"
#include "adf_str.h"
RETCODE adfGetFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry,
struct FileBlocks* );
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock *entry);
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
RETCODE adfGetFileBlocks(
struct Volume* vol, struct bFileHeaderBlock* entry, struct FileBlocks*);
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry);
PREFIX int32_t adfFileRealSize(
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
int32_t adfPos2DataBlock(int32_t pos, int blockSize, int *posInExtBlk, int *posInDataBlk, int32_t *curDataN );
int32_t adfPos2DataBlock(int32_t pos,
int blockSize,
int* posInExtBlk,
int* posInDataBlk,
int32_t* curDataN);
RETCODE adfWriteFileHdrBlock(struct Volume *vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
RETCODE adfWriteFileHdrBlock(
struct Volume* vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
RETCODE adfReadDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
RETCODE adfWriteDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
RETCODE adfReadFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
RETCODE adfWriteFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
RETCODE adfReadDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
RETCODE adfWriteDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
RETCODE adfReadFileExtBlock(
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
RETCODE adfWriteFileExtBlock(
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
PREFIX void adfCloseFile(struct File *file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
PREFIX void adfCloseFile(struct File* file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
PREFIX BOOL adfEndOfFile(struct File* file);
PREFIX void adfFileSeek(struct File *file, uint32_t pos); /* BV */
PREFIX void adfFileSeek(struct File* file, uint32_t pos); /* BV */
RETCODE adfReadNextFileBlock(struct File* file);
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
SECTNUM adfCreateNextFileBlock(struct File* file);
PREFIX void adfFlushFile(struct File *file);
PREFIX void adfFlushFile(struct File* file);
#endif /* ADF_FILE_H */

View File

@@ -28,38 +28,48 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include "adf_str.h"
#include "hd_blk.h"
#include "adf_err.h"
int adfDevType(struct Device *dev);
PREFIX void adfDeviceInfo(struct Device *dev);
int adfDevType(struct Device* dev);
PREFIX void adfDeviceInfo(struct Device* dev);
RETCODE adfMountHd(struct Device *dev);
RETCODE adfMountHd(struct Device* dev);
RETCODE adfMountFlop(struct Device* dev);
PREFIX struct Device* adfMountDev( char* filename,BOOL);
PREFIX void adfUnMountDev( struct Device* dev);
PREFIX struct Device* adfMountDev(char* filename, BOOL);
PREFIX void adfUnMountDev(struct Device* dev);
RETCODE adfCreateHdHeader(struct Device* dev, int n, struct Partition** partList );
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
RETCODE adfCreateHdHeader(
struct Device* dev, int n, struct Partition** partList);
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType);
PREFIX RETCODE adfCreateHd(
struct Device* dev, int n, struct Partition** partList);
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
struct Device* adfCreateDev(char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
RETCODE adfReadBlockDev( struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
RETCODE adfWriteBlockDev(struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
RETCODE adfReadRDSKblock( struct Device* dev, struct bRDSKblock* blk );
RETCODE adfWriteRDSKblock(struct Device *dev, struct bRDSKblock* rdsk);
RETCODE adfReadPARTblock( struct Device* dev, int32_t nSect, struct bPARTblock* blk );
RETCODE adfWritePARTblock(struct Device *dev, int32_t nSect, struct bPARTblock* part);
RETCODE adfReadFSHDblock( struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
RETCODE adfWriteFSHDblock(struct Device *dev, int32_t nSect, struct bFSHDblock* fshd);
RETCODE adfReadLSEGblock(struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
RETCODE adfWriteLSEGblock(struct Device *dev, int32_t nSect, struct bLSEGblock* lseg);
struct Device* adfCreateDev(
char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
RETCODE adfReadBlockDev(
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
RETCODE adfWriteBlockDev(
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
RETCODE adfReadRDSKblock(struct Device* dev, struct bRDSKblock* blk);
RETCODE adfWriteRDSKblock(struct Device* dev, struct bRDSKblock* rdsk);
RETCODE adfReadPARTblock(
struct Device* dev, int32_t nSect, struct bPARTblock* blk);
RETCODE adfWritePARTblock(
struct Device* dev, int32_t nSect, struct bPARTblock* part);
RETCODE adfReadFSHDblock(
struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
RETCODE adfWriteFSHDblock(
struct Device* dev, int32_t nSect, struct bFSHDblock* fshd);
RETCODE adfReadLSEGblock(
struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
RETCODE adfWriteLSEGblock(
struct Device* dev, int32_t nSect, struct bLSEGblock* lseg);
#endif /* _ADF_HD_H */

View File

@@ -7,7 +7,7 @@
* adf_link.h
*
* $Id$
*
*
* This file is part of ADFLib.
*
* ADFLib is free software; you can redistribute it and/or modify
@@ -26,11 +26,13 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include <stdint.h>
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *vol, SECTNUM nSect, SECTNUM lPar,
char **name, int32_t *size);
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume* vol,
SECTNUM nSect,
SECTNUM lPar,
char** name,
int32_t* size);
#endif /* ADF_LINK_H */
/*##########################################################################*/

View File

@@ -30,38 +30,40 @@
#include "adf_str.h"
#define SW_LONG 4
#define SW_LONG 4
#define SW_SHORT 2
#define SW_CHAR 1
#define SW_CHAR 1
#define MAX_SWTYPE 11
#define SWBL_BOOT 0
#define SWBL_ROOT 1
#define SWBL_DATA 2
#define SWBL_FILE 3
#define SWBL_ENTRY 3
#define SWBL_DIR 3
#define SWBL_CACHE 4
#define SWBL_BITMAP 5
#define SWBL_FEXT 5
#define SWBL_LINK 6
#define SWBL_BITMAPE 5
#define SWBL_RDSK 7
#define SWBL_BADB 8
#define SWBL_PART 9
#define SWBL_FSHD 10
#define SWBL_LSEG 11
#define SWBL_BOOT 0
#define SWBL_ROOT 1
#define SWBL_DATA 2
#define SWBL_FILE 3
#define SWBL_ENTRY 3
#define SWBL_DIR 3
#define SWBL_CACHE 4
#define SWBL_BITMAP 5
#define SWBL_FEXT 5
#define SWBL_LINK 6
#define SWBL_BITMAPE 5
#define SWBL_RDSK 7
#define SWBL_BADB 8
#define SWBL_PART 9
#define SWBL_FSHD 10
#define SWBL_LSEG 11
RETCODE adfReadRootBlock(struct Volume*, int32_t nSect, struct bRootBlock* root);
RETCODE adfWriteRootBlock(struct Volume* vol, int32_t nSect, struct bRootBlock* root);
RETCODE adfReadRootBlock(
struct Volume*, int32_t nSect, struct bRootBlock* root);
RETCODE adfWriteRootBlock(
struct Volume* vol, int32_t nSect, struct bRootBlock* root);
RETCODE adfReadBootBlock(struct Volume*, struct bBootBlock* boot);
RETCODE adfWriteBootBlock(struct Volume* vol, struct bBootBlock* boot);
uint32_t adfBootSum(uint8_t *buf);
uint32_t adfNormalSum( uint8_t *buf, int offset, int bufLen );
uint32_t adfBootSum(uint8_t* buf);
uint32_t adfNormalSum(uint8_t* buf, int offset, int bufLen);
void swapEndian( uint8_t *buf, int type );
void swapEndian(uint8_t* buf, int type);
#endif /* _ADF_RAW_H */

View File

@@ -26,17 +26,16 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include "adf_str.h"
RETCODE adfReadGenBlock(struct Volume *vol, SECTNUM nSect, struct GenBlock *block);
RETCODE adfReadGenBlock(
struct Volume* vol, SECTNUM nSect, struct GenBlock* block);
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
PREFIX void adfFreeDelList(struct List* list);
/*##########################################################################*/
#endif /* _ADF_SALV_H */

View File

@@ -28,41 +28,43 @@
*
*/
#include<stdio.h>
#include <stdio.h>
#include"adf_defs.h"
#include"adf_blk.h"
#include"adf_err.h"
#include "adf_defs.h"
#include "adf_blk.h"
#include "adf_err.h"
/* ----- VOLUME ----- */
struct Volume {
struct Volume
{
struct Device* dev;
SECTNUM firstBlock; /* first block of data area (from beginning of device) */
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
SECTNUM rootBlock; /* root block (from firstBlock) */
SECTNUM
firstBlock; /* first block of data area (from beginning of device) */
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
SECTNUM rootBlock; /* root block (from firstBlock) */
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
BOOL bootCode;
BOOL readOnly;
int datablockSize; /* 488 or 512 */
int blockSize; /* 512 */
int datablockSize; /* 488 or 512 */
int blockSize; /* 512 */
char *volName;
char* volName;
BOOL mounted;
int32_t bitmapSize; /* in blocks */
SECTNUM *bitmapBlocks; /* bitmap blocks pointers */
struct bBitmapBlock **bitmapTable;
BOOL *bitmapBlocksChg;
int32_t bitmapSize; /* in blocks */
SECTNUM* bitmapBlocks; /* bitmap blocks pointers */
struct bBitmapBlock** bitmapTable;
BOOL* bitmapBlocksChg;
SECTNUM curDirPtr;
};
struct Partition {
struct Partition
{
int32_t startCyl;
int32_t lenCyl;
char* volName;
@@ -71,35 +73,36 @@ struct Partition {
/* ----- DEVICES ----- */
#define DEVTYPE_FLOPDD 1
#define DEVTYPE_FLOPHD 2
#define DEVTYPE_HARDDISK 3
#define DEVTYPE_HARDFILE 4
#define DEVTYPE_FLOPDD 1
#define DEVTYPE_FLOPHD 2
#define DEVTYPE_HARDDISK 3
#define DEVTYPE_HARDFILE 4
struct Device {
int devType; /* see below */
struct Device
{
int devType; /* see below */
BOOL readOnly;
int32_t size; /* in bytes */
int32_t size; /* in bytes */
int nVol; /* partitions */
struct Volume** volList;
int32_t cylinders; /* geometry */
int nVol; /* partitions */
struct Volume** volList;
int32_t cylinders; /* geometry */
int32_t heads;
int32_t sectors;
BOOL isNativeDev;
void *nativeDev;
void* nativeDev;
};
/* ----- FILE ----- */
struct File {
struct Volume *volume;
struct File
{
struct Volume* volume;
struct bFileHeaderBlock* fileHdr;
void *currentData;
void* currentData;
struct bFileExtBlock* currentExt;
int32_t nDataBlock;
@@ -109,12 +112,12 @@ struct File {
int posInDataBlk;
int posInExtBlk;
BOOL eof, writeMode;
};
};
/* ----- ENTRY ---- */
struct Entry{
struct Entry
{
int type;
char* name;
SECTNUM sector;
@@ -127,72 +130,72 @@ struct Entry{
int hour, mins, secs;
};
struct CacheEntry{
struct CacheEntry
{
int32_t header, size, protect;
short days, mins, ticks;
signed char type;
char nLen, cLen;
char name[MAXNAMELEN+1], comm[MAXCMMTLEN+1];
/* char *name, *comm;*/
char name[MAXNAMELEN + 1], comm[MAXCMMTLEN + 1];
/* char *name, *comm;*/
};
struct DateTime{
int year,mon,day,hour,min,sec;
struct DateTime
{
int year, mon, day, hour, min, sec;
};
/* ----- ENVIRONMENT ----- */
#define PR_VFCT 1
#define PR_WFCT 2
#define PR_EFCT 3
#define PR_NOTFCT 4
#define PR_USEDIRC 5
#define PR_USE_NOTFCT 6
#define PR_PROGBAR 7
#define PR_USE_PROGBAR 8
#define PR_RWACCESS 9
#define PR_VFCT 1
#define PR_WFCT 2
#define PR_EFCT 3
#define PR_NOTFCT 4
#define PR_USEDIRC 5
#define PR_USE_NOTFCT 6
#define PR_PROGBAR 7
#define PR_USE_PROGBAR 8
#define PR_RWACCESS 9
#define PR_USE_RWACCESS 10
struct Env{
void (*vFct)(char*); /* verbose callback function */
void (*wFct)(char*); /* warning callback function */
void (*eFct)(char*); /* error callback function */
struct Env
{
void (*vFct)(char*); /* verbose callback function */
void (*wFct)(char*); /* warning callback function */
void (*eFct)(char*); /* error callback function */
void (*notifyFct)(SECTNUM, int);
BOOL useNotify;
void (*rwhAccess)(SECTNUM,SECTNUM,BOOL);
void (*rwhAccess)(SECTNUM, SECTNUM, BOOL);
BOOL useRWAccess;
void (*progressBar)(int);
BOOL useProgressBar;
BOOL useDirCache;
void *nativeFct;
void* nativeFct;
};
struct List{ /* generic linked tree */
void *content;
struct List
{ /* generic linked tree */
void* content;
struct List* subdir;
struct List* next;
};
struct GenBlock{
struct GenBlock
{
SECTNUM sect;
SECTNUM parent;
int type;
int secType;
char *name; /* if (type == 2 and (secType==2 or secType==-3)) */
char* name; /* if (type == 2 and (secType==2 or secType==-3)) */
};
struct FileBlocks{
struct FileBlocks
{
SECTNUM header;
int32_t nbExtens;
SECTNUM* extens;
@@ -200,36 +203,35 @@ struct FileBlocks{
SECTNUM* data;
};
struct bEntryBlock {
/*000*/ int32_t type; /* T_HEADER == 2 */
/*004*/ int32_t headerKey; /* current block number */
int32_t r1[3];
/*014*/ uint32_t checkSum;
/*018*/ int32_t hashTable[HT_SIZE];
int32_t r2[2];
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ int32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN+1];
char r3[91-(MAXCMMTLEN+1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN+1];
int32_t r4;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r5[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension;
/*1fc*/ int32_t secType;
};
struct bEntryBlock
{
/*000*/ int32_t type; /* T_HEADER == 2 */
/*004*/ int32_t headerKey; /* current block number */
int32_t r1[3];
/*014*/ uint32_t checkSum;
/*018*/ int32_t hashTable[HT_SIZE];
int32_t r2[2];
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ int32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN + 1];
char r3[91 - (MAXCMMTLEN + 1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN + 1];
int32_t r4;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r5[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension;
/*1fc*/ int32_t secType;
};
#define ENV_DECLARATION struct Env adfEnv
#endif /* _ADF_STR_H */
/*##########################################################################*/

View File

@@ -26,25 +26,22 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include "adf_str.h"
void swLong(uint8_t* buf, uint32_t val);
void swShort(uint8_t* buf, uint16_t val);
PREFIX struct List* newCell(struct List* list, void* content);
PREFIX void freeList(struct List* list);
void adfDays2Date(int32_t days, int *yy, int *mm, int *dd);
void adfDays2Date(int32_t days, int* yy, int* mm, int* dd);
BOOL adfIsLeap(int y);
void
adfTime2AmigaTime(struct DateTime dt, int32_t *day, int32_t *min, int32_t *ticks );
struct DateTime
adfGiveCurrentTime( void );
void adfTime2AmigaTime(
struct DateTime dt, int32_t* day, int32_t* min, int32_t* ticks);
struct DateTime adfGiveCurrentTime(void);
void dumpBlock(uint8_t *buf);
void dumpBlock(uint8_t* buf);
/*##########################################################################*/
#endif /* _ADF_UTIL_H */

View File

@@ -29,96 +29,107 @@
*/
#ifdef __cplusplus
extern "C" {
extern "C"
{
#endif /* __cplusplus */
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
#ifdef WIN32DLL
#define PREFIX __declspec(dllimport)
#else
#define PREFIX
#define PREFIX
#endif /* WIN32DLL */
#include "adf_defs.h"
#include "adf_str.h"
/* util */
PREFIX struct List* newCell(struct List* list, void* content);
PREFIX void freeList(struct List* list);
/* util */
PREFIX struct List* newCell(struct List* list, void* content);
PREFIX void freeList(struct List* list);
/* dir */
PREFIX struct Entry* adfFindEntry(struct Volume *vol, char* name);
PREFIX RETCODE adfToRootDir(struct Volume *vol);
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
PREFIX RETCODE adfParentDir(struct Volume* vol);
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
PREFIX void printEntry(struct Entry* entry);
PREFIX void adfFreeDirList(struct List* list);
PREFIX void adfFreeEntry(struct Entry *);
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *pNew); /* BV */
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
/* dir */
PREFIX struct Entry* adfFindEntry(struct Volume* vol, char* name);
PREFIX RETCODE adfToRootDir(struct Volume* vol);
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
PREFIX RETCODE adfParentDir(struct Volume* vol);
PREFIX RETCODE adfRemoveEntry(
struct Volume* vol, SECTNUM pSect, char* name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
PREFIX struct List* adfGetRDirEnt(
struct Volume* vol, SECTNUM nSect, BOOL recurs);
PREFIX void printEntry(struct Entry* entry);
PREFIX void adfFreeDirList(struct List* list);
PREFIX void adfFreeEntry(struct Entry*);
PREFIX RETCODE adfRenameEntry(
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* pNew); /* BV */
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
/* file */
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
PREFIX void adfCloseFile(struct File *file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
PREFIX BOOL adfEndOfFile(struct File* file);
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
PREFIX void adfFlushFile(struct File *file);
PREFIX void adfFileSeek(struct File *file, uint32_t pos);
/* file */
PREFIX int32_t adfFileRealSize(
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
PREFIX void adfCloseFile(struct File* file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
PREFIX BOOL adfEndOfFile(struct File* file);
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
PREFIX void adfFlushFile(struct File* file);
PREFIX void adfFileSeek(struct File* file, uint32_t pos);
/* volume */
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
PREFIX void adfUnMount(struct Volume *vol);
PREFIX void adfVolumeInfo(struct Volume *vol);
/* volume */
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
PREFIX struct Volume* adfMount(
struct Device* dev, int nPart, BOOL readOnly);
PREFIX void adfUnMount(struct Volume* vol);
PREFIX void adfVolumeInfo(struct Volume* vol);
/* device */
PREFIX void adfDeviceInfo(struct Device *dev);
PREFIX struct Device* adfMountDev( char* filename,BOOL ro);
PREFIX void adfUnMountDev( struct Device* dev);
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
/* device */
PREFIX void adfDeviceInfo(struct Device* dev);
PREFIX struct Device* adfMountDev(char* filename, BOOL ro);
PREFIX void adfUnMountDev(struct Device* dev);
PREFIX RETCODE adfCreateHd(
struct Device* dev, int n, struct Partition** partList);
PREFIX RETCODE adfCreateFlop(
struct Device* dev, char* volName, int volType);
PREFIX RETCODE adfCreateHdFile(
struct Device* dev, char* volName, int volType);
/* dump device */
PREFIX struct Device* adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
/* dump device */
PREFIX struct Device* adfCreateDumpDevice(
char* filename, int32_t cyl, int32_t heads, int32_t sec);
/* env */
PREFIX void adfEnvInitDefault();
PREFIX void adfEnvCleanUp();
PREFIX void adfChgEnvProp(int prop, void *pNew); /* BV */
PREFIX char* adfGetVersionNumber();
PREFIX char* adfGetVersionDate();
/* obsolete */
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*) );
/* env */
PREFIX void adfEnvInitDefault();
PREFIX void adfEnvCleanUp();
PREFIX void adfChgEnvProp(int prop, void* pNew); /* BV */
PREFIX char* adfGetVersionNumber();
PREFIX char* adfGetVersionDate();
/* obsolete */
PREFIX void adfSetEnvFct(
void (*e)(char*), void (*w)(char*), void (*v)(char*));
/* link */
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *, SECTNUM, SECTNUM,char **, int32_t *);
/* link */
PREFIX RETCODE adfBlockPtr2EntryName(
struct Volume*, SECTNUM, SECTNUM, char**, int32_t*);
/* salv */
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
PREFIX void adfFreeDelList(struct List* list);
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
/* salv */
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
PREFIX RETCODE adfUndelEntry(
struct Volume* vol, SECTNUM parent, SECTNUM nSect);
PREFIX void adfFreeDelList(struct List* list);
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
/* middle level API */
/* middle level API */
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
/* low level API */
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
/* low level API */
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
#ifdef __cplusplus
}

View File

@@ -1,13 +1,11 @@
#include "config.h"
#ifndef LITT_ENDIAN
#if defined(__hppa__) || \
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
(defined(__MIPS__) && defined(__MISPEB__)) || \
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
defined(__sparc__)
#else
#define LITT_ENDIAN 1
#endif
#if defined(__hppa__) || defined(__m68k__) || defined(mc68000) || \
defined(_M_M68K) || (defined(__MIPS__) && defined(__MISPEB__)) || \
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
defined(__sparc__)
#else
#define LITT_ENDIAN 1
#endif
#endif

View File

@@ -25,7 +25,6 @@
*
*/
#ifndef _HD_BLK_H
#define _HD_BLK_H 1
@@ -33,135 +32,134 @@
/* ------- RDSK ---------*/
struct bRDSKblock {
/*000*/ char id[4]; /* RDSK */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t blockSize; /* 512 bytes */
/*014*/ int32_t flags; /* 0x17 */
/*018*/ int32_t badBlockList;
/*01c*/ int32_t partitionList;
/*020*/ int32_t fileSysHdrList;
/*024*/ int32_t driveInit;
/*028*/ int32_t r1[6]; /* -1 */
/*040*/ int32_t cylinders;
/*044*/ int32_t sectors;
/*048*/ int32_t heads;
/*04c*/ int32_t interleave;
/*050*/ int32_t parkingZone;
/*054*/ int32_t r2[3]; /* 0 */
/*060*/ int32_t writePreComp;
/*064*/ int32_t reducedWrite;
/*068*/ int32_t stepRate;
/*06c*/ int32_t r3[5]; /* 0 */
/*080*/ int32_t rdbBlockLo;
/*084*/ int32_t rdbBlockHi;
/*088*/ int32_t loCylinder;
/*08c*/ int32_t hiCylinder;
/*090*/ int32_t cylBlocks;
/*094*/ int32_t autoParkSeconds;
/*098*/ int32_t highRDSKBlock;
/*09c*/ int32_t r4; /* 0 */
/*0a0*/ char diskVendor[8];
/*0a8*/ char diskProduct[16];
/*0b8*/ char diskRevision[4];
/*0bc*/ char controllerVendor[8];
/*0c4*/ char controllerProduct[16];
/*0d4*/ char controllerRevision[4];
/*0d8*/ int32_t r5[10]; /* 0 */
/*100*/
struct bRDSKblock
{
/*000*/ char id[4]; /* RDSK */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t blockSize; /* 512 bytes */
/*014*/ int32_t flags; /* 0x17 */
/*018*/ int32_t badBlockList;
/*01c*/ int32_t partitionList;
/*020*/ int32_t fileSysHdrList;
/*024*/ int32_t driveInit;
/*028*/ int32_t r1[6]; /* -1 */
/*040*/ int32_t cylinders;
/*044*/ int32_t sectors;
/*048*/ int32_t heads;
/*04c*/ int32_t interleave;
/*050*/ int32_t parkingZone;
/*054*/ int32_t r2[3]; /* 0 */
/*060*/ int32_t writePreComp;
/*064*/ int32_t reducedWrite;
/*068*/ int32_t stepRate;
/*06c*/ int32_t r3[5]; /* 0 */
/*080*/ int32_t rdbBlockLo;
/*084*/ int32_t rdbBlockHi;
/*088*/ int32_t loCylinder;
/*08c*/ int32_t hiCylinder;
/*090*/ int32_t cylBlocks;
/*094*/ int32_t autoParkSeconds;
/*098*/ int32_t highRDSKBlock;
/*09c*/ int32_t r4; /* 0 */
/*0a0*/ char diskVendor[8];
/*0a8*/ char diskProduct[16];
/*0b8*/ char diskRevision[4];
/*0bc*/ char controllerVendor[8];
/*0c4*/ char controllerProduct[16];
/*0d4*/ char controllerRevision[4];
/*0d8*/ int32_t r5[10]; /* 0 */
/*100*/
};
struct bBADBentry {
/*000*/ int32_t badBlock;
/*004*/ int32_t goodBlock;
struct bBADBentry
{
/*000*/ int32_t badBlock;
/*004*/ int32_t goodBlock;
};
struct bBADBblock {
/*000*/ char id[4]; /* BADB */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t r1;
/*018*/ struct bBADBentry blockPairs[61];
struct bBADBblock
{
/*000*/ char id[4]; /* BADB */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t r1;
/*018*/ struct bBADBentry blockPairs[61];
};
struct bPARTblock
{
/*000*/ char id[4]; /* PART */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ int32_t devFlags;
/*024*/ char nameLen;
/*025*/ char name[31];
/*044*/ int32_t r2[15];
struct bPARTblock {
/*000*/ char id[4]; /* PART */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ int32_t devFlags;
/*024*/ char nameLen;
/*025*/ char name[31];
/*044*/ int32_t r2[15];
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
/*084*/ int32_t blockSize; /* 128 int32_ts */
/*088*/ int32_t secOrg;
/*08c*/ int32_t surfaces;
/*090*/ int32_t sectorsPerBlock; /* == 1 */
/*094*/ int32_t blocksPerTrack;
/*098*/ int32_t dosReserved;
/*09c*/ int32_t dosPreAlloc;
/*0a0*/ int32_t interleave;
/*0a4*/ int32_t lowCyl;
/*0a8*/ int32_t highCyl;
/*0ac*/ int32_t numBuffer;
/*0b0*/ int32_t bufMemType;
/*0b4*/ int32_t maxTransfer;
/*0b8*/ int32_t mask;
/*0bc*/ int32_t bootPri;
/*0c0*/ char dosType[4];
/*0c4*/ int32_t r3[15];
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
/*084*/ int32_t blockSize; /* 128 int32_ts */
/*088*/ int32_t secOrg;
/*08c*/ int32_t surfaces;
/*090*/ int32_t sectorsPerBlock; /* == 1 */
/*094*/ int32_t blocksPerTrack;
/*098*/ int32_t dosReserved;
/*09c*/ int32_t dosPreAlloc;
/*0a0*/ int32_t interleave;
/*0a4*/ int32_t lowCyl;
/*0a8*/ int32_t highCyl;
/*0ac*/ int32_t numBuffer;
/*0b0*/ int32_t bufMemType;
/*0b4*/ int32_t maxTransfer;
/*0b8*/ int32_t mask;
/*0bc*/ int32_t bootPri;
/*0c0*/ char dosType[4];
/*0c4*/ int32_t r3[15];
};
struct bLSEGblock {
/*000*/ char id[4]; /* LSEG */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ char loadData[123*4];
struct bLSEGblock
{
/*000*/ char id[4]; /* LSEG */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ char loadData[123 * 4];
};
struct bFSHDblock
{
/*000*/ char id[4]; /* FSHD */
/*004*/ int32_t size; /* 64 */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ char dosType[4];
/*024*/ short majVersion;
/*026*/ short minVersion;
/*028*/ int32_t patchFlags;
struct bFSHDblock {
/*000*/ char id[4]; /* FSHD */
/*004*/ int32_t size; /* 64 */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ char dosType[4];
/*024*/ short majVersion;
/*026*/ short minVersion;
/*028*/ int32_t patchFlags;
/*02c*/ int32_t type;
/*030*/ int32_t task;
/*034*/ int32_t lock;
/*038*/ int32_t handler;
/*03c*/ int32_t stackSize;
/*040*/ int32_t priority;
/*044*/ int32_t startup;
/*048*/ int32_t segListBlock;
/*04c*/ int32_t globalVec;
/*050*/ int32_t r2[23];
/*0ac*/ int32_t r3[21];
/*02c*/ int32_t type;
/*030*/ int32_t task;
/*034*/ int32_t lock;
/*038*/ int32_t handler;
/*03c*/ int32_t stackSize;
/*040*/ int32_t priority;
/*044*/ int32_t startup;
/*048*/ int32_t segListBlock;
/*04c*/ int32_t globalVec;
/*050*/ int32_t r2[23];
/*0ac*/ int32_t r3[21];
};
#endif /* _HD_BLK_H */
/*##########################################################################*/

View File

@@ -25,12 +25,12 @@
* along with Foobar; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
*/
#ifdef WIN32DLL
#define PREFIX __declspec(dllexport)
#else
#define PREFIX
#define PREFIX
#endif /* WIN32DLL */
#endif /* _PREFIX_H */

View File

@@ -23,7 +23,7 @@
#define AGG2D_INCLUDED
// With this define uncommented you can use floating-point pixel format
//#define AGG2D_USE_FLOAT_FORMAT
// #define AGG2D_USE_FLOAT_FORMAT
#include "agg_basics.h"
#include "agg_trans_affine.h"
@@ -56,37 +56,50 @@ class Agg2D
#ifdef AGG2D_USE_FLOAT_FORMAT
typedef agg::rgba32 ColorType;
#else
typedef agg::rgba8 ColorType;
typedef agg::rgba8 ColorType;
#endif
typedef agg::order_bgra ComponentOrder; // Platform dependent!
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder> BlenderCompPre;
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder>
BlenderCompPre;
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer> PixFormat;
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer> PixFormatComp;
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer> PixFormatPre;
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer> PixFormatCompPre;
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer>
PixFormat;
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer>
PixFormatComp;
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer>
PixFormatPre;
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer>
PixFormatCompPre;
typedef agg::renderer_base<PixFormat> RendererBase;
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
typedef agg::renderer_base<PixFormat> RendererBase;
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
typedef agg::renderer_base<PixFormatCompPre> RendererBaseCompPre;
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
typedef agg::renderer_scanline_aa_solid<RendererBaseComp> RendererSolidComp;
typedef agg::span_allocator<ColorType> SpanAllocator;
typedef agg::pod_auto_array<ColorType, 256> GradientArray;
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_x, GradientArray> LinearGradientSpan;
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_circle, GradientArray> RadialGradientSpan;
typedef agg::span_gradient<ColorType,
agg::span_interpolator_linear<>,
agg::gradient_x,
GradientArray>
LinearGradientSpan;
typedef agg::span_gradient<ColorType,
agg::span_interpolator_linear<>,
agg::gradient_circle,
GradientArray>
RadialGradientSpan;
typedef agg::conv_curve<agg::path_storage> ConvCurve;
typedef agg::conv_stroke<ConvCurve> ConvStroke;
typedef agg::conv_transform<ConvCurve> PathTransform;
typedef agg::conv_transform<ConvStroke> StrokeTransform;
typedef agg::conv_curve<agg::path_storage> ConvCurve;
typedef agg::conv_stroke<ConvCurve> ConvStroke;
typedef agg::conv_transform<ConvCurve> PathTransform;
typedef agg::conv_transform<ConvStroke> StrokeTransform;
enum Gradient
{
@@ -98,12 +111,12 @@ class Agg2D
public:
friend class Agg2DRenderer;
// Use srgba8 as the "user" color type, even though the underlying color type
// might be something else, such as rgba32. This allows code based on
// Use srgba8 as the "user" color type, even though the underlying color
// type might be something else, such as rgba32. This allows code based on
// 8-bit sRGB values to carry on working as before.
typedef agg::srgba8 Color;
typedef agg::rect_i Rect;
typedef agg::rect_d RectD;
typedef agg::srgba8 Color;
typedef agg::rect_i Rect;
typedef agg::rect_d RectD;
typedef agg::trans_affine Affine;
enum LineJoin
@@ -115,9 +128,9 @@ public:
enum LineCap
{
CapButt = agg::butt_cap,
CapButt = agg::butt_cap,
CapSquare = agg::square_cap,
CapRound = agg::round_cap
CapRound = agg::round_cap
};
enum TextAlignment
@@ -127,7 +140,6 @@ public:
AlignCenter,
};
enum DrawPathFlag
{
FillOnly,
@@ -155,20 +167,28 @@ public:
double affineMatrix[6];
};
struct Image
{
agg::rendering_buffer renBuf;
Image() {}
Image(unsigned char* buf, unsigned width, unsigned height, int stride) :
renBuf(buf, width, height, stride) {}
void attach(unsigned char* buf, unsigned width, unsigned height, int stride)
Image(unsigned char* buf, unsigned width, unsigned height, int stride):
renBuf(buf, width, height, stride)
{
}
void attach(
unsigned char* buf, unsigned width, unsigned height, int stride)
{
renBuf.attach(buf, width, height, stride);
}
int width() const { return renBuf.width(); }
int height() const { return renBuf.height(); }
int width() const
{
return renBuf.width();
}
int height() const
{
return renBuf.height();
}
void premultiply();
void demultiply();
};
@@ -202,36 +222,37 @@ public:
enum BlendMode
{
BlendAlpha = agg::end_of_comp_op_e,
BlendClear = agg::comp_op_clear,
BlendSrc = agg::comp_op_src,
BlendDst = agg::comp_op_dst,
BlendSrcOver = agg::comp_op_src_over,
BlendDstOver = agg::comp_op_dst_over,
BlendSrcIn = agg::comp_op_src_in,
BlendDstIn = agg::comp_op_dst_in,
BlendSrcOut = agg::comp_op_src_out,
BlendDstOut = agg::comp_op_dst_out,
BlendSrcAtop = agg::comp_op_src_atop,
BlendDstAtop = agg::comp_op_dst_atop,
BlendXor = agg::comp_op_xor,
BlendAdd = agg::comp_op_plus,
BlendMultiply = agg::comp_op_multiply,
BlendScreen = agg::comp_op_screen,
BlendOverlay = agg::comp_op_overlay,
BlendDarken = agg::comp_op_darken,
BlendLighten = agg::comp_op_lighten,
BlendAlpha = agg::end_of_comp_op_e,
BlendClear = agg::comp_op_clear,
BlendSrc = agg::comp_op_src,
BlendDst = agg::comp_op_dst,
BlendSrcOver = agg::comp_op_src_over,
BlendDstOver = agg::comp_op_dst_over,
BlendSrcIn = agg::comp_op_src_in,
BlendDstIn = agg::comp_op_dst_in,
BlendSrcOut = agg::comp_op_src_out,
BlendDstOut = agg::comp_op_dst_out,
BlendSrcAtop = agg::comp_op_src_atop,
BlendDstAtop = agg::comp_op_dst_atop,
BlendXor = agg::comp_op_xor,
BlendAdd = agg::comp_op_plus,
BlendMultiply = agg::comp_op_multiply,
BlendScreen = agg::comp_op_screen,
BlendOverlay = agg::comp_op_overlay,
BlendDarken = agg::comp_op_darken,
BlendLighten = agg::comp_op_lighten,
BlendColorDodge = agg::comp_op_color_dodge,
BlendColorBurn = agg::comp_op_color_burn,
BlendHardLight = agg::comp_op_hard_light,
BlendSoftLight = agg::comp_op_soft_light,
BlendColorBurn = agg::comp_op_color_burn,
BlendHardLight = agg::comp_op_hard_light,
BlendSoftLight = agg::comp_op_soft_light,
BlendDifference = agg::comp_op_difference,
BlendExclusion = agg::comp_op_exclusion,
BlendExclusion = agg::comp_op_exclusion,
};
enum Direction
{
CW, CCW
CW,
CCW
};
~Agg2D();
@@ -239,26 +260,27 @@ public:
// Setup
//-----------------------
void attach(unsigned char* buf, unsigned width, unsigned height, int stride);
void attach(Image& img);
void attach(
unsigned char* buf, unsigned width, unsigned height, int stride);
void attach(Image& img);
void clipBox(double x1, double y1, double x2, double y2);
void clipBox(double x1, double y1, double x2, double y2);
RectD clipBox() const;
void clearAll(Color c);
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
void clearAll(Color c);
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
void clearClipBox(Color c);
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
void clearClipBox(Color c);
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
// Conversions
//-----------------------
void worldToScreen(double& x, double& y) const;
void screenToWorld(double& x, double& y) const;
void worldToScreen(double& x, double& y) const;
void screenToWorld(double& x, double& y) const;
double worldToScreen(double scalar) const;
double screenToWorld(double scalar) const;
void alignPoint(double& x, double& y) const;
bool inBox(double worldX, double worldY) const;
void alignPoint(double& x, double& y) const;
bool inBox(double worldX, double worldY) const;
// General Attributes
//-----------------------
@@ -289,14 +311,30 @@ public:
Color fillColor() const;
Color lineColor() const;
void fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
void lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
void fillLinearGradient(double x1,
double y1,
double x2,
double y2,
Color c1,
Color c2,
double profile = 1.0);
void lineLinearGradient(double x1,
double y1,
double x2,
double y2,
Color c1,
Color c2,
double profile = 1.0);
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
void fillRadialGradient(
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
void lineRadialGradient(
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
void fillRadialGradient(
double x, double y, double r, Color c1, Color c2, Color c3);
void lineRadialGradient(
double x, double y, double r, Color c1, Color c2, Color c3);
void fillRadialGradient(double x, double y, double r);
void lineRadialGradient(double x, double y, double r);
@@ -313,9 +351,12 @@ public:
void fillEvenOdd(bool evenOddFlag);
bool fillEvenOdd() const;
void textAlignment(TextAlignment alignment);
void textSize(double sizeX, double sizeY);
inline void textSize(double size) { textSize(size, size); }
void textAlignment(TextAlignment alignment);
void textSize(double sizeX, double sizeY);
inline void textSize(double size)
{
textSize(size, size);
}
// Transformations
//-----------------------
@@ -328,26 +369,54 @@ public:
void scale(double sx, double sy);
void skew(double sx, double sy);
void translate(double x, double y);
void parallelogram(double x1, double y1, double x2, double y2, const double* para);
void viewport(double worldX1, double worldY1, double worldX2, double worldY2,
double screenX1, double screenY1, double screenX2, double screenY2,
ViewportOption opt=XMidYMid);
void parallelogram(
double x1, double y1, double x2, double y2, const double* para);
void viewport(double worldX1,
double worldY1,
double worldX2,
double worldY2,
double screenX1,
double screenY1,
double screenX2,
double screenY2,
ViewportOption opt = XMidYMid);
// Basic Shapes
//-----------------------
void line(double x1, double y1, double x2, double y2);
void triangle(double x1, double y1, double x2, double y2, double x3, double y3);
void triangle(
double x1, double y1, double x2, double y2, double x3, double y3);
void rectangle(double x1, double y1, double x2, double y2);
void roundedRect(double x1, double y1, double x2, double y2, double r);
void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry);
void roundedRect(double x1, double y1, double x2, double y2,
double rxBottom, double ryBottom,
double rxTop, double ryTop);
void roundedRect(
double x1, double y1, double x2, double y2, double rx, double ry);
void roundedRect(double x1,
double y1,
double x2,
double y2,
double rxBottom,
double ryBottom,
double rxTop,
double ryTop);
void ellipse(double cx, double cy, double rx, double ry);
void arc(double cx, double cy, double rx, double ry, double start, double sweep);
void star(double cx, double cy, double r1, double r2, double startAngle, int numRays);
void curve(double x1, double y1, double x2, double y2, double x3, double y3);
void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4);
void arc(
double cx, double cy, double rx, double ry, double start, double sweep);
void star(double cx,
double cy,
double r1,
double r2,
double startAngle,
int numRays);
void curve(
double x1, double y1, double x2, double y2, double x3, double y3);
void curve(double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double x4,
double y4);
void polygon(double* xy, int numPoints);
void polyline(double* xy, int numPoints);
@@ -367,47 +436,53 @@ public:
void verLineTo(double y);
void verLineRel(double dy);
void arcTo(double rx, double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double x, double y);
void arcTo(double rx,
double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double x,
double y);
void arcRel(double rx, double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double dx, double dy);
void arcRel(double rx,
double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double dx,
double dy);
void quadricCurveTo(double xCtrl, double yCtrl,
double xTo, double yTo);
void quadricCurveRel(double dxCtrl, double dyCtrl,
double dxTo, double dyTo);
void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo);
void quadricCurveRel(
double dxCtrl, double dyCtrl, double dxTo, double dyTo);
void quadricCurveTo(double xTo, double yTo);
void quadricCurveRel(double dxTo, double dyTo);
void cubicCurveTo(double xCtrl1, double yCtrl1,
double xCtrl2, double yCtrl2,
double xTo, double yTo);
void cubicCurveTo(double xCtrl1,
double yCtrl1,
double xCtrl2,
double yCtrl2,
double xTo,
double yTo);
void cubicCurveRel(double dxCtrl1, double dyCtrl1,
double dxCtrl2, double dyCtrl2,
double dxTo, double dyTo);
void cubicCurveRel(double dxCtrl1,
double dyCtrl1,
double dxCtrl2,
double dyCtrl2,
double dxTo,
double dyTo);
void cubicCurveTo(double xCtrl2, double yCtrl2,
double xTo, double yTo);
void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo);
void cubicCurveRel(double xCtrl2, double yCtrl2,
double xTo, double yTo);
void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo);
void addEllipse(double cx, double cy, double rx, double ry, Direction dir);
void text(double x, double y, const std::string& text);
void text(double x, double y, const std::string& text);
void closePolygon();
void drawPath(DrawPathFlag flag = FillAndStroke);
void drawPathNoTransform(DrawPathFlag flag = FillAndStroke);
// Image Transformations
//-----------------------
void imageFilter(ImageFilter f);
@@ -417,52 +492,90 @@ public:
ImageResample imageResample() const;
void transformImage(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX1, double dstY1, double dstX2, double dstY2);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImage(const Image& img,
double dstX1, double dstY1, double dstX2, double dstY2);
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImage(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
const double* parallelogram);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
const double* parallelogram);
void transformImage(const Image& img, const double* parallelogram);
void transformImagePath(const Image& img,
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImagePath(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX1, double dstY1, double dstX2, double dstY2);
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImagePath(const Image& img,
double dstX1, double dstY1, double dstX2, double dstY2);
void transformImagePath(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
const double* parallelogram);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
const double* parallelogram);
void transformImagePath(const Image& img, const double* parallelogram);
// Image Blending (no transformations available)
void blendImage(Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX, double dstY, unsigned alpha=255);
void blendImage(Image& img, double dstX, double dstY, unsigned alpha=255);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX,
double dstY,
unsigned alpha = 255);
void blendImage(Image& img, double dstX, double dstY, unsigned alpha = 255);
// Copy image directly, together with alpha-channel
void copyImage(Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX, double dstY);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX,
double dstY);
void copyImage(Image& img, double dstX, double dstY);
// Auxiliary
//-----------------------
static double pi() { return agg::pi; }
static double deg2Rad(double v) { return v * agg::pi / 180.0; }
static double rad2Deg(double v) { return v * 180.0 / agg::pi; }
static double pi()
{
return agg::pi;
}
static double deg2Rad(double v)
{
return v * agg::pi / 180.0;
}
static double rad2Deg(double v)
{
return v * 180.0 / agg::pi;
}
private:
void render(bool fillColor);
@@ -472,97 +585,94 @@ private:
void addLine(double x1, double y1, double x2, double y2);
void updateRasterizerGamma();
void renderImage(const Image& img, int x1, int y1, int x2, int y2, const double* parl);
void renderImage(
const Image& img, int x1, int y1, int x2, int y2, const double* parl);
agg::rendering_buffer m_rbuf;
PixFormat m_pixFormat;
PixFormatComp m_pixFormatComp;
PixFormatPre m_pixFormatPre;
PixFormatCompPre m_pixFormatCompPre;
RendererBase m_renBase;
RendererBaseComp m_renBaseComp;
RendererBasePre m_renBasePre;
RendererBaseCompPre m_renBaseCompPre;
RendererSolid m_renSolid;
RendererSolidComp m_renSolidComp;
agg::rendering_buffer m_rbuf;
PixFormat m_pixFormat;
PixFormatComp m_pixFormatComp;
PixFormatPre m_pixFormatPre;
PixFormatCompPre m_pixFormatCompPre;
RendererBase m_renBase;
RendererBaseComp m_renBaseComp;
RendererBasePre m_renBasePre;
RendererBaseCompPre m_renBaseCompPre;
RendererSolid m_renSolid;
RendererSolidComp m_renSolidComp;
SpanAllocator m_allocator;
RectD m_clipBox;
SpanAllocator m_allocator;
RectD m_clipBox;
BlendMode m_blendMode;
BlendMode m_imageBlendMode;
Color m_imageBlendColor;
BlendMode m_blendMode;
BlendMode m_imageBlendMode;
Color m_imageBlendColor;
agg::scanline_u8 m_scanline;
agg::rasterizer_scanline_aa<> m_rasterizer;
agg::scanline_u8 m_scanline;
agg::rasterizer_scanline_aa<> m_rasterizer;
double m_masterAlpha;
double m_antiAliasGamma;
double m_masterAlpha;
double m_antiAliasGamma;
Color m_fillColor;
Color m_lineColor;
GradientArray m_fillGradient;
GradientArray m_lineGradient;
Color m_fillColor;
Color m_lineColor;
GradientArray m_fillGradient;
GradientArray m_lineGradient;
LineCap m_lineCap;
LineJoin m_lineJoin;
LineCap m_lineCap;
LineJoin m_lineJoin;
Gradient m_fillGradientFlag;
Gradient m_lineGradientFlag;
agg::trans_affine m_fillGradientMatrix;
agg::trans_affine m_lineGradientMatrix;
double m_fillGradientD1;
double m_lineGradientD1;
double m_fillGradientD2;
double m_lineGradientD2;
Gradient m_fillGradientFlag;
Gradient m_lineGradientFlag;
agg::trans_affine m_fillGradientMatrix;
agg::trans_affine m_lineGradientMatrix;
double m_fillGradientD1;
double m_lineGradientD1;
double m_fillGradientD2;
double m_lineGradientD2;
TextAlignment m_textAlignment;
double m_textSizeX;
double m_textSizeY;
TextAlignment m_textAlignment;
double m_textSizeX;
double m_textSizeY;
ImageFilter m_imageFilter;
ImageResample m_imageResample;
agg::image_filter_lut m_imageFilterLut;
ImageFilter m_imageFilter;
ImageResample m_imageResample;
agg::image_filter_lut m_imageFilterLut;
agg::span_interpolator_linear<> m_fillGradientInterpolator;
agg::span_interpolator_linear<> m_lineGradientInterpolator;
agg::gradient_x m_linearGradientFunction;
agg::gradient_circle m_radialGradientFunction;
agg::gradient_x m_linearGradientFunction;
agg::gradient_circle m_radialGradientFunction;
double m_lineWidth;
bool m_evenOddFlag;
double m_lineWidth;
bool m_evenOddFlag;
agg::path_storage m_path;
agg::trans_affine m_transform;
agg::path_storage m_path;
agg::trans_affine m_transform;
ConvCurve m_convCurve;
ConvStroke m_convStroke;
ConvCurve m_convCurve;
ConvStroke m_convStroke;
PathTransform m_pathTransform;
StrokeTransform m_strokeTransform;
PathTransform m_pathTransform;
StrokeTransform m_strokeTransform;
#ifdef AGG_USE_FONTS
#ifndef AGG2D_USE_FREETYPE
HDC m_fontDC;
HDC m_fontDC;
#endif
FontEngine m_fontEngine;
FontCacheManager m_fontCacheManager;
FontEngine m_fontEngine;
FontCacheManager m_fontCacheManager;
#endif
};
inline bool operator == (const Agg2D::Color& c1, const Agg2D::Color& c2)
inline bool operator==(const Agg2D::Color& c1, const Agg2D::Color& c2)
{
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
}
inline bool operator != (const Agg2D::Color& c1, const Agg2D::Color& c2)
inline bool operator!=(const Agg2D::Color& c1, const Agg2D::Color& c2)
{
return !(c1 == c2);
return !(c1 == c2);
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -28,52 +28,63 @@ namespace agg
//===================================================one_component_mask_u8
struct one_component_mask_u8
{
static unsigned calculate(const int8u* p) { return *p; }
static unsigned calculate(const int8u* p)
{
return *p;
}
};
//=====================================================rgb_to_gray_mask_u8
template<unsigned R, unsigned G, unsigned B>
template <unsigned R, unsigned G, unsigned B>
struct rgb_to_gray_mask_u8
{
static unsigned calculate(const int8u* p)
{
return (p[R]*77 + p[G]*150 + p[B]*29) >> 8;
static unsigned calculate(const int8u* p)
{
return (p[R] * 77 + p[G] * 150 + p[B] * 29) >> 8;
}
};
//==========================================================alpha_mask_u8
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
template <unsigned Step = 1,
unsigned Offset = 0,
class MaskF = one_component_mask_u8>
class alpha_mask_u8
{
public:
typedef int8u cover_type;
typedef alpha_mask_u8<Step, Offset, MaskF> self_type;
enum cover_scale_e
{
{
cover_shift = 8,
cover_none = 0,
cover_full = 255
cover_none = 0,
cover_full = 255
};
alpha_mask_u8() : m_rbuf(0) {}
explicit alpha_mask_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
alpha_mask_u8(): m_rbuf(0) {}
explicit alpha_mask_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
void attach(rendering_buffer& rbuf)
{
m_rbuf = &rbuf;
}
MaskF& mask_function() { return m_mask_function; }
const MaskF& mask_function() const { return m_mask_function; }
MaskF& mask_function()
{
return m_mask_function;
}
const MaskF& mask_function() const
{
return m_mask_function;
}
//--------------------------------------------------------------------
cover_type pixel(int x, int y) const
{
if(x >= 0 && y >= 0 &&
x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
{
return (cover_type)m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset);
m_rbuf->row_ptr(y) + x * Step + Offset);
}
return 0;
}
@@ -81,19 +92,18 @@ namespace agg
//--------------------------------------------------------------------
cover_type combine_pixel(int x, int y, cover_type val) const
{
if(x >= 0 && y >= 0 &&
x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
{
return (cover_type)((cover_full + val *
m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
cover_shift);
return (
cover_type)((cover_full + val * m_mask_function.calculate(
m_rbuf->row_ptr(y) +
x * Step + Offset)) >>
cover_shift);
}
return 0;
}
//--------------------------------------------------------------------
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -103,16 +113,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(y < 0 || y > ymax)
if (y < 0 || y > ymax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(x < 0)
if (x < 0)
{
count += x;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -122,11 +132,11 @@ namespace agg
x = 0;
}
if(x + count > xmax)
if (x + count > xmax)
{
int rest = x + count - xmax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -139,11 +149,9 @@ namespace agg
{
*covers++ = (cover_type)m_mask_function.calculate(mask);
mask += Step;
}
while(--count);
} while (--count);
}
//--------------------------------------------------------------------
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -153,16 +161,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(y < 0 || y > ymax)
if (y < 0 || y > ymax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(x < 0)
if (x < 0)
{
count += x;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -172,11 +180,11 @@ namespace agg
x = 0;
}
if(x + count > xmax)
if (x + count > xmax)
{
int rest = x + count - xmax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -187,13 +195,14 @@ namespace agg
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*covers = (cover_type)((cover_full + (*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
*covers =
(cover_type)((cover_full +
(*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
++covers;
mask += Step;
}
while(--count);
} while (--count);
}
//--------------------------------------------------------------------
@@ -205,16 +214,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(x < 0 || x > xmax)
if (x < 0 || x > xmax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(y < 0)
if (y < 0)
{
count += y;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -224,11 +233,11 @@ namespace agg
y = 0;
}
if(y + count > ymax)
if (y + count > ymax)
{
int rest = y + count - ymax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -241,8 +250,7 @@ namespace agg
{
*covers++ = (cover_type)m_mask_function.calculate(mask);
mask += m_rbuf->stride();
}
while(--count);
} while (--count);
}
//--------------------------------------------------------------------
@@ -254,16 +262,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(x < 0 || x > xmax)
if (x < 0 || x > xmax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(y < 0)
if (y < 0)
{
count += y;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -273,11 +281,11 @@ namespace agg
y = 0;
}
if(y + count > ymax)
if (y + count > ymax)
{
int rest = y + count - ymax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -288,34 +296,33 @@ namespace agg
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*covers = (cover_type)((cover_full + (*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
*covers =
(cover_type)((cover_full +
(*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
++covers;
mask += m_rbuf->stride();
}
while(--count);
} while (--count);
}
private:
alpha_mask_u8(const self_type&);
const self_type& operator = (const self_type&);
const self_type& operator=(const self_type&);
rendering_buffer* m_rbuf;
MaskF m_mask_function;
MaskF m_mask_function;
};
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
typedef alpha_mask_u8<4, 0> alpha_mask_rgba32r; //----alpha_mask_rgba32r
typedef alpha_mask_u8<4, 1> alpha_mask_rgba32g; //----alpha_mask_rgba32g
@@ -337,56 +344,68 @@ namespace agg
typedef alpha_mask_u8<4, 1> alpha_mask_abgr32b; //----alpha_mask_abgr32b
typedef alpha_mask_u8<4, 0> alpha_mask_abgr32a; //----alpha_mask_abgr32a
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_argb32gray; //----alpha_mask_argb32gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
alpha_mask_argb32gray; //----alpha_mask_argb32gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
//==========================================================amask_no_clip_u8
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
template <unsigned Step = 1,
unsigned Offset = 0,
class MaskF = one_component_mask_u8>
class amask_no_clip_u8
{
public:
typedef int8u cover_type;
typedef amask_no_clip_u8<Step, Offset, MaskF> self_type;
enum cover_scale_e
{
{
cover_shift = 8,
cover_none = 0,
cover_full = 255
cover_none = 0,
cover_full = 255
};
amask_no_clip_u8() : m_rbuf(0) {}
explicit amask_no_clip_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
amask_no_clip_u8(): m_rbuf(0) {}
explicit amask_no_clip_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
MaskF& mask_function() { return m_mask_function; }
const MaskF& mask_function() const { return m_mask_function; }
void attach(rendering_buffer& rbuf)
{
m_rbuf = &rbuf;
}
MaskF& mask_function()
{
return m_mask_function;
}
const MaskF& mask_function() const
{
return m_mask_function;
}
//--------------------------------------------------------------------
cover_type pixel(int x, int y) const
{
return (cover_type)m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset);
m_rbuf->row_ptr(y) + x * Step + Offset);
}
//--------------------------------------------------------------------
cover_type combine_pixel(int x, int y, cover_type val) const
{
return (cover_type)((cover_full + val *
m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
cover_shift);
return (cover_type)((cover_full + val * m_mask_function.calculate(
m_rbuf->row_ptr(y) +
x * Step + Offset)) >>
cover_shift);
}
//--------------------------------------------------------------------
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -395,28 +414,24 @@ namespace agg
{
*dst++ = (cover_type)m_mask_function.calculate(mask);
mask += Step;
}
while(--num_pix);
} while (--num_pix);
}
//--------------------------------------------------------------------
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
{
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*dst = (cover_type)((cover_full + (*dst) *
m_mask_function.calculate(mask)) >>
*dst = (cover_type)((cover_full +
(*dst) *
m_mask_function.calculate(mask)) >>
cover_shift);
++dst;
mask += Step;
}
while(--num_pix);
} while (--num_pix);
}
//--------------------------------------------------------------------
void fill_vspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -425,75 +440,98 @@ namespace agg
{
*dst++ = (cover_type)m_mask_function.calculate(mask);
mask += m_rbuf->stride();
}
while(--num_pix);
} while (--num_pix);
}
//--------------------------------------------------------------------
void combine_vspan(int x, int y, cover_type* dst, int num_pix) const
{
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*dst = (cover_type)((cover_full + (*dst) *
m_mask_function.calculate(mask)) >>
*dst = (cover_type)((cover_full +
(*dst) *
m_mask_function.calculate(mask)) >>
cover_shift);
++dst;
mask += m_rbuf->stride();
}
while(--num_pix);
} while (--num_pix);
}
private:
amask_no_clip_u8(const self_type&);
const self_type& operator = (const self_type&);
const self_type& operator=(const self_type&);
rendering_buffer* m_rbuf;
MaskF m_mask_function;
MaskF m_mask_function;
};
typedef amask_no_clip_u8<1, 0> amask_no_clip_gray8; //----amask_no_clip_gray8
typedef amask_no_clip_u8<1, 0>
amask_no_clip_gray8; //----amask_no_clip_gray8
typedef amask_no_clip_u8<3, 0> amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
typedef amask_no_clip_u8<3, 1> amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
typedef amask_no_clip_u8<3, 2> amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
typedef amask_no_clip_u8<3, 0>
amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
typedef amask_no_clip_u8<3, 1>
amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
typedef amask_no_clip_u8<3, 2>
amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
typedef amask_no_clip_u8<3, 2> amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
typedef amask_no_clip_u8<3, 1> amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
typedef amask_no_clip_u8<3, 0> amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
typedef amask_no_clip_u8<3, 2>
amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
typedef amask_no_clip_u8<3, 1>
amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
typedef amask_no_clip_u8<3, 0>
amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
typedef amask_no_clip_u8<4, 0> amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
typedef amask_no_clip_u8<4, 1> amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
typedef amask_no_clip_u8<4, 2> amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
typedef amask_no_clip_u8<4, 3> amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
typedef amask_no_clip_u8<4, 0>
amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
typedef amask_no_clip_u8<4, 1>
amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
typedef amask_no_clip_u8<4, 2>
amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
typedef amask_no_clip_u8<4, 3>
amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
typedef amask_no_clip_u8<4, 1> amask_no_clip_argb32r; //----amask_no_clip_argb32r
typedef amask_no_clip_u8<4, 2> amask_no_clip_argb32g; //----amask_no_clip_argb32g
typedef amask_no_clip_u8<4, 3> amask_no_clip_argb32b; //----amask_no_clip_argb32b
typedef amask_no_clip_u8<4, 0> amask_no_clip_argb32a; //----amask_no_clip_argb32a
typedef amask_no_clip_u8<4, 1>
amask_no_clip_argb32r; //----amask_no_clip_argb32r
typedef amask_no_clip_u8<4, 2>
amask_no_clip_argb32g; //----amask_no_clip_argb32g
typedef amask_no_clip_u8<4, 3>
amask_no_clip_argb32b; //----amask_no_clip_argb32b
typedef amask_no_clip_u8<4, 0>
amask_no_clip_argb32a; //----amask_no_clip_argb32a
typedef amask_no_clip_u8<4, 2> amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
typedef amask_no_clip_u8<4, 1> amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
typedef amask_no_clip_u8<4, 0> amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
typedef amask_no_clip_u8<4, 3> amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
typedef amask_no_clip_u8<4, 2>
amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
typedef amask_no_clip_u8<4, 1>
amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
typedef amask_no_clip_u8<4, 0>
amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
typedef amask_no_clip_u8<4, 3>
amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
typedef amask_no_clip_u8<4, 3> amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
typedef amask_no_clip_u8<4, 2> amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
typedef amask_no_clip_u8<4, 1> amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
typedef amask_no_clip_u8<4, 0> amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
typedef amask_no_clip_u8<4, 3>
amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
typedef amask_no_clip_u8<4, 2>
amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
typedef amask_no_clip_u8<4, 1>
amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
typedef amask_no_clip_u8<4, 0>
amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -27,24 +27,33 @@ namespace agg
//=====================================================================arc
//
// See Implementation agg_arc.cpp
// See Implementation agg_arc.cpp
//
class arc
{
public:
arc() : m_scale(1.0), m_initialized(false) {}
arc(double x, double y,
double rx, double ry,
double a1, double a2,
bool ccw=true);
arc(): m_scale(1.0), m_initialized(false) {}
arc(double x,
double y,
double rx,
double ry,
double a1,
double a2,
bool ccw = true);
void init(double x, double y,
double rx, double ry,
double a1, double a2,
bool ccw=true);
void init(double x,
double y,
double rx,
double ry,
double a1,
double a2,
bool ccw = true);
void approximation_scale(double s);
double approximation_scale() const { return m_scale; }
double approximation_scale() const
{
return m_scale;
}
void rewind(unsigned);
unsigned vertex(double* x, double* y);
@@ -52,22 +61,20 @@ namespace agg
private:
void normalize(double a1, double a2, bool ccw);
double m_x;
double m_y;
double m_rx;
double m_ry;
double m_angle;
double m_start;
double m_end;
double m_scale;
double m_da;
bool m_ccw;
bool m_initialized;
double m_x;
double m_y;
double m_rx;
double m_ry;
double m_angle;
double m_start;
double m_end;
double m_scale;
double m_da;
bool m_ccw;
bool m_initialized;
unsigned m_path_cmd;
};
}
#endif

View File

File diff suppressed because it is too large Load Diff

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -13,7 +13,7 @@
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
// Simple arrowhead/arrowtail generator
// Simple arrowhead/arrowtail generator
//
//----------------------------------------------------------------------------
#ifndef AGG_ARROWHEAD_INCLUDED
@@ -26,7 +26,7 @@ namespace agg
//===============================================================arrowhead
//
// See implementation agg_arrowhead.cpp
// See implementation agg_arrowhead.cpp
//
class arrowhead
{
@@ -42,8 +42,14 @@ namespace agg
m_head_flag = true;
}
void head() { m_head_flag = true; }
void no_head() { m_head_flag = false; }
void head()
{
m_head_flag = true;
}
void no_head()
{
m_head_flag = false;
}
void tail(double d1, double d2, double d3, double d4)
{
@@ -54,24 +60,30 @@ namespace agg
m_tail_flag = true;
}
void tail() { m_tail_flag = true; }
void no_tail() { m_tail_flag = false; }
void tail()
{
m_tail_flag = true;
}
void no_tail()
{
m_tail_flag = false;
}
void rewind(unsigned path_id);
unsigned vertex(double* x, double* y);
private:
double m_head_d1;
double m_head_d2;
double m_head_d3;
double m_head_d4;
double m_tail_d1;
double m_tail_d2;
double m_tail_d3;
double m_tail_d4;
bool m_head_flag;
bool m_tail_flag;
double m_coord[16];
double m_head_d1;
double m_head_d2;
double m_head_d3;
double m_head_d4;
double m_tail_d1;
double m_tail_d2;
double m_tail_d3;
double m_tail_d4;
bool m_head_flag;
bool m_tail_flag;
double m_coord[16];
unsigned m_cmd[8];
unsigned m_curr_id;
unsigned m_curr_coord;

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -25,37 +25,50 @@
#else
namespace agg
{
// The policy of all AGG containers and memory allocation strategy
// The policy of all AGG containers and memory allocation strategy
// in general is that no allocated data requires explicit construction.
// It means that the allocator can be really simple; you can even
// replace new/delete to malloc/free. The constructors and destructors
// won't be called in this case, however everything will remain working.
// The second argument of deallocate() is the size of the allocated
// replace new/delete to malloc/free. The constructors and destructors
// won't be called in this case, however everything will remain working.
// The second argument of deallocate() is the size of the allocated
// block. You can use this information if you wish.
//------------------------------------------------------------pod_allocator
template<class T> struct pod_allocator
template <class T>
struct pod_allocator
{
static T* allocate(unsigned num) { return new T [num]; }
static void deallocate(T* ptr, unsigned) { delete [] ptr; }
static T* allocate(unsigned num)
{
return new T[num];
}
static void deallocate(T* ptr, unsigned)
{
delete[] ptr;
}
};
// Single object allocator. It's also can be replaced with your custom
// allocator. The difference is that it can only allocate a single
// object and the constructor and destructor must be called.
// allocator. The difference is that it can only allocate a single
// object and the constructor and destructor must be called.
// In AGG there is no need to allocate an array of objects with
// calling their constructors (only single ones). So that, if you
// replace these new/delete to malloc/free make sure that the in-place
// new is called and take care of calling the destructor too.
//------------------------------------------------------------obj_allocator
template<class T> struct obj_allocator
template <class T>
struct obj_allocator
{
static T* allocate() { return new T; }
static void deallocate(T* ptr) { delete ptr; }
static T* allocate()
{
return new T;
}
static void deallocate(T* ptr)
{
delete ptr;
}
};
}
#endif
//-------------------------------------------------------- Default basic types
//
// If the compiler has different capacity of the basic types you can redefine
@@ -104,7 +117,7 @@ namespace agg
//------------------------------------------------ Some fixes for MS Visual C++
#if defined(_MSC_VER)
#pragma warning(disable:4786) // Identifier was truncated...
#pragma warning(disable : 4786) // Identifier was truncated...
#endif
#if defined(_MSC_VER)
@@ -116,38 +129,36 @@ namespace agg
namespace agg
{
//-------------------------------------------------------------------------
typedef AGG_INT8 int8; //----int8
typedef AGG_INT8U int8u; //----int8u
typedef AGG_INT16 int16; //----int16
typedef AGG_INT16U int16u; //----int16u
typedef AGG_INT32 int32; //----int32
typedef AGG_INT32U int32u; //----int32u
typedef AGG_INT64 int64; //----int64
typedef AGG_INT64U int64u; //----int64u
typedef AGG_INT8 int8; //----int8
typedef AGG_INT8U int8u; //----int8u
typedef AGG_INT16 int16; //----int16
typedef AGG_INT16U int16u; //----int16u
typedef AGG_INT32 int32; //----int32
typedef AGG_INT32U int32u; //----int32u
typedef AGG_INT64 int64; //----int64
typedef AGG_INT64U int64u; //----int64u
#if defined(AGG_FISTP)
#pragma warning(push)
#pragma warning(disable : 4035) //Disable warning "no return value"
AGG_INLINE int iround(double v) //-------iround
#pragma warning(disable : 4035) // Disable warning "no return value"
AGG_INLINE int iround(double v) //-------iround
{
int t;
__asm fld qword ptr [v]
__asm fistp dword ptr [t]
__asm mov eax, dword ptr [t]
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
dword ptr[t]
}
AGG_INLINE unsigned uround(double v) //-------uround
AGG_INLINE unsigned uround(double v) //-------uround
{
unsigned t;
__asm fld qword ptr [v]
__asm fistp dword ptr [t]
__asm mov eax, dword ptr [t]
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
dword ptr[t]
}
#pragma warning(pop)
AGG_INLINE int ifloor(double v)
{
return int(floor(v));
}
AGG_INLINE unsigned ufloor(double v) //-------ufloor
AGG_INLINE unsigned ufloor(double v) //-------ufloor
{
return unsigned(floor(v));
}
@@ -155,7 +166,7 @@ namespace agg
{
return int(ceil(v));
}
AGG_INLINE unsigned uceil(double v) //--------uceil
AGG_INLINE unsigned uceil(double v) //--------uceil
{
return unsigned(ceil(v));
}
@@ -213,48 +224,53 @@ namespace agg
#endif
//---------------------------------------------------------------saturation
template<int Limit> struct saturation
template <int Limit>
struct saturation
{
AGG_INLINE static int iround(double v)
{
if(v < double(-Limit)) return -Limit;
if(v > double( Limit)) return Limit;
if (v < double(-Limit))
return -Limit;
if (v > double(Limit))
return Limit;
return agg::iround(v);
}
};
//------------------------------------------------------------------mul_one
template<unsigned Shift> struct mul_one
template <unsigned Shift>
struct mul_one
{
AGG_INLINE static unsigned mul(unsigned a, unsigned b)
{
unsigned q = a * b + (1 << (Shift-1));
unsigned q = a * b + (1 << (Shift - 1));
return (q + (q >> Shift)) >> Shift;
}
};
//-------------------------------------------------------------------------
typedef unsigned char cover_type; //----cover_type
typedef unsigned char cover_type; //----cover_type
enum cover_scale_e
{
cover_shift = 8, //----cover_shift
cover_size = 1 << cover_shift, //----cover_size
cover_mask = cover_size - 1, //----cover_mask
cover_none = 0, //----cover_none
cover_full = cover_mask //----cover_full
cover_shift = 8, //----cover_shift
cover_size = 1 << cover_shift, //----cover_size
cover_mask = cover_size - 1, //----cover_mask
cover_none = 0, //----cover_none
cover_full = cover_mask //----cover_full
};
//----------------------------------------------------poly_subpixel_scale_e
// These constants determine the subpixel accuracy, to be more precise,
// the number of bits of the fractional part of the coordinates.
// These constants determine the subpixel accuracy, to be more precise,
// the number of bits of the fractional part of the coordinates.
// The possible coordinate capacity in bits can be calculated by formula:
// sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and
// 8-bits fractional part the capacity is 24 bits.
enum poly_subpixel_scale_e
{
poly_subpixel_shift = 8, //----poly_subpixel_shift
poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale
poly_subpixel_mask = poly_subpixel_scale-1 //----poly_subpixel_mask
poly_subpixel_shift = 8, //----poly_subpixel_shift
poly_subpixel_scale = 1
<< poly_subpixel_shift, //----poly_subpixel_scale
poly_subpixel_mask = poly_subpixel_scale - 1 //----poly_subpixel_mask
};
//----------------------------------------------------------filling_rule_e
@@ -278,37 +294,60 @@ namespace agg
{
return rad * 180.0 / pi;
}
//----------------------------------------------------------------rect_base
template<class T> struct rect_base
template <class T>
struct rect_base
{
typedef T value_type;
typedef T value_type;
typedef rect_base<T> self_type;
T x1, y1, x2, y2;
rect_base() {}
rect_base(T x1_, T y1_, T x2_, T y2_) :
x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
void init(T x1_, T y1_, T x2_, T y2_)
rect_base(T x1_, T y1_, T x2_, T y2_):
x1(x1_),
y1(y1_),
x2(x2_),
y2(y2_)
{
x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_;
}
void init(T x1_, T y1_, T x2_, T y2_)
{
x1 = x1_;
y1 = y1_;
x2 = x2_;
y2 = y2_;
}
const self_type& normalize()
{
T t;
if(x1 > x2) { t = x1; x1 = x2; x2 = t; }
if(y1 > y2) { t = y1; y1 = y2; y2 = t; }
if (x1 > x2)
{
t = x1;
x1 = x2;
x2 = t;
}
if (y1 > y2)
{
t = y1;
y1 = y2;
y2 = t;
}
return *this;
}
bool clip(const self_type& r)
{
if(x2 > r.x2) x2 = r.x2;
if(y2 > r.y2) y2 = r.y2;
if(x1 < r.x1) x1 = r.x1;
if(y1 < r.y1) y1 = r.y1;
if (x2 > r.x2)
x2 = r.x2;
if (y2 > r.y2)
y2 = r.y2;
if (x1 < r.x1)
x1 = r.x1;
if (y1 < r.y1)
y1 = r.y1;
return x1 <= x2 && y1 <= y2;
}
@@ -321,72 +360,78 @@ namespace agg
{
return (x >= x1 && x <= x2 && y >= y1 && y <= y2);
}
bool overlaps(const self_type& r) const
{
return !(r.x1 > x2 || r.x2 < x1
|| r.y1 > y2 || r.y2 < y1);
return !(r.x1 > x2 || r.x2 < x1 || r.y1 > y2 || r.y2 < y1);
}
};
//-----------------------------------------------------intersect_rectangles
template<class Rect>
template <class Rect>
inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
{
Rect r = r1;
// First process x2,y2 because the other order
// results in Internal Compiler Error under
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
// First process x2,y2 because the other order
// results in Internal Compiler Error under
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
// case of "Maximize Speed" optimization option.
//-----------------
if(r.x2 > r2.x2) r.x2 = r2.x2;
if(r.y2 > r2.y2) r.y2 = r2.y2;
if(r.x1 < r2.x1) r.x1 = r2.x1;
if(r.y1 < r2.y1) r.y1 = r2.y1;
if (r.x2 > r2.x2)
r.x2 = r2.x2;
if (r.y2 > r2.y2)
r.y2 = r2.y2;
if (r.x1 < r2.x1)
r.x1 = r2.x1;
if (r.y1 < r2.y1)
r.y1 = r2.y1;
return r;
}
//---------------------------------------------------------unite_rectangles
template<class Rect>
template <class Rect>
inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
{
Rect r = r1;
if(r.x2 < r2.x2) r.x2 = r2.x2;
if(r.y2 < r2.y2) r.y2 = r2.y2;
if(r.x1 > r2.x1) r.x1 = r2.x1;
if(r.y1 > r2.y1) r.y1 = r2.y1;
if (r.x2 < r2.x2)
r.x2 = r2.x2;
if (r.y2 < r2.y2)
r.y2 = r2.y2;
if (r.x1 > r2.x1)
r.x1 = r2.x1;
if (r.y1 > r2.y1)
r.y1 = r2.y1;
return r;
}
typedef rect_base<int> rect_i; //----rect_i
typedef rect_base<float> rect_f; //----rect_f
typedef rect_base<int> rect_i; //----rect_i
typedef rect_base<float> rect_f; //----rect_f
typedef rect_base<double> rect_d; //----rect_d
//---------------------------------------------------------path_commands_e
enum path_commands_e
{
path_cmd_stop = 0, //----path_cmd_stop
path_cmd_move_to = 1, //----path_cmd_move_to
path_cmd_line_to = 2, //----path_cmd_line_to
path_cmd_curve3 = 3, //----path_cmd_curve3
path_cmd_curve4 = 4, //----path_cmd_curve4
path_cmd_curveN = 5, //----path_cmd_curveN
path_cmd_catrom = 6, //----path_cmd_catrom
path_cmd_ubspline = 7, //----path_cmd_ubspline
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
path_cmd_mask = 0x0F //----path_cmd_mask
path_cmd_stop = 0, //----path_cmd_stop
path_cmd_move_to = 1, //----path_cmd_move_to
path_cmd_line_to = 2, //----path_cmd_line_to
path_cmd_curve3 = 3, //----path_cmd_curve3
path_cmd_curve4 = 4, //----path_cmd_curve4
path_cmd_curveN = 5, //----path_cmd_curveN
path_cmd_catrom = 6, //----path_cmd_catrom
path_cmd_ubspline = 7, //----path_cmd_ubspline
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
path_cmd_mask = 0x0F //----path_cmd_mask
};
//------------------------------------------------------------path_flags_e
enum path_flags_e
{
path_flags_none = 0, //----path_flags_none
path_flags_ccw = 0x10, //----path_flags_ccw
path_flags_cw = 0x20, //----path_flags_cw
path_flags_close = 0x40, //----path_flags_close
path_flags_mask = 0xF0 //----path_flags_mask
path_flags_none = 0, //----path_flags_none
path_flags_ccw = 0x10, //----path_flags_ccw
path_flags_cw = 0x20, //----path_flags_cw
path_flags_close = 0x40, //----path_flags_close
path_flags_mask = 0xF0 //----path_flags_mask
};
//---------------------------------------------------------------is_vertex
@@ -403,7 +448,7 @@ namespace agg
//-----------------------------------------------------------------is_stop
inline bool is_stop(unsigned c)
{
{
return c == path_cmd_stop;
}
@@ -447,7 +492,7 @@ namespace agg
inline bool is_close(unsigned c)
{
return (c & ~(path_flags_cw | path_flags_ccw)) ==
(path_cmd_end_poly | path_flags_close);
(path_cmd_end_poly | path_flags_close);
}
//------------------------------------------------------------is_next_poly
@@ -471,19 +516,19 @@ namespace agg
//-------------------------------------------------------------is_oriented
inline bool is_oriented(unsigned c)
{
return (c & (path_flags_cw | path_flags_ccw)) != 0;
return (c & (path_flags_cw | path_flags_ccw)) != 0;
}
//---------------------------------------------------------------is_closed
inline bool is_closed(unsigned c)
{
return (c & path_flags_close) != 0;
return (c & path_flags_close) != 0;
}
//----------------------------------------------------------get_close_flag
inline unsigned get_close_flag(unsigned c)
{
return c & path_flags_close;
return c & path_flags_close;
}
//-------------------------------------------------------clear_orientation
@@ -505,70 +550,77 @@ namespace agg
}
//--------------------------------------------------------------point_base
template<class T> struct point_base
template <class T>
struct point_base
{
typedef T value_type;
T x,y;
T x, y;
point_base() {}
point_base(T x_, T y_) : x(x_), y(y_) {}
point_base(T x_, T y_): x(x_), y(y_) {}
};
typedef point_base<int> point_i; //-----point_i
typedef point_base<float> point_f; //-----point_f
typedef point_base<int> point_i; //-----point_i
typedef point_base<float> point_f; //-----point_f
typedef point_base<double> point_d; //-----point_d
//-------------------------------------------------------------vertex_base
template<class T> struct vertex_base
template <class T>
struct vertex_base
{
typedef T value_type;
T x,y;
T x, y;
unsigned cmd;
vertex_base() {}
vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {}
vertex_base(T x_, T y_, unsigned cmd_): x(x_), y(y_), cmd(cmd_) {}
};
typedef vertex_base<int> vertex_i; //-----vertex_i
typedef vertex_base<float> vertex_f; //-----vertex_f
typedef vertex_base<int> vertex_i; //-----vertex_i
typedef vertex_base<float> vertex_f; //-----vertex_f
typedef vertex_base<double> vertex_d; //-----vertex_d
//----------------------------------------------------------------row_info
template<class T> struct row_info
template <class T>
struct row_info
{
int x1, x2;
T* ptr;
row_info() {}
row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {}
row_info(int x1_, int x2_, T* ptr_): x1(x1_), x2(x2_), ptr(ptr_) {}
};
//----------------------------------------------------------const_row_info
template<class T> struct const_row_info
template <class T>
struct const_row_info
{
int x1, x2;
const T* ptr;
const_row_info() {}
const_row_info(int x1_, int x2_, const T* ptr_) :
x1(x1_), x2(x2_), ptr(ptr_) {}
const_row_info(int x1_, int x2_, const T* ptr_):
x1(x1_),
x2(x2_),
ptr(ptr_)
{
}
};
//------------------------------------------------------------is_equal_eps
template<class T> inline bool is_equal_eps(T v1, T v2, T epsilon)
template <class T>
inline bool is_equal_eps(T v1, T v2, T epsilon)
{
bool neg1 = v1 < 0.0;
bool neg2 = v2 < 0.0;
bool neg1 = v1 < 0.0;
bool neg2 = v2 < 0.0;
if (neg1 != neg2)
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
if (neg1 != neg2)
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
int int1, int2;
std::frexp(v1, &int1);
std::frexp(v2, &int2);
int min12 = int1 < int2 ? int1 : int2;
std::frexp(v1, &int1);
std::frexp(v2, &int2);
int min12 = int1 < int2 ? int1 : int2;
v1 = std::ldexp(v1, -min12);
v2 = std::ldexp(v2, -min12);
v1 = std::ldexp(v1, -min12);
v2 = std::ldexp(v2, -min12);
return std::fabs(v1 - v2) < epsilon;
return std::fabs(v1 - v2) < epsilon;
}
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -13,7 +13,7 @@
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
// 4, 7, 10, or 13 vertices.
//
//----------------------------------------------------------------------------
@@ -27,33 +27,42 @@ namespace agg
{
//-----------------------------------------------------------------------
void arc_to_bezier(double cx, double cy, double rx, double ry,
double start_angle, double sweep_angle,
double* curve);
void arc_to_bezier(double cx,
double cy,
double rx,
double ry,
double start_angle,
double sweep_angle,
double* curve);
//==============================================================bezier_arc
//
//
// See implemantaion agg_bezier_arc.cpp
//
class bezier_arc
{
public:
//--------------------------------------------------------------------
bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {}
bezier_arc(double x, double y,
double rx, double ry,
double start_angle,
double sweep_angle)
bezier_arc(): m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to)
{
}
bezier_arc(double x,
double y,
double rx,
double ry,
double start_angle,
double sweep_angle)
{
init(x, y, rx, ry, start_angle, sweep_angle);
}
//--------------------------------------------------------------------
void init(double x, double y,
double rx, double ry,
double start_angle,
double sweep_angle);
void init(double x,
double y,
double rx,
double ry,
double start_angle,
double sweep_angle);
//--------------------------------------------------------------------
void rewind(unsigned)
@@ -64,67 +73,85 @@ namespace agg
//--------------------------------------------------------------------
unsigned vertex(double* x, double* y)
{
if(m_vertex >= m_num_vertices) return path_cmd_stop;
if (m_vertex >= m_num_vertices)
return path_cmd_stop;
*x = m_vertices[m_vertex];
*y = m_vertices[m_vertex + 1];
m_vertex += 2;
return (m_vertex == 2) ? unsigned(path_cmd_move_to) : m_cmd;
}
// Supplemantary functions. num_vertices() actually returns doubled
// Supplemantary functions. num_vertices() actually returns doubled
// number of vertices. That is, for 1 vertex it returns 2.
//--------------------------------------------------------------------
unsigned num_vertices() const { return m_num_vertices; }
const double* vertices() const { return m_vertices; }
double* vertices() { return m_vertices; }
unsigned num_vertices() const
{
return m_num_vertices;
}
const double* vertices() const
{
return m_vertices;
}
double* vertices()
{
return m_vertices;
}
private:
unsigned m_vertex;
unsigned m_num_vertices;
double m_vertices[26];
double m_vertices[26];
unsigned m_cmd;
};
//==========================================================bezier_arc_svg
// Compute an SVG-style bezier arc.
// Compute an SVG-style bezier arc.
//
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
// orientation of the ellipse are defined by two radii (rx, ry)
// and an x-axis-rotation, which indicates how the ellipse as a whole
// is rotated relative to the current coordinate system. The center
// (cx, cy) of the ellipse is calculated automatically to satisfy the
// constraints imposed by the other parameters.
// large-arc-flag and sweep-flag contribute to the automatic calculations
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
// orientation of the ellipse are defined by two radii (rx, ry)
// and an x-axis-rotation, which indicates how the ellipse as a whole
// is rotated relative to the current coordinate system. The center
// (cx, cy) of the ellipse is calculated automatically to satisfy the
// constraints imposed by the other parameters.
// large-arc-flag and sweep-flag contribute to the automatic calculations
// and help determine how the arc is drawn.
class bezier_arc_svg
{
public:
//--------------------------------------------------------------------
bezier_arc_svg() : m_arc(), m_radii_ok(false) {}
bezier_arc_svg(): m_arc(), m_radii_ok(false) {}
bezier_arc_svg(double x1, double y1,
double rx, double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2, double y2) :
m_arc(), m_radii_ok(false)
bezier_arc_svg(double x1,
double y1,
double rx,
double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2,
double y2):
m_arc(),
m_radii_ok(false)
{
init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2);
}
//--------------------------------------------------------------------
void init(double x1, double y1,
double rx, double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2, double y2);
void init(double x1,
double y1,
double rx,
double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2,
double y2);
//--------------------------------------------------------------------
bool radii_ok() const { return m_radii_ok; }
bool radii_ok() const
{
return m_radii_ok;
}
//--------------------------------------------------------------------
void rewind(unsigned)
@@ -138,22 +165,27 @@ namespace agg
return m_arc.vertex(x, y);
}
// Supplemantary functions. num_vertices() actually returns doubled
// Supplemantary functions. num_vertices() actually returns doubled
// number of vertices. That is, for 1 vertex it returns 2.
//--------------------------------------------------------------------
unsigned num_vertices() const { return m_arc.num_vertices(); }
const double* vertices() const { return m_arc.vertices(); }
double* vertices() { return m_arc.vertices(); }
unsigned num_vertices() const
{
return m_arc.num_vertices();
}
const double* vertices() const
{
return m_arc.vertices();
}
double* vertices()
{
return m_arc.vertices();
}
private:
bezier_arc m_arc;
bool m_radii_ok;
bool m_radii_ok;
};
}
#endif

Some files were not shown because too many files have changed in this diff Show More