Здравствуйте, vadfromnu, Вы писали:
V>В функции прикопан баг, который когда-нибудь бахнет.(Я подрывался) strtol выставит errno при ошибке, но не сбросит его при успехе. Если errno уже выставлен кем-то ранее, то вместо 0 будет возвращаться defval.
Действительно
https://github.com/gcc-mirror/gcc/blob/master/libiberty/strtol.c
Тогда так:
#include <stdlib.h>
int getint(const char *p,int defval) {
struct L{
static int is_space(char c) { return c>0 && c<=32; }
static int is_digit(char c) { return c>='0' && c<='9'; }
static int dec(char c) { return (c>='0' && c<='9') ? c-'0' : -1; }
};
int digit,val,t,minus=0;
while(L::is_space(*p)) p++;
if (*p=='-') { p++; minus=1; }
if (!L::is_digit(*p)) return defval;
for(val=0;(digit=L::dec(*p))>=0;p++){
t=val*10+digit;
if (t<val && t!=-t) return defval; // overflow
val=t;
}
if (val && val==-val && !minus) return defval; // special case
if (minus) val=-val;
while(L::is_space(*p)) p++;
return *p ? defval : val;
}
int getenv(const char* name,int defval) {
char *text=getenv(name);
if (!text) return defval;
return getint(text,defval);
}