mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	Add a working fluxfile cp.
This commit is contained in:
		| @@ -13,6 +13,7 @@ cxxprogram( | |||||||
|         "./fe-format.cc", |         "./fe-format.cc", | ||||||
|         "./fe-fluxfilels.cc", |         "./fe-fluxfilels.cc", | ||||||
|         "./fe-fluxfilerm.cc", |         "./fe-fluxfilerm.cc", | ||||||
|  |         "./fe-fluxfilecp.cc", | ||||||
|         "./fe-getdiskinfo.cc", |         "./fe-getdiskinfo.cc", | ||||||
|         "./fe-getfile.cc", |         "./fe-getfile.cc", | ||||||
|         "./fe-getfileinfo.cc", |         "./fe-getfileinfo.cc", | ||||||
|   | |||||||
							
								
								
									
										84
									
								
								src/fe-fluxfilecp.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/fe-fluxfilecp.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | #include "lib/core/globals.h" | ||||||
|  | #include "lib/config/flags.h" | ||||||
|  | #include "lib/data/fluxmap.h" | ||||||
|  | #include "lib/data/sector.h" | ||||||
|  | #include "lib/config/proto.h" | ||||||
|  | #include "lib/data/locations.h" | ||||||
|  | #include "lib/data/flux.h" | ||||||
|  | #include "lib/external/fl2.h" | ||||||
|  | #include "lib/external/fl2.pb.h" | ||||||
|  | #include "src/fluxengine.h" | ||||||
|  | #include <fstream> | ||||||
|  |  | ||||||
|  | static FlagGroup flags; | ||||||
|  |  | ||||||
|  | static StringFlag inputFilenameFlag({"-i", "--input"}, "input flux file"); | ||||||
|  | static StringFlag outputFilenameFlag( | ||||||
|  |     {"-o", "--output"}, "output flux file (must exist)"); | ||||||
|  | static StringFlag tracksFlag({"-t", "--tracks"}, "tracks to copy"); | ||||||
|  |  | ||||||
|  | static const TrackFluxProto* findTrack( | ||||||
|  |     const FluxFileProto& f, int cylinder, int head) | ||||||
|  | { | ||||||
|  |     for (const auto& trackFlux : f.track()) | ||||||
|  |         if ((trackFlux.track() == cylinder) && (trackFlux.head() == head)) | ||||||
|  |             return &trackFlux; | ||||||
|  |  | ||||||
|  |     return nullptr; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static TrackFluxProto* findOrMakeTrack(FluxFileProto& f, int cylinder, int head) | ||||||
|  | { | ||||||
|  |     for (auto& trackFlux : *f.mutable_track()) | ||||||
|  |         if ((trackFlux.track() == cylinder) && (trackFlux.head() == head)) | ||||||
|  |             return &trackFlux; | ||||||
|  |  | ||||||
|  |     TrackFluxProto* tf = f.add_track(); | ||||||
|  |     tf->set_track(cylinder); | ||||||
|  |     tf->set_head(head); | ||||||
|  |     return tf; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int mainFluxfileCp(int argc, const char* argv[]) | ||||||
|  | { | ||||||
|  |     flags.parseFlags(argc, argv); | ||||||
|  |     if (!inputFilenameFlag.isSet()) | ||||||
|  |         error("you must specify an input filename with -i"); | ||||||
|  |     if (!outputFilenameFlag.isSet()) | ||||||
|  |         error("you must specify an output filename with -o"); | ||||||
|  |  | ||||||
|  |     fmt::print( | ||||||
|  |         "{} -> {}:\n", inputFilenameFlag.get(), outputFilenameFlag.get()); | ||||||
|  |     FluxFileProto inf = loadFl2File(inputFilenameFlag.get()); | ||||||
|  |     FluxFileProto outf = loadFl2File(outputFilenameFlag.get()); | ||||||
|  |  | ||||||
|  |     bool changed = false; | ||||||
|  |     for (const auto& location : parseCylinderHeadsString(tracksFlag)) | ||||||
|  |     { | ||||||
|  |         const TrackFluxProto* intrack = | ||||||
|  |             findTrack(inf, location.cylinder, location.head); | ||||||
|  |         if (!intrack) | ||||||
|  |         { | ||||||
|  |             fmt::print("  location c{}h{} not found\n", | ||||||
|  |                 location.cylinder, | ||||||
|  |                 location.head); | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         TrackFluxProto* outtrack = | ||||||
|  |             findOrMakeTrack(outf, location.cylinder, location.head); | ||||||
|  |         fmt::print("  copying c{}h{}\n", location.cylinder, location.head); | ||||||
|  |         for (const auto& flux : intrack->flux()) | ||||||
|  |             outtrack->add_flux(flux); | ||||||
|  |         changed = true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (changed) | ||||||
|  |     { | ||||||
|  |         fmt::print("writing back output file\n"); | ||||||
|  |         saveFl2File(outputFilenameFlag.get(), outf); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |         fmt::print("output file not modified\n"); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @@ -9,6 +9,7 @@ extern command_cb mainAnalyseLayout; | |||||||
| extern command_cb mainConvert; | extern command_cb mainConvert; | ||||||
| extern command_cb mainFluxfileLs; | extern command_cb mainFluxfileLs; | ||||||
| extern command_cb mainFluxfileRm; | extern command_cb mainFluxfileRm; | ||||||
|  | extern command_cb mainFluxfileCp; | ||||||
| extern command_cb mainFormat; | extern command_cb mainFormat; | ||||||
| extern command_cb mainGetDiskInfo; | extern command_cb mainGetDiskInfo; | ||||||
| extern command_cb mainGetFile; | extern command_cb mainGetFile; | ||||||
| @@ -84,6 +85,7 @@ static std::vector<Command> fluxfileables = | |||||||
| { | { | ||||||
|     { "ls",            mainFluxfileLs,           "Lists the contents of a flux file.", }, |     { "ls",            mainFluxfileLs,           "Lists the contents of a flux file.", }, | ||||||
|     { "rm",            mainFluxfileRm,           "Removes flux from a flux file.", }, |     { "rm",            mainFluxfileRm,           "Removes flux from a flux file.", }, | ||||||
|  |     { "cp",            mainFluxfileCp,           "Copies flux from one flux file to another." }, | ||||||
| }; | }; | ||||||
| // clang-format on | // clang-format on | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user