versmr/versmr.h
2026-01-12 20:50:50 +04:00

149 lines
4.5 KiB
C

/*
* versmr.h
*
* Copyright 2026
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#if (!defined(__LIB_versmr_H_))
#define __LIB_versmr_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define true 1
#define false 0
typedef unsigned char bool_t;
#define VERSMR_VERSION "1.0"
static void __help(void) {
puts(
"Console VERSMR V" VERSMR_VERSION "\n"
" " "Simple version control" "\n"
"Using:" "\n"
" " "versmr [-v/--version] - view versmr version" "\n"
" " "versmr [-h/--help] - show this help" "\n"
" " "versmr [-s/--set] [version] - init version" "\n"
"To update version, call (one of the options):" "\n"
" " "bash .versmr.bash" "\n"
" " "make -f versup.mk" "\n"
" " "chmod +x .versmr.bash && ./.versmr.bash" "\n"
"To set version:" "\n"
" " "versmr --set VERSION" "\0"
);
}
static void versmr_error(char* _err) {
printf("\033[1mversmr: \033[91m%s\033[0m\n", _err);
}
static int __versmr_begin(char* version) {
FILE* bs = fopen(".versmr.bash", "w");
if (bs == NULL) {
versmr_error("Unable to find configuration file!");
return EXIT_FAILURE;
}
fputs("#!/bin/bash\nvers=$(cat .versmr)\nvers=$(($vers+1))\necho $vers > .versmr", bs);
fclose(bs);
FILE* mk = fopen("versup.mk", "w");
if (mk == NULL) {
versmr_error("Unable to find configuration file!");
return EXIT_FAILURE;
}
fputs("all:\n\tbash .versmr.bash\n", mk);
fclose(mk);
FILE* fp = fopen(".versmr", "w");
if (fp == NULL) {
versmr_error("Unable to find configuration file!");
return EXIT_FAILURE;
}
unsigned long vers = 0;
if (sscanf(version, "%lu", &vers) == 0) {
versmr_error("Incorrect version format!");
fclose(fp);
return EXIT_FAILURE;
};
fprintf(fp, "%lu", vers);
fclose(fp);
return EXIT_SUCCESS;
}
static int __get_version(void) {
FILE* fp = fopen(".versmr", "r");
if (fp == NULL) {
versmr_error("Unable to find configuration file!");
return EXIT_FAILURE;
}
unsigned long vers = 0;
if (fscanf(fp, "%lu", &vers) == 0) {
fclose(fp);
versmr_error("Unable to find configuration file!");
return EXIT_FAILURE;
};
fprintf(fp, "%lu", vers);
fclose(fp);
return EXIT_SUCCESS;
}
int _lib_versmr_main(int argc, char** argv) {
unsigned int pos = 1;
bool_t get_name = false;
char* set_version = NULL;
while (pos != argc) {
char* str = argv[pos];
if (str[0] == '-') {
bool_t cn_size = false;
if (str[1] == '-') cn_size = true;
switch (str[1 + cn_size]) {
case 'e':
return __get_version();
case 'h':
__help();
return EXIT_SUCCESS;
case 'v':
puts(VERSMR_VERSION);
return EXIT_SUCCESS;
case 's':
get_name = true;
break;
default:
versmr_error("Unknown argument!");
return EXIT_FAILURE;
}
} else {
if (get_name) set_version = str;
else set_version = str;
get_name = false;
}
pos ++;
}
if (get_name == true) {
versmr_error("Cannot find option in \"--set\" argument!");
return EXIT_FAILURE;
}
if (set_version == NULL) set_version = "1";
return __versmr_begin(set_version);
}
#endif /* __LIB_versmr_H_ */