bool is_palindrome(unsigned N){ unsigned len = digit_length(N, 10); unsigned lower = 10; unsigned upper = powi(10, len); unsigned low_digit, high_digit; for (unsigned i = 0; i < len / 2; i += 1){ low_digit = (10 * (N % lower)) / lower; high_digit = (10 * (N % upper)) / upper; if (low_digit != high_digit){ return false; } lower *= 10; upper /= 10; } return true; }
void cmd_resp(int8 retval, int8 idval) { uint8 cnt, len, idx = 0; DBGA("ret(%d), id(%d)", retval, idval); cnt = (atci.tcmd.arg1[0] != 0) + (atci.tcmd.arg2[0] != 0) + (atci.tcmd.arg3[0] != 0) + (atci.tcmd.arg4[0] != 0) + (atci.tcmd.arg5[0] != 0) + (atci.tcmd.arg6[0] != 0); #define MAKE_RESP(item_v, size_v) \ { \ if(item_v[0] != 0) { \ termbuf[idx++] = ','; \ len = strlen((char*)item_v); \ if(len > size_v-1) CRITICAL_ERR("resp buf overflow"); \ memcpy((char*)&termbuf[idx], (char*)item_v, len); \ idx += len; \ cnt--; \ } else if(cnt) { \ termbuf[idx++] = ','; \ } \ }//printf("MakeResp-(%s)(%d)", item_v, len); termbuf[idx++] = '['; if(retval >= RET_OK) { if(retval == RET_OK) termbuf[idx++] = 'S'; else if(retval == RET_OK_DUMP) CRITICAL_ERR("use cmd_resp_dump for dump"); else if(retval == RET_ASYNC) termbuf[idx++] = 'W'; else if(retval == RET_RECV) termbuf[idx++] = 'R'; else CRITICAL_ERRA("undefined return value (%d)", retval); if(idval != VAL_NONE) { termbuf[idx++] = ','; //snprintf((char*)tbuf, TBUF_SIZE, "%d", idval); //len = strlen((char*)tbuf); //strcpy((char*)&termbuf[idx], (char*)tbuf); sprintf((char*)&termbuf[idx], "%d", idval); len = digit_length(idval, 10); idx += len; } else if(cnt) termbuf[idx++] = ','; } else { termbuf[idx++] = 'F'; termbuf[idx++] = ','; if(idval != VAL_NONE) { //snprintf((char*)tbuf, TBUF_SIZE, "%d", idval); //len = strlen((char*)tbuf); //strcpy((char*)&termbuf[idx], (char*)tbuf); sprintf((char*)&termbuf[idx], "%d", idval); len = digit_length(idval, 10); idx += len; } termbuf[idx++] = ','; #define CMD_SWT_DEF(errval_v) termbuf[idx++] = errval_v; break; #define CMD_SWT_EXT(base_v, errval_v) termbuf[idx++]=base_v;termbuf[idx++] = errval_v; break; switch(retval) { case RET_UNSPECIFIED: CMD_SWT_DEF(ERRVAL_UNSPECIFIED); case RET_WRONG_OP: CMD_SWT_DEF(ERRVAL_WRONG_OP); case RET_WRONG_SIGN: CMD_SWT_DEF(ERRVAL_WRONG_SIGN); case RET_WRONG_ARG: CMD_SWT_DEF(ERRVAL_WRONG_ARG); case RET_RANGE_OUT: CMD_SWT_DEF(ERRVAL_RANGE_OUT); case RET_DISABLED: CMD_SWT_DEF(ERRVAL_DISABLED); case RET_NOT_ALLOWED: CMD_SWT_DEF(ERRVAL_NOT_ALLOWED); case RET_BUSY: CMD_SWT_DEF(ERRVAL_BUSY); case RET_TIMEOUT: CMD_SWT_DEF(ERRVAL_TIMEOUT); case RET_NO_SOCK: CMD_SWT_EXT('1', ERRVAL_NO_SOCK); case RET_SOCK_CLS: CMD_SWT_EXT('1', ERRVAL_SOCK_CLS); case RET_USING_PORT: CMD_SWT_EXT('1', ERRVAL_USING_PORT); case RET_NOT_CONN: CMD_SWT_EXT('1', ERRVAL_NOT_CONN); case RET_WRONG_ADDR: CMD_SWT_EXT('1', ERRVAL_WRONG_ADDR); case RET_NO_DATA: CMD_SWT_EXT('1', ERRVAL_NO_DATA); case RET_NO_FREEMEM: CMD_SWT_EXT('2', ERRVAL_NO_FREEMEM); default:termbuf[idx++] = '0';break; } } MAKE_RESP(atci.tcmd.arg1, ARG_1_SIZE); MAKE_RESP(atci.tcmd.arg2, ARG_2_SIZE); MAKE_RESP(atci.tcmd.arg3, ARG_3_SIZE); MAKE_RESP(atci.tcmd.arg4, ARG_4_SIZE); MAKE_RESP(atci.tcmd.arg5, ARG_5_SIZE); MAKE_RESP(atci.tcmd.arg6, ARG_6_SIZE); termbuf[idx++] = ']'; termbuf[idx++] = 0; printf("%s\r\n", termbuf); // print basic response }