Skip to content

Commit 2663ff8

Browse files
author
karl
committed
commit of cruft files during development
I've been engaging the repository for a while without committing, so here's a commit of all the cruft files for the git history. I've been exploring what kind of diff backend could be used for asymmetrical streaming output. There don't seem to be good options! But I'm settling on using xdiff from git and libgit2, and plan to remove most of the other cruft. Using the same diff code as git brings the implementation side nearest to what produces expected output.
1 parent 74bd67c commit 2663ff8

File tree

268 files changed

+4943
-16
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

268 files changed

+4943
-16
lines changed

.gitmodules

+9
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,12 @@
1616
[submodule "third_party/edlib"]
1717
path = third_party/edlib
1818
url = https://github.com/Martinsos/edlib
19+
[submodule "third_party/xdiff"]
20+
path = third_party/xdiff
21+
url = https://github.com/libgit2/xdiff
22+
[submodule "third_party/diff-match-patch"]
23+
path = third_party/diff-match-patch
24+
url = https://github.com/dmsnell/diff-match-patch
25+
[submodule "third_party/step20"]
26+
path = third_party/step20
27+
url = https://github.com/storm-ptr/step20

.zinc/logs/2025-02-02T01:07:57Z.log

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{"role":"user","content":"in c++20 how do i write the entire contents of one file into another","ts":1.738458488958E9}
2+
{"role":"assistant","content":"You can use the following C++20 code to write the entire contents of one file into another:\n\n```cpp\n#include <fstream>\n#include <filesystem>\n\nvoid copyFile(const std::filesystem::path& source, const std::filesystem::path& destination) {\n std::ifstream src(source, std::ios::binary);\n std::ofstream dst(destination, std::ios::binary);\n\n if (!src.is_open() || !dst.is_open()) {\n throw std::runtime_error(\"Failed to open file\");\n }\n\n dst << src.rdbuf();\n}\n\nint main() {\n try {\n std::filesystem::path source = \"source.txt\";\n std::filesystem::path destination = \"destination.txt\";\n copyFile(source, destination);\n } catch (const std::exception& e) {\n std::cerr << \"Error: \" << e.what() << std::endl;\n return 1;\n }\n\n return 0;\n}\n```\n\nThis code uses the `std::ifstream` and `std::ofstream` classes to open the source and destination files in binary mode. It then uses the `rdbuf()` function to read the entire contents of the source file and write it to the destination file.\n\nAlternatively, you can use the `std::filesystem::copy_file` function, which is a more concise and expressive way to achieve the same result:\n\n```cpp\n#include <filesystem>\n\nint main() {\n try {\n std::filesystem::path source = \"source.txt\";\n std::filesystem::path destination = \"destination.txt\";\n std::filesystem::copy_file(source, destination, std::filesystem::copy_options::overwrite_existing);\n } catch (const std::exception& e) {\n std::cerr << \"Error: \" << e.what() << std::endl;\n return 1;\n }\n\n return 0;\n}\n```\n\nThis code uses the `std::filesystem::copy_file` function to copy the source file to the destination file, overwriting the destination file if it already exists.","ts":1.738458505371E9}
3+
{"role":"user","content":"using the first method, how would i append a linebreak only if there wasn't already one at the end of the file?","ts":1.738458596103E9}
4+
{"role":"assistant","content":"To append a linebreak only if there wasn't already one at the end of the file, you can read the last character of the source file and check if it's a newline character. Here's how you can modify the `copyFile` function to achieve this:\n\n```cpp\n#include <fstream>\n#include <filesystem>\n\nvoid copyFile(const std::filesystem::path& source, const std::filesystem::path& destination) {\n std::ifstream src(source, std::ios::binary | std::ios::ate);\n std::ofstream dst(destination, std::ios::binary | std::ios::app);\n\n if (!src.is_open() || !dst.is_open()) {\n throw std::runtime_error(\"Failed to open file\");\n }\n\n // Get the size of the source file\n auto size = src.tellg();\n src.seekg(0);\n\n // Copy the contents of the source file to the destination file\n dst << src.rdbuf();\n\n // Check if the source file ends with a newline character\n if (size > 0) {\n src.seekg(size - 1);\n char lastChar;\n src.read(&lastChar, 1);\n if (lastChar != '\\n') {\n dst << '\\n';\n }\n }\n}\n\nint main() {\n try {\n std::filesystem::path source = \"source.txt\";\n std::filesystem::path destination = \"destination.txt\";\n copyFile(source, destination);\n } catch (const std::exception& e) {\n std::cerr << \"Error: \" << e.what() << std::endl;\n return 1;\n }\n\n return 0;\n}\n```\n\nHowever, this approach has a problem: it will append a newline character even if the destination file already has content and doesn't end with a newline character.\n\nA better approach would be to read the last character of the destination file before copying the contents of the source file, and then append a newline character if necessary after copying the contents. Here's how you can modify the `copyFile` function to achieve this:\n\n```cpp\n#include <fstream>\n#include <filesystem>\n\nvoid copyFile(const std::filesystem::path& source, const std::filesystem::path& destination) {\n std::ifstream src(source, std::ios::binary);\n std::ofstream dst(destination, std::ios::binary | std::ios::app);\n\n if (!src.is_open() || !dst.is_open()) {\n throw std::runtime_error(\"Failed to open file\");\n }\n\n // Get the size of the destination file\n dst.flush();\n std::ifstream dstIn(destination, std::ios::binary | std::ios::ate);\n auto dstSize = dstIn.tellg();\n dstIn.close();\n\n // Copy the contents of the source file to the destination file\n dst << src.rdbuf();\n\n // Check if the destination file ends with a newline character\n if (dstSize > 0) {\n std::ifstream dstIn(destination, std::ios::binary);\n dstIn.seekg(dstSize - 1);\n char lastChar;\n dstIn.read(&lastChar, 1);\n if (lastChar != '\\n') {\n dst << '\\n';\n }\n } else {\n // If the destination file was empty, check if the source file ends with a newline character\n src.seekg(0, std::ios::end);\n auto srcSize = src.tellg();\n if (srcSize > 0) {\n src.seekg(srcSize - 1);\n char lastChar;\n src.read(&lastChar, 1);\n if (lastChar != '\\n') {\n dst << '\\n';\n }\n }\n }\n}\n\nint main() {\n try {\n std::filesystem::path source = \"source.txt\";\n std::filesystem::path destination = \"destination.txt\";\n copyFile(source, destination);\n } catch (const std::exception& e) {\n std::cerr << \"Error: \" << e.what() << std::endl;\n return 1;\n }\n\n return 0;\n}\n```\n\nThis version of the `copyFile` function checks the last character of the destination file before copying the contents of the source file, and appends a newline character if necessary after copying the contents. If the destination file is empty, it checks the last character of the source file instead.","ts":1.738458627125E9}
5+
{"role":"user","content":"is there an efficient way to do it without extra opening, maybe by accessing underlying buffers in a more informed way?","ts":1.738458706161E9}
6+
{"role":"assistant","content":"Yes, you can achieve this without extra file openings by accessing the underlying buffers of the `std::ifstream` and `std::ofstream` objects. Here's how you can modify the `copyFile` function to achieve this:\n\n```cpp\n#include <fstream>\n#include <filesystem>\n\nvoid copyFile(const std::filesystem::path& source, const std::filesystem::path& destination) {\n std::ifstream src(source, std::ios::binary | std::ios::ate);\n std::ofstream dst(destination, std::ios::binary | std::ios::app);\n\n if (!src.is_open() || !dst.is_open()) {\n throw std::runtime_error(\"Failed to open file\");\n }\n\n // Get the size of the source file\n auto size = src.tellg();\n src.seekg(0);\n\n // Copy the contents of the source file to the destination file\n dst << src.rdbuf();\n\n // Check if the destination file ends with a newline character\n if (dst.tellp() > 0) {\n // Get the last character from the output buffer\n auto& outbuf = dst.rdbuf();\n if (outbuf.pubseekoff(-1, std::ios_base::end) != std::streampos(-1)) {\n char lastChar;\n outbuf.sgetn(&lastChar, 1);\n if (lastChar != '\\n') {\n dst << '\\n';\n }\n }\n } else {\n // If the destination file was empty, check if the source file ends with a newline character\n if (size > 0) {\n src.seekg(size - 1);\n char lastChar;\n src.read(&lastChar, 1);\n if (lastChar != '\\n') {\n dst << '\\n';\n }\n }\n }\n}\n\nint main() {\n try {\n std::filesystem::path source = \"source.txt\";\n std::filesystem::path destination = \"destination.txt\";\n copyFile(source, destination);\n } catch (const std::exception& e) {\n std::cerr << \"Error: \" << e.what() << std::endl;\n return 1;\n }\n\n return 0;\n}\n```\n\nHowever, this approach still has a problem: it's not guaranteed to work correctly if the output buffer is not seekable (e.g., if the output is a pipe or a socket).\n\nA more reliable approach would be to keep track of the last character written to the output buffer manually. Here's how you can modify the `copyFile` function to achieve this:\n\n```cpp\n#include <fstream>\n#include <filesystem>\n\nvoid copyFile(const std::filesystem::path& source, const std::filesystem::path& destination) {\n std::ifstream src(source, std::ios::binary);\n std::ofstream dst(destination, std::ios::binary | std::ios::app);\n\n if (!src.is_open() || !dst.is_open()) {\n throw std::runtime_error(\"Failed to open file\");\n }\n\n char buffer[4096];\n char lastChar = '\\0';\n\n // Copy the contents of the source file to the destination file\n while (src.read(buffer, sizeof(buffer))) {\n dst.write(buffer, sizeof(buffer));\n lastChar = buffer[sizeof(buffer) - 1];\n }\n\n // Write the remaining characters\n auto remaining = src.gcount();\n if (remaining > 0) {\n dst.write(buffer, remaining);\n lastChar = buffer[remaining - 1];\n }\n\n // Check if the destination file ends with a newline character\n if (lastChar != '\\n' && lastChar != '\\0') {\n dst << '\\n';\n }\n}\n\nint main() {\n try {\n std::filesystem::path source = \"source.txt\";\n std::filesystem::path destination = \"destination.txt\";\n copyFile(source, destination);\n } catch (const std::exception& e) {\n std::cerr << \"Error: \" << e.what() << std::endl;\n return 1;\n }\n\n return 0;\n}\n```\n\nThis version of the `copyFile` function keeps track of the last character written to the output buffer manually and appends a newline character if necessary. This approach is more reliable and efficient than the previous ones.","ts":1.738458719483E9}
7+
{"role":"user","content":"let's make this a ton easier. my output stream is a std::stringstream. can i just ask it what its last character is?","ts":1.738459093306E9}
8+
{"role":"assistant","content":"Yes, you can definitely do that. Since `std::stringstream` is a type of `std::basic_stringstream`, you can use the `str()` function to get the underlying string, and then access the last character using the `back()` function.\n\nHere's how you can do it:\n\n```cpp\nstd::stringstream ss;\n// ... write to ss ...\n\nif (!ss.str().empty() && ss.str().back() != '\\n') {\n ss << '\\n';\n}\n```\n\nThis code checks if the string stream is not empty and if the last character is not a newline. If both conditions are true, it appends a newline character to the string stream.\n\nNote that `back()` is a C++11 feature. If you're using an older version of C++, you can use `ss.str()[ss.str().size() - 1]` instead.","ts":1.738459121777E9}
9+
{"role":"user","content":"i think c++23 does string templates? does c++20?","ts":1.738459608419E9}
10+
{"role":"assistant","content":"Yes, C++20 introduces a feature called \"format strings\" or \"std::format\", which allows you to create formatted strings using a syntax similar to string templates.\n\nHowever, C++20 does not have a feature specifically called \"string templates\". But C++23 does not have string templates either.\n\nC++23 does have a feature called \"std::print\" and an improved version of \"std::format\" though.\n\nBut if you are looking for something like string templates, you might be thinking of \"std::format\" which is available in C++20.\n\nHere's an example of how you can use it:\n\n```cpp\n#include <format>\n\nint main() {\n int x = 5;\n std::string str = std::format(\"The value of x is: {}\", x);\n return 0;\n}\n```\n\nIn this example, the `{}` is a placeholder for the value of `x`, which is inserted into the string when `std::format` is called.\n\nNote that `std::format` is a more powerful and flexible way to create formatted strings than traditional string concatenation or `std::stringstream`.","ts":1.738459637392E9}

0 commit comments

Comments
 (0)