diff --git a/src/apps/bin/Jamfile b/src/apps/bin/Jamfile index 007bfb9b7a..dcec867ea9 100644 --- a/src/apps/bin/Jamfile +++ b/src/apps/bin/Jamfile @@ -10,6 +10,7 @@ StdBinCommands isvolume.cpp lsindex.cpp yes.cpp + version.cpp : be ; StdBinCommands @@ -48,4 +49,4 @@ SubInclude OBOS_TOP src apps bin ping ; SubInclude OBOS_TOP src apps bin route ; SubInclude OBOS_TOP src apps bin traceroute ; SubInclude OBOS_TOP src apps bin unzip ; -SubInclude OBOS_TOP src apps bin zip ; \ No newline at end of file +SubInclude OBOS_TOP src apps bin zip ; diff --git a/src/apps/bin/version.cpp b/src/apps/bin/version.cpp new file mode 100644 index 0000000000..a704dc1093 --- /dev/null +++ b/src/apps/bin/version.cpp @@ -0,0 +1,193 @@ +// Author: Ryan Fleet +// Created: 9th October 2002 +// Modified: 10th October 2002 + +#include +#include +#include + + +void help(void) +{ + printf("usage: version [OPTION] FILENAME [FILENAME2, ...]\n"); + printf("Returns the version of a file.\n\n"); + printf(" -h, --help this usage message\n"); + printf(" -l, --long print long version information of FILENAME\n"); + printf(" -n, --numerical print in numerical mode\n"); + printf(" (Major miDdle miNor Variety Internal)\n"); + printf(" -s, --system print system version instead of app version\n"); + printf(" --version print version information for this command\n"); +} + + +void getversion(const char *filename, version_kind kind, bool bLongFlag, bool bNumericalFlag) +{ + BFile file(filename, O_RDONLY); + if(file.InitCheck() != B_OK) + { + printf("Couldn't get file info!\n"); + return; + } + + BAppFileInfo info(&file); + if(info.InitCheck() != B_OK) + { + printf("Couldn't get file info!\n"); + return; + } + + version_info version; + if(info.GetVersionInfo(&version, kind) != B_OK) + { + printf("Version unknown!\n"); + return; + } + + if(true == bLongFlag) + { + printf("%s\n", version.long_info); + return; + } + + if(true == bNumericalFlag) + { + printf("%lu ", version.major); + printf("%lu ", version.middle); + printf("%lu ", version.minor); + switch(version.variety) + { + case 0: printf("d "); break; + case 1: printf("a "); break; + case 2: printf("b "); break; + case 3: printf("g "); break; + case 4: printf("gm "); break; + case 5: printf("f "); break; + }; + printf("%lu\n", version.internal); + return; + } + + printf("%s\n", version.short_info); +} + + +/* + strLessEqual(string1, string2) + determines whether string1 contains at least one or more of the characters + of string2 but none of which string2 doesn't contain. + + true == ("hel" == "help"); true == ("help" == "help"); true == ("h" == "help"); + false == ("held" == "help"); false == ("helped" == "help"); +*/ +bool strLessEqual(const char *str1, const char *str2) +{ + char *ptr1 = const_cast(str1); + char *ptr2 = const_cast(str2); + + while(*ptr1 != '\0') + { + if(*ptr1 != *ptr2) + return false; + ++ptr1; + ++ptr2; + } + return true; +} + + +int main(int argc, char *argv[]) +{ + version_kind kind = B_APP_VERSION_KIND; + bool bLongFlag = false; + bool bNumericalFlag = false; + int i; + + if(argc < 2) + return 0; + + for(i = 1; i < argc; ++i) + { + if(strncmp(argv[i], "-", 1) == 0) + { + char *ptr = argv[i]; + ++ptr; + + if(*ptr == '-') + { + bool lequal = false; + ++ptr; + + if(*ptr == 'h') + { + lequal = strLessEqual(ptr, "help"); + if(lequal == true) + { + help(); + return 0; + } + } + + else if(*ptr == 'l') + { + lequal = strLessEqual(ptr, "long"); + if(lequal == true) + bLongFlag = true; + } + + else if(*ptr == 'n') + { + lequal = strLessEqual(ptr, "numerical"); + if(lequal == true) + bNumericalFlag = true; + } + + else if(*ptr == 's') + { + lequal = strLessEqual(ptr, "system"); + if(lequal == true) + kind = B_SYSTEM_VERSION_KIND; + } + + else if(*ptr == 'v') + { + lequal = strLessEqual(ptr, "version"); + if(lequal == true) + { + getversion(argv[0], B_APP_VERSION_KIND, false, false); + return 0; + } + } + + if(lequal == false) + printf("%s unrecognized option `%s'\n", argv[0], argv[i]); + } + + else while(*ptr != '\0') + { + if(*ptr == 'h') + { + help(); + return 0; + } + else if(*ptr == 's') + kind = B_SYSTEM_VERSION_KIND; + else if(*ptr == 'l') + bLongFlag = true; + else if(*ptr == 'n') + bNumericalFlag = true; + else + printf("%s: invalid option -- %c\n", argv[0], *ptr); + + ++ptr; + } + } + } + + for(i = 1; i < argc; ++i) + { + if(strncmp(argv[i], "-", 1) != 0) + getversion(argv[i], kind, bLongFlag, bNumericalFlag); + } + + return 0; +}