João Diogo Ferreira devilj@outlook.pt writes:
+static const struct geoinfo_t *get_geoinfoptr_by_str(const WCHAR *str, GEOTYPE geotype) +{
- int num;
- if (!str)
return NULL;- switch (geotype)
- {
case GEO_ISO2:for (int i = 0; i < ARRAY_SIZE(geoinfodata); i++)if (!(strcmpW(geoinfodata[i].iso2W, str))) return &geoinfodata[i];break;case GEO_ISO_UN_NUMBER:if (!(num = atoiW(str))) return NULL;for (int i = 0; i < ARRAY_SIZE(geoinfodata); i++)if (num == geoinfodata[i].uncode)return geoinfodata[i].kind == LOCATION_REGION ? &geoinfodata[i] : NULL;break;- }
- return NULL;
+}
+/******************************************************************************
get_geoinfoptr_by_name
- Parse and fix a geoname and return a pointer
- to the matching geoinfo struct.
- */
+static inline const struct geoinfo_t *get_geoinfoptr_by_name(const WCHAR *name) +{
- WCHAR buffer[3];
- int good = 0, len = 0;
- if (!name)
return NULL;- /* Check if str is a two-letter country code (and make it uppercase) */
- for (int i = 0; i <= 2; i++)
if ((name[i] <= 127 && isalphaW(name[i]))){buffer[i] = toupperW(name[i]);good++;}else{if (!name[i]){buffer[i] = 0;len = i;}break;}- if (good == 2 && len == 2)
return get_geoinfoptr_by_str(buffer, GEO_ISO2);- /* Now check if it's a three-digit code. */
- good = 0;
- len = 0;
- for (int i = 0; i <= 3; i++)
if (isdigitW(name[i]))good++;else{if (!name[i])len = i;break;}- if (good == 3 && len == 3)
return get_geoinfoptr_by_str(name, GEO_ISO_UN_NUMBER);- return NULL;
+}
Please avoid C99 variable declarations in loops. Also this looks very complicated for such a simple lookup.