Compiling on Linux
Hello!
I'm honestly writing this more for informational purposes, in case someone else wants to compile on Linux and wants a few pointers. Getting it compiling on Linux requires a few code changes, and I don't know the best way to make something like this more crossplatform (my C/C++ is extraordinarily rusty). I also wouldn't expect you to support an extra OS or anything, of course. :)
Anyway, this compiles and runs just fine on Linux with a few minor changes:
- Case-sensitivity:
#include "ReVorb.h"at the top ofrevorb.cppneeds to be#include "revorb.h"instead (that, or the header file renamed to have the capital letters) - Lack of "safe" C11 Annex K functions (the
*_sfunctions) in glibc/gcc. There's more than one Linux implementation of these out there, but the one I used was https://github.com/rurban/safeclib - this won't be found by default on most Linux machines. After installing/compiling that, add#include <libsafec/safe_lib.h>and#include <libsafec/safe_str_lib.h>torevorb.h - Other header changes: In
revorb.h, remove the include forio.hand substituteunistd.h _unlinkdoesn't exit -- just change those instances tounlinkinstead, inrevorb.cpp. There's two instances. (This is whatunistd.hprovides)- Linux doesn't distinguish between text/binary while reading from STDIN, and doesn't have
_setmode(or_fileno). Just comment out those lines inrevorb.cppentirely. There's two instances of that. I did verify that reading in the file via stdin produces the same output as from a file.
So, do all that, and it compiles/runs just fine with:
g++ -o revorb -logg -lvorbis -lsafec-3.6.0 revorb.cpp
I'm attaching a patch with all the changes that I mentioned. As I say, not expecting any of this to get merged in or whatever. If I ever get enthusiastic enough to draft up a "proper" PR for this, I'll submit it that way.
Patch inlined for readability, too:
diff --git a/revorb.cpp b/revorb.cpp
index 425f7b5..d1fde84 100644
--- a/revorb.cpp
+++ b/revorb.cpp
@@ -17,7 +17,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "ReVorb.h"
+#include "revorb.h"
bool Failed = false;
@@ -152,7 +152,7 @@ int32_t main(int32_t argumentCount, const char* arguments[])
if (!strcmp(arguments[1], "-"))
{
fi = stdin;
- _setmode(_fileno(stdin), _O_BINARY);
+ //_setmode(fileno(stdin), _O_BINARY);
}
else
{
@@ -173,7 +173,7 @@ int32_t main(int32_t argumentCount, const char* arguments[])
if (!strcmp(arguments[2], "-"))
{
fo = stdout;
- _setmode(_fileno(stdout), _O_BINARY);
+ //_setmode(fileno(stdout), _O_BINARY);
}
else
{
@@ -348,12 +348,12 @@ int32_t main(int32_t argumentCount, const char* arguments[])
{
if (Failed)
{
- _unlink(tmpName);
+ unlink(tmpName);
strcat_s(tmpName, sizeof(tmpName), ".tmp");
}
else
{
- if (_unlink(arguments[1]) || rename(tmpName, arguments[1]))
+ if (unlink(arguments[1]) || rename(tmpName, arguments[1]))
{
fprintf(stderr, "%S: Could not put the output file back in place.\n", tmpName);
}
diff --git a/revorb.h b/revorb.h
index 0692646..6277d67 100644
--- a/revorb.h
+++ b/revorb.h
@@ -18,10 +18,12 @@
*/
#pragma once
#include <stdio.h>
-#include <io.h>
+#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <iostream>
+#include <libsafec/safe_lib.h>
+#include <libsafec/safe_str_lib.h>
#include "libogg/ogg.h"
#include "libvorbis/codec.h"
Thanks for the info! I was planning on rewriting this entire project in modern C++ so it uses std::ofstream and std::filesystem (which would fix a lot of these issues) but got busy with other projects/work. Don't expect myself to do that anytime soon because I'm lazy, but if you do submit a pr I will definitely merge it.