#include <string.h> #include <stdlib.h> #include <limits.h> #include "strntol.h" long strntol(const char *str, size_t sz, char **end, int base) { /* Expect that digit representation of LONG_MAX/MIN * not greater than this buffer */ char buf[24]; long ret; const char *beg = str; /* Catch up leading spaces */ for (; beg && sz && *beg == ' '; beg++, sz--) ; if (!sz || sz >= sizeof(buf)) { if (end) *end = (char *)str; return 0; } memcpy(buf, beg, sz); buf[sz] = '\0'; ret = strtol(buf, end, base); if (ret == LONG_MIN || ret == LONG_MAX) return ret; if (end) *end = (char *)str + (*end - buf); return ret; }