trunk/src/build/verinfo.c
| r243246 | r243247 | |
| 120 | 120 | // parse_version_digit |
| 121 | 121 | //============================================================ |
| 122 | 122 | |
| 123 | | static int parse_version_digit(const char *str, int *position) |
| 123 | static bool parse_version_digit(const char *str, int *position, int* value) |
| 124 | 124 | { |
| 125 | | int value = 0; |
| 125 | int res = 0; |
| 126 | 126 | |
| 127 | 127 | while (str[*position] != 0 && !isspace((UINT8)str[*position]) && !isdigit((UINT8)str[*position])) |
| 128 | 128 | (*position)++; |
| 129 | 129 | |
| 130 | 130 | if (str[*position] != 0 && isdigit((UINT8)str[*position])) |
| 131 | 131 | { |
| 132 | | sscanf(&str[*position], "%d", &value); |
| 132 | res = sscanf(&str[*position], "%d", value); |
| 133 | 133 | while (isdigit((UINT8)str[*position])) |
| 134 | 134 | (*position)++; |
| 135 | 135 | } |
| 136 | | return value; |
| 136 | return res == 1; |
| 137 | 137 | } |
| 138 | 138 | |
| 139 | 139 | |
| r243246 | r243247 | |
| 142 | 142 | // parse_version |
| 143 | 143 | //============================================================ |
| 144 | 144 | |
| 145 | | static int parse_version(char *str, int *version_major, int *version_minor, int *version_micro, const char **version_string) |
| 145 | static int parse_version(char *str, int *version_major, int *version_minor, const char **version_string) |
| 146 | 146 | { |
| 147 | 147 | char *version; |
| 148 | 148 | int position = 0; |
| 149 | 149 | |
| 150 | 150 | // find the version string |
| 151 | | version = strstr(str, "build_version"); |
| 151 | version = strstr(str, "BARE_BUILD_VERSION"); |
| 152 | 152 | if (version != NULL) |
| 153 | 153 | version = strchr(version, '"'); |
| 154 | | if (version == NULL) |
| 154 | if (version == NULL || *version == '\0' || strchr(version, '.') == NULL) |
| 155 | 155 | { |
| 156 | | fprintf(stderr, "Unable to find build_version string\n"); |
| 156 | fprintf(stderr, "Unable to find version string\n"); |
| 157 | 157 | return 1; |
| 158 | 158 | } |
| 159 | 159 | version++; |
| 160 | | *strchr(version, ' ') = 0; |
| 160 | *strchr(version, '"') = 0; |
| 161 | 161 | |
| 162 | 162 | *version_string = version; |
| 163 | | *version_major = parse_version_digit(version, &position); |
| 164 | | *version_minor = parse_version_digit(version, &position); |
| 165 | | *version_micro = parse_version_digit(version, &position); |
| 163 | if (!parse_version_digit(version, &position, version_major)) |
| 164 | { |
| 165 | fprintf(stderr, "Unable to parse major version\n"); |
| 166 | return 1; |
| 167 | } |
| 168 | if (!parse_version_digit(version, &position, version_minor)) |
| 169 | { |
| 170 | fprintf(stderr, "Unable to parse minor version\n"); |
| 171 | return 1; |
| 172 | } |
| 166 | 173 | return 0; |
| 167 | 174 | } |
| 168 | 175 | |
| r243246 | r243247 | |
| 248 | 255 | buffer[size] = 0; |
| 249 | 256 | |
| 250 | 257 | // parse out version string |
| 251 | | if (parse_version(buffer, &v.version_major, &v.version_minor, &v.version_build, &v.version_string)) |
| 258 | if (parse_version(buffer, &v.version_major, &v.version_minor, &v.version_string)) |
| 252 | 259 | { |
| 253 | | fprintf(stderr, "Error parsing version from '%s'\n", buffer); |
| 260 | fprintf(stderr, "Error parsing version\n"); |
| 254 | 261 | free(buffer); |
| 255 | 262 | return 1; |
| 256 | 263 | } |