[СИ] Как работать с off_t числами.
Язык СИ
ОС UNIX
Не знаю штатных средств работы с off_t числами, надежных.
Ниже две самодельных функции для преобразования
off_t -> строка и обратно.
Вопрос-1.
Существуют ли надежные штатные средства?
Вопрос-2.
В функции my_ato_off() (см. ниже) не знаю, как правильно
отловить выход из диапазона. Там есть закомментированная
строка, которая предположительно может отловить ошибку.
И при опробовании да, отлавливает. Но всегда ли, при
любой ли строке символов?
Кто знает прошу ответить.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//   gcc forum_off_t.c -o forum_off_t.cgi
//   ./forum_off_t.cgi
//------------------- my_ato_off ---------------------
off_t
my_ato_off(const char *buf)
{
    off_t  s, sm;
    const char *p1;
    int sig=0;
    p1=buf;
    while(*p1==' ') p1++;
    if(*p1=='-'){ sig=1; p1++;}
    s=0;
    while(*p1>='0' && *p1<='9'){
        sm=(s*10)+((*p1)-'0');
        //if(sm<s) return(-1);
        s=sm;
        p1++;
    }
    if(sig>0) s=-s;
    return(s);
}
//----------------- my_off_toa -------------------------
int my_off_toa(off_t  d, char *str, int Sstr)
{
    char *p1, buf[30];
    int  k, sig=0;
    p1=buf;
    if(d<0) sig=1;
    if(sig==0) do{ k=d%10; *p1++=('0'+k);} while((d=d/10)!=0);
    else do{ k=d%10; *p1++=('0'-k);} while((d=d/10)!=0);
    if((p1-buf)>=(Sstr-sig)){ *str=0; return(-1);}
    if(sig>0) *str++ = '-';
    while(p1>buf){ *str++ = *(--p1);}
    *str=0;
    return(0);
}
//--------------- main ---------------
int main()
{
    char *p, buf[100], str[21];
    off_t  s;
    int    k;
    printf("\n---------------------------------------\n");
    while(1){
        p=fgets(buf, sizeof(buf), stdin);
        if(p==NULL){
            printf("p==NULL\n");
            printf("\n---------------------------------------\n");
            continue;
        }
        printf("1. buf=%s\n", buf);
        s=my_ato_off(buf);
        printf("2. s  =%lld\n", s);
        k=my_off_toa(s, str, sizeof(str));
        printf("3. str=%s; (%d)\n", str, k);
        k=atoi(buf);
        printf("4. k  =%d\n", k);
        printf("\n---------------------------------------\n");
    }
    exit(0);
}


