ref: 3ba088193fc0e9b022957fb348cfdfe1d60daab7
dir: /utils/win32/ac2ver.c/
/* ** AC2VER - extract version number from AC_INIT macro (configure.ac) ** Copyright (C) 2017 LoRd_MuldeR <mulder2@GMX.de> ** ** This software is released under the CC0 1.0 Universal [CC0 1.0] licence! ** https://creativecommons.org/publicdomain/zero/1.0/legalcode **/ #define BUFF_SIZE 4096 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> static int clean_string(char *const str) { size_t i = 0, j = 0; while(str[i]) { if(isalnum(str[i]) || strchr("._-", str[i])) { if(i != j) { str[j] = str[i]; } ++j; } ++i; } str[j] = '\0'; return !!j; } static int parse_version(FILE *const input, const char *const format, char *const version) { char buffer[BUFF_SIZE]; while(!(feof(input) || ferror(input))) { const char *line = fgets(buffer, BUFF_SIZE, input); if(line) { while((*line) && (isspace(*line))) { ++line; /*skip space*/ } if(sscanf(line, format, version) == 1) { if(clean_string(version)) { return 1; /*found!*/ } } } } version[0] = '\0'; return 0; } static int get_version(const wchar_t *const lib_name, const wchar_t *const file_name) { char format[128], version[BUFF_SIZE]; FILE *const input = _wfopen(file_name, L"r"); if(!input) { fprintf(stderr, "Error: Failed to open input file!\n%S\n\n", file_name); return 0; } _snprintf(format, 128, "AC_INIT ( %S , %%s", lib_name); //printf("<%s>\n", format); if(parse_version(input, format, version)) { printf("#define PACKAGE_VERSION \"%s\"\n", version); fclose(input); return 1; } else { fprintf(stderr, "Error: Version string could not be found!\n\n"); fclose(input); return 0; } } int wmain(int argc, wchar_t* argv[]) { if((argc != 3) || (!argv[1][0]) || (!argv[2][0])) { wchar_t file_name[_MAX_FNAME], file_ext[_MAX_EXT]; _wsplitpath(argv[0], NULL, NULL, file_name, file_ext); fprintf(stderr, "AC2VER [%s]\n\n", __DATE__); fprintf(stderr, "Usage: %S%S <lib_name> <path/to/configure.ac>\n\n", file_name, file_ext); return EXIT_FAILURE; } return get_version(argv[1], argv[2]) ? EXIT_SUCCESS : EXIT_FAILURE; }