Re[3]: класс Config
От: kov_serg Россия  
Дата: 21.01.19 17:20
Оценка:
Здравствуйте, 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.