Ты тут не умничай, ты пальцем покажи, где здесь неправильный код:
static int_fast8_t xcclk_unsol(char *text)
{
char *p, s[6], *msg;
int i;
struct tm *tm;
time_t t;
/* AT+CLTS */
#if defined(SIM900) || defined(SIM900B)
if (!strncmp(text, "*PSNWID:", 8)) return -1;
if (!strncmp(text, "DST:", 4)) return -1;
if (!strncmp(text, "+CTZV:", 6)) return -1;
if (!strncmp(text, "*PSUTTZ:", 8)) {
writelog(LOG_INFO, MNAME "network time updated");
if (cclk_S==CCLK_IDLE) cclk_S=CCLK_GET;
return -1;
}
#endif
/* parse +CCLK */
if (strncmp(text, "+CCLK:", 6)!=0) return 0; /* не обработано */
if (cclk_S!=CCLK_WAITTIME) return -1; /* время не запрашивалось */
msg=strdup(text);
do {
/* allocate memory */
tm=malloc(sizeof(struct tm));
if (tm==NULL) {
OUT_OF_MEMORY();
free(msg);
return -1;
}
/* parse answer, TODO нечоткий парсер! */
p=strunquote(&text[6]);
if (p==NULL) break;
i=sscanf(p, "%u/%u/%u,%2u:%2u:%2u%5s",
&tm->tm_year, &tm->tm_mon, &tm->tm_mday,
&tm->tm_hour, &tm->tm_min, &tm->tm_sec,
s);
if (i<6) break;
/* difference from UTC (15min. intervals) */
if (i>6) {
if (s[0]!='+' && s[0]!='-') break;
if (sscanf(s, "%d", &i)!=1) break;
}
else i=0;
/* fix year = 70..138 and month */
if (tm->tm_year < 70) tm->tm_year+=100;
tm->tm_mon--;
/* validate time */
if (tm->tm_hour<0 || tm->tm_hour>23) break;
if (tm->tm_min<0 || tm->tm_hour>59) break;
if (tm->tm_sec<0 || tm->tm_sec>60) break;
if (tm->tm_year<70 || tm->tm_year>137) break;
if (tm->tm_mon<0 || tm->tm_mon>11) break;
if (tm->tm_mday<1 || tm->tm_mday>31) break;
/* compute UTC time */
tm->tm_isdst=0; /* no daylight saving! */
t=timegm(tm);
t-=i*15*60L;
/* set new time */
free(msg);
writelog(LOG_INFO, "-- UTC %4.4u-%2.2u-%2.2uT%2.2u:%2.2u:%2.2u",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec );
free(tm);
if (labs(TIME(NULL) - t) > MAX_DIFF_SEC) {
DEBUG0(MNAME "setting new time");
stime_ignored=1;
stime(&t);
stime_ignored=0;
}
return -1;
} while(0);
free(tm);
writelog(LOG_WARN, MNAME "incorrect +CCLK message: %s",
(const char*)(msg==NULL ? "(out of memory)" : msg) );
free(msg);
return -1;
}
А я даже больше скажу. Если в ниже приведённом вместо xmalloc сразу звать malloc -- будет can't generate code в строке, где s->x+=s->c. Или если localtime заменить на malloc. Впечатлает? Логика проф. уровня!
static void *xmalloc(size_t n)
{
return (void*)(unsigned long)malloc(n);
}
static int_fast8_t cclk_unsol(char *text)
{
struct s_1 { int x; char c; } *s;
struct tm *tm = localtime(NULL);
s=xmalloc(sizeof(struct s_1));
s->x+=s->c; // тут ошибка при замене xmalloc-->malloc
if (s->x<10) s->c++;
if (tm->tm_year < 70) tm->tm_year+=100; // тут ошибка если localtime заменить на malloc
tm->tm_mon--;
return tm->tm_year+tm->tm_mon;
}
PS: да, ошибка вызывается в свою очередь такой же ошибкой в malloc ("can't generate code"), если там исправить -- всё ок. Логики никакой, сообщение об ошибке так и отдаёт профессиональностью.
[ZX]