ev-layer.c
来自「LINUX 2.6.17.4的源码」· C语言 代码 · 共 1,986 行 · 第 1/4 页
C
1,986 行
/* * Stuff used by all variants of the driver * * Copyright (c) 2001 by Stefan Eilers, * Hansjoerg Lipp <hjlipp@web.de>, * Tilman Schmidt <tilman@imap.cc>. * * ===================================================================== * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * ===================================================================== */#include "gigaset.h"/* ========================================================== *//* bit masks for pending commands */#define PC_DIAL 0x001#define PC_HUP 0x002#define PC_INIT 0x004#define PC_DLE0 0x008#define PC_DLE1 0x010#define PC_SHUTDOWN 0x020#define PC_ACCEPT 0x040#define PC_CID 0x080#define PC_NOCID 0x100#define PC_CIDMODE 0x200#define PC_UMMODE 0x400/* types of modem responses */#define RT_NOTHING 0#define RT_ZSAU 1#define RT_RING 2#define RT_NUMBER 3#define RT_STRING 4#define RT_HEX 5#define RT_ZCAU 6/* Possible ASCII responses */#define RSP_OK 0//#define RSP_BUSY 1//#define RSP_CONNECT 2#define RSP_ZGCI 3#define RSP_RING 4#define RSP_ZAOC 5#define RSP_ZCSTR 6#define RSP_ZCFGT 7#define RSP_ZCFG 8#define RSP_ZCCR 9#define RSP_EMPTY 10#define RSP_ZLOG 11#define RSP_ZCAU 12#define RSP_ZMWI 13#define RSP_ZABINFO 14#define RSP_ZSMLSTCHG 15#define RSP_VAR 100#define RSP_ZSAU (RSP_VAR + VAR_ZSAU)#define RSP_ZDLE (RSP_VAR + VAR_ZDLE)#define RSP_ZVLS (RSP_VAR + VAR_ZVLS)#define RSP_ZCTP (RSP_VAR + VAR_ZCTP)#define RSP_STR (RSP_VAR + VAR_NUM)#define RSP_NMBR (RSP_STR + STR_NMBR)#define RSP_ZCPN (RSP_STR + STR_ZCPN)#define RSP_ZCON (RSP_STR + STR_ZCON)#define RSP_ZBC (RSP_STR + STR_ZBC)#define RSP_ZHLC (RSP_STR + STR_ZHLC)#define RSP_ERROR -1 /* ERROR */#define RSP_WRONG_CID -2 /* unknown cid in cmd *///#define RSP_EMPTY -3#define RSP_UNKNOWN -4 /* unknown response */#define RSP_FAIL -5 /* internal error */#define RSP_INVAL -6 /* invalid response */#define RSP_NONE -19#define RSP_STRING -20#define RSP_NULL -21//#define RSP_RETRYFAIL -22//#define RSP_RETRY -23//#define RSP_SKIP -24#define RSP_INIT -27#define RSP_ANY -26#define RSP_LAST -28#define RSP_NODEV -9/* actions for process_response */#define ACT_NOTHING 0#define ACT_SETDLE1 1#define ACT_SETDLE0 2#define ACT_FAILINIT 3#define ACT_HUPMODEM 4#define ACT_CONFIGMODE 5#define ACT_INIT 6#define ACT_DLE0 7#define ACT_DLE1 8#define ACT_FAILDLE0 9#define ACT_FAILDLE1 10#define ACT_RING 11#define ACT_CID 12#define ACT_FAILCID 13#define ACT_SDOWN 14#define ACT_FAILSDOWN 15#define ACT_DEBUG 16#define ACT_WARN 17#define ACT_DIALING 18#define ACT_ABORTDIAL 19#define ACT_DISCONNECT 20#define ACT_CONNECT 21#define ACT_REMOTEREJECT 22#define ACT_CONNTIMEOUT 23#define ACT_REMOTEHUP 24#define ACT_ABORTHUP 25#define ACT_ICALL 26#define ACT_ACCEPTED 27#define ACT_ABORTACCEPT 28#define ACT_TIMEOUT 29#define ACT_GETSTRING 30#define ACT_SETVER 31#define ACT_FAILVER 32#define ACT_GOTVER 33#define ACT_TEST 34#define ACT_ERROR 35#define ACT_ABORTCID 36#define ACT_ZCAU 37#define ACT_NOTIFY_BC_DOWN 38#define ACT_NOTIFY_BC_UP 39#define ACT_DIAL 40#define ACT_ACCEPT 41#define ACT_PROTO_L2 42#define ACT_HUP 43#define ACT_IF_LOCK 44#define ACT_START 45#define ACT_STOP 46#define ACT_FAKEDLE0 47#define ACT_FAKEHUP 48#define ACT_FAKESDOWN 49#define ACT_SHUTDOWN 50#define ACT_PROC_CIDMODE 51#define ACT_UMODESET 52#define ACT_FAILUMODE 53#define ACT_CMODESET 54#define ACT_FAILCMODE 55#define ACT_IF_VER 56#define ACT_CMD 100/* at command sequences */#define SEQ_NONE 0#define SEQ_INIT 100#define SEQ_DLE0 200#define SEQ_DLE1 250#define SEQ_CID 300#define SEQ_NOCID 350#define SEQ_HUP 400#define SEQ_DIAL 600#define SEQ_ACCEPT 720#define SEQ_SHUTDOWN 500#define SEQ_CIDMODE 10#define SEQ_UMMODE 11// 100: init, 200: dle0, 250:dle1, 300: get cid (dial), 350: "hup" (no cid), 400: hup, 500: reset, 600: dial, 700: ringstruct reply_t gigaset_tab_nocid_m10x[]= /* with dle mode */{ /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ /* initialize device, set cid mode if possible */ //{RSP_INIT, -1, -1,100, 900, 0, {ACT_TEST}}, //{RSP_ERROR, 900,900, -1, 0, 0, {ACT_FAILINIT}}, //{RSP_OK, 900,900, -1, 100, INIT_TIMEOUT, // {ACT_TIMEOUT}}, {RSP_INIT, -1, -1,SEQ_INIT, 100, INIT_TIMEOUT, {ACT_TIMEOUT}}, /* wait until device is ready */ {EV_TIMEOUT, 100,100, -1, 101, 3, {0}, "Z\r"}, /* device in transparent mode? try to initialize it. */ {RSP_OK, 101,103, -1, 120, 5, {ACT_GETSTRING}, "+GMR\r"}, /* get version */ {EV_TIMEOUT, 101,101, -1, 102, 5, {0}, "Z\r"}, /* timeout => try once again. */ {RSP_ERROR, 101,101, -1, 102, 5, {0}, "Z\r"}, /* error => try once again. */ {EV_TIMEOUT, 102,102, -1, 108, 5, {ACT_SETDLE1}, "^SDLE=0\r"}, /* timeout => try again in DLE mode. */ {RSP_OK, 108,108, -1, 104,-1}, {RSP_ZDLE, 104,104, 0, 103, 5, {0}, "Z\r"}, {EV_TIMEOUT, 104,104, -1, 0, 0, {ACT_FAILINIT}}, {RSP_ERROR, 108,108, -1, 0, 0, {ACT_FAILINIT}}, {EV_TIMEOUT, 108,108, -1, 105, 2, {ACT_SETDLE0, ACT_HUPMODEM, ACT_TIMEOUT}}, /* still timeout => connection in unimodem mode? */ {EV_TIMEOUT, 105,105, -1, 103, 5, {0}, "Z\r"}, {RSP_ERROR, 102,102, -1, 107, 5, {0}, "^GETPRE\r"}, /* ERROR on ATZ => maybe in config mode? */ {RSP_OK, 107,107, -1, 0, 0, {ACT_CONFIGMODE}}, {RSP_ERROR, 107,107, -1, 0, 0, {ACT_FAILINIT}}, {EV_TIMEOUT, 107,107, -1, 0, 0, {ACT_FAILINIT}}, {RSP_ERROR, 103,103, -1, 0, 0, {ACT_FAILINIT}}, {EV_TIMEOUT, 103,103, -1, 0, 0, {ACT_FAILINIT}}, {RSP_STRING, 120,120, -1, 121,-1, {ACT_SETVER}}, {EV_TIMEOUT, 120,121, -1, 0, 0, {ACT_FAILVER, ACT_INIT}}, {RSP_ERROR, 120,121, -1, 0, 0, {ACT_FAILVER, ACT_INIT}}, {RSP_OK, 121,121, -1, 0, 0, {ACT_GOTVER, ACT_INIT}},#if 0 {EV_TIMEOUT, 120,121, -1, 130, 5, {ACT_FAILVER}, "^SGCI=1\r"}, {RSP_ERROR, 120,121, -1, 130, 5, {ACT_FAILVER}, "^SGCI=1\r"}, {RSP_OK, 121,121, -1, 130, 5, {ACT_GOTVER}, "^SGCI=1\r"}, {RSP_OK, 130,130, -1, 0, 0, {ACT_INIT}}, {RSP_ERROR, 130,130, -1, 0, 0, {ACT_FAILINIT}}, {EV_TIMEOUT, 130,130, -1, 0, 0, {ACT_FAILINIT}},#endif /* leave dle mode */ {RSP_INIT, 0, 0,SEQ_DLE0, 201, 5, {0}, "^SDLE=0\r"}, {RSP_OK, 201,201, -1, 202,-1}, //{RSP_ZDLE, 202,202, 0, 202, 0, {ACT_ERROR}},//DELETE {RSP_ZDLE, 202,202, 0, 0, 0, {ACT_DLE0}}, {RSP_NODEV, 200,249, -1, 0, 0, {ACT_FAKEDLE0}}, {RSP_ERROR, 200,249, -1, 0, 0, {ACT_FAILDLE0}}, {EV_TIMEOUT, 200,249, -1, 0, 0, {ACT_FAILDLE0}}, /* enter dle mode */ {RSP_INIT, 0, 0,SEQ_DLE1, 251, 5, {0}, "^SDLE=1\r"}, {RSP_OK, 251,251, -1, 252,-1}, {RSP_ZDLE, 252,252, 1, 0, 0, {ACT_DLE1}}, {RSP_ERROR, 250,299, -1, 0, 0, {ACT_FAILDLE1}}, {EV_TIMEOUT, 250,299, -1, 0, 0, {ACT_FAILDLE1}}, /* incoming call */ {RSP_RING, -1, -1, -1, -1,-1, {ACT_RING}}, /* get cid */ //{RSP_INIT, 0, 0,300, 901, 0, {ACT_TEST}}, //{RSP_ERROR, 901,901, -1, 0, 0, {ACT_FAILCID}}, //{RSP_OK, 901,901, -1, 301, 5, {0}, "^SGCI?\r"}, {RSP_INIT, 0, 0,SEQ_CID, 301, 5, {0}, "^SGCI?\r"}, {RSP_OK, 301,301, -1, 302,-1}, {RSP_ZGCI, 302,302, -1, 0, 0, {ACT_CID}}, {RSP_ERROR, 301,349, -1, 0, 0, {ACT_FAILCID}}, {EV_TIMEOUT, 301,349, -1, 0, 0, {ACT_FAILCID}}, /* enter cid mode */ {RSP_INIT, 0, 0,SEQ_CIDMODE, 150, 5, {0}, "^SGCI=1\r"}, {RSP_OK, 150,150, -1, 0, 0, {ACT_CMODESET}}, {RSP_ERROR, 150,150, -1, 0, 0, {ACT_FAILCMODE}}, {EV_TIMEOUT, 150,150, -1, 0, 0, {ACT_FAILCMODE}}, /* leave cid mode */ //{RSP_INIT, 0, 0,SEQ_UMMODE, 160, 5, {0}, "^SGCI=0\r"}, {RSP_INIT, 0, 0,SEQ_UMMODE, 160, 5, {0}, "Z\r"}, {RSP_OK, 160,160, -1, 0, 0, {ACT_UMODESET}}, {RSP_ERROR, 160,160, -1, 0, 0, {ACT_FAILUMODE}}, {EV_TIMEOUT, 160,160, -1, 0, 0, {ACT_FAILUMODE}}, /* abort getting cid */ {RSP_INIT, 0, 0,SEQ_NOCID, 0, 0, {ACT_ABORTCID}}, /* reset */#if 0 {RSP_INIT, 0, 0,SEQ_SHUTDOWN, 503, 5, {0}, "^SGCI=0\r"}, {RSP_OK, 503,503, -1, 504, 5, {0}, "Z\r"},#endif {RSP_INIT, 0, 0,SEQ_SHUTDOWN, 504, 5, {0}, "Z\r"}, {RSP_OK, 504,504, -1, 0, 0, {ACT_SDOWN}}, {RSP_ERROR, 501,599, -1, 0, 0, {ACT_FAILSDOWN}}, {EV_TIMEOUT, 501,599, -1, 0, 0, {ACT_FAILSDOWN}}, {RSP_NODEV, 501,599, -1, 0, 0, {ACT_FAKESDOWN}}, {EV_PROC_CIDMODE,-1, -1, -1, -1,-1, {ACT_PROC_CIDMODE}}, //FIXME {EV_IF_LOCK, -1, -1, -1, -1,-1, {ACT_IF_LOCK}}, //FIXME {EV_IF_VER, -1, -1, -1, -1,-1, {ACT_IF_VER}}, //FIXME {EV_START, -1, -1, -1, -1,-1, {ACT_START}}, //FIXME {EV_STOP, -1, -1, -1, -1,-1, {ACT_STOP}}, //FIXME {EV_SHUTDOWN, -1, -1, -1, -1,-1, {ACT_SHUTDOWN}}, //FIXME /* misc. */ {RSP_EMPTY, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZCFGT, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZCFG, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZLOG, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZMWI, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZABINFO, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZSMLSTCHG,-1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZCAU, -1, -1, -1, -1,-1, {ACT_ZCAU}}, {RSP_NONE, -1, -1, -1, -1,-1, {ACT_DEBUG}}, {RSP_ANY, -1, -1, -1, -1,-1, {ACT_WARN}}, {RSP_LAST}};// 600: start dialing, 650: dial in progress, 800: connection is up, 700: ring, 400: hup, 750: accepted icallstruct reply_t gigaset_tab_cid_m10x[] = /* for M10x */{ /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ /* dial */ {EV_DIAL, -1, -1, -1, -1,-1, {ACT_DIAL}}, //FIXME {RSP_INIT, 0, 0,SEQ_DIAL, 601, 5, {ACT_CMD+AT_BC}}, {RSP_OK, 601,601, -1, 602, 5, {ACT_CMD+AT_HLC}}, {RSP_NULL, 602,602, -1, 603, 5, {ACT_CMD+AT_PROTO}}, {RSP_OK, 602,602, -1, 603, 5, {ACT_CMD+AT_PROTO}}, {RSP_OK, 603,603, -1, 604, 5, {ACT_CMD+AT_TYPE}}, {RSP_OK, 604,604, -1, 605, 5, {ACT_CMD+AT_MSN}}, {RSP_OK, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}}, {RSP_NULL, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}}, {RSP_OK, 606,606, -1, 607, 5, {0}, "+VLS=17\r"}, /* set "Endgeraetemodus" */ {RSP_OK, 607,607, -1, 608,-1}, //{RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 608, 0, {ACT_ERROR}},//DELETE {RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 609, 5, {ACT_CMD+AT_DIAL}}, {RSP_OK, 609,609, -1, 650, 0, {ACT_DIALING}}, {RSP_ZVLS, 608,608, 17, -1,-1, {ACT_DEBUG}}, {RSP_ZCTP, 609,609, -1, -1,-1, {ACT_DEBUG}}, {RSP_ZCPN, 609,609, -1, -1,-1, {ACT_DEBUG}}, {RSP_ERROR, 601,609, -1, 0, 0, {ACT_ABORTDIAL}}, {EV_TIMEOUT, 601,609, -1, 0, 0, {ACT_ABORTDIAL}}, /* dialing */ {RSP_ZCTP, 650,650, -1, -1,-1, {ACT_DEBUG}}, {RSP_ZCPN, 650,650, -1, -1,-1, {ACT_DEBUG}}, {RSP_ZSAU, 650,650,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, /* some devices don't send this */ /* connection established */ {RSP_ZSAU, 650,650,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, //FIXME -> DLE1 {RSP_ZSAU, 750,750,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, //FIXME -> DLE1 {EV_BC_OPEN, 800,800, -1, 800,-1, {ACT_NOTIFY_BC_UP}}, //FIXME new constate + timeout /* remote hangup */ {RSP_ZSAU, 650,650,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEREJECT}}, {RSP_ZSAU, 750,750,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}}, {RSP_ZSAU, 800,800,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}}, /* hangup */ {EV_HUP, -1, -1, -1, -1,-1, {ACT_HUP}}, //FIXME {RSP_INIT, -1, -1,SEQ_HUP, 401, 5, {0}, "+VLS=0\r"}, /* hang up */ //-1,-1? {RSP_OK, 401,401, -1, 402, 5}, {RSP_ZVLS, 402,402, 0, 403, 5}, {RSP_ZSAU, 403,403,ZSAU_DISCONNECT_REQ, -1,-1, {ACT_DEBUG}}, /* if not remote hup */ //{RSP_ZSAU, 403,403,ZSAU_NULL, 401, 0, {ACT_ERROR}}, //DELETE//FIXME -> DLE0 // should we do this _before_ hanging up for base driver? {RSP_ZSAU, 403,403,ZSAU_NULL, 0, 0, {ACT_DISCONNECT}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver? {RSP_NODEV, 401,403, -1, 0, 0, {ACT_FAKEHUP}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver? {RSP_ERROR, 401,401, -1, 0, 0, {ACT_ABORTHUP}}, {EV_TIMEOUT, 401,403, -1, 0, 0, {ACT_ABORTHUP}}, {EV_BC_CLOSED, 0, 0, -1, 0,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME new constate + timeout /* ring */ {RSP_ZBC, 700,700, -1, -1,-1, {0}}, {RSP_ZHLC, 700,700, -1, -1,-1, {0}}, {RSP_NMBR, 700,700, -1, -1,-1, {0}}, {RSP_ZCPN, 700,700, -1, -1,-1, {0}}, {RSP_ZCTP, 700,700, -1, -1,-1, {0}}, {EV_TIMEOUT, 700,700, -1, 720,720, {ACT_ICALL}}, {EV_BC_CLOSED,720,720, -1, 0,-1, {ACT_NOTIFY_BC_DOWN}}, /*accept icall*/ {EV_ACCEPT, -1, -1, -1, -1,-1, {ACT_ACCEPT}}, //FIXME {RSP_INIT, 720,720,SEQ_ACCEPT, 721, 5, {ACT_CMD+AT_PROTO}}, {RSP_OK, 721,721, -1, 722, 5, {ACT_CMD+AT_ISO}}, {RSP_OK, 722,722, -1, 723, 5, {0}, "+VLS=17\r"}, /* set "Endgeraetemodus" */ {RSP_OK, 723,723, -1, 724, 5, {0}}, {RSP_ZVLS, 724,724, 17, 750,50, {ACT_ACCEPTED}}, {RSP_ERROR, 721,729, -1, 0, 0, {ACT_ABORTACCEPT}}, {EV_TIMEOUT, 721,729, -1, 0, 0, {ACT_ABORTACCEPT}}, {RSP_ZSAU, 700,729,ZSAU_NULL, 0, 0, {ACT_ABORTACCEPT}}, {RSP_ZSAU, 700,729,ZSAU_ACTIVE, 0, 0, {ACT_ABORTACCEPT}}, {RSP_ZSAU, 700,729,ZSAU_DISCONNECT_IND, 0, 0, {ACT_ABORTACCEPT}}, {EV_TIMEOUT, 750,750, -1, 0, 0, {ACT_CONNTIMEOUT}}, /* B channel closed (general case) */ {EV_BC_CLOSED, -1, -1, -1, -1,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME /* misc. */ {EV_PROTO_L2, -1, -1, -1, -1,-1, {ACT_PROTO_L2}}, //FIXME {RSP_ZCON, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZCCR, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZAOC, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZCSTR, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME {RSP_ZCAU, -1, -1, -1, -1,-1, {ACT_ZCAU}}, {RSP_NONE, -1, -1, -1, -1,-1, {ACT_DEBUG}}, {RSP_ANY, -1, -1, -1, -1,-1, {ACT_WARN}}, {RSP_LAST}};#if 0static struct reply_t tab_nocid[]= /* no dle mode */ //FIXME{ /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ {RSP_ANY, -1, -1, -1, -1,-1, ACT_WARN, NULL}, {RSP_LAST,0,0,0,0,0,0}};static struct reply_t tab_cid[] = /* no dle mode */ //FIXME{ /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ {RSP_ANY, -1, -1, -1, -1,-1, ACT_WARN, NULL}, {RSP_LAST,0,0,0,0,0,0}};#endifstatic struct resp_type_t resp_type[]={ /*{"", RSP_EMPTY, RT_NOTHING},*/ {"OK", RSP_OK, RT_NOTHING}, {"ERROR", RSP_ERROR, RT_NOTHING}, {"ZSAU", RSP_ZSAU, RT_ZSAU}, {"ZCAU", RSP_ZCAU, RT_ZCAU}, {"RING", RSP_RING, RT_RING}, {"ZGCI", RSP_ZGCI, RT_NUMBER}, {"ZVLS", RSP_ZVLS, RT_NUMBER}, {"ZCTP", RSP_ZCTP, RT_NUMBER}, {"ZDLE", RSP_ZDLE, RT_NUMBER}, {"ZCFGT", RSP_ZCFGT, RT_NUMBER}, {"ZCCR", RSP_ZCCR, RT_NUMBER}, {"ZMWI", RSP_ZMWI, RT_NUMBER}, {"ZHLC", RSP_ZHLC, RT_STRING}, {"ZBC", RSP_ZBC, RT_STRING}, {"NMBR", RSP_NMBR, RT_STRING}, {"ZCPN", RSP_ZCPN, RT_STRING}, {"ZCON", RSP_ZCON, RT_STRING}, {"ZAOC", RSP_ZAOC, RT_STRING}, {"ZCSTR", RSP_ZCSTR, RT_STRING}, {"ZCFG", RSP_ZCFG, RT_HEX}, {"ZLOG", RSP_ZLOG, RT_NOTHING}, {"ZABINFO", RSP_ZABINFO, RT_NOTHING}, {"ZSMLSTCHG", RSP_ZSMLSTCHG, RT_NOTHING}, {NULL,0,0}};/* * Get integer from char-pointer */static int isdn_getnum(char *p){ int v = -1; gig_dbg(DEBUG_TRANSCMD, "string: %s", p); while (*p >= '0' && *p <= '9') v = ((v < 0) ? 0 : (v * 10)) + (int) ((*p++) - '0'); if (*p) v = -1; /* invalid Character */ return v;}/* * Get integer from char-pointer */static int isdn_gethex(char *p){ int v = 0; int c; gig_dbg(DEBUG_TRANSCMD, "string: %s", p); if (!*p) return -1; do { if (v > (INT_MAX - 15) / 16) return -1; c = *p; if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'a' && c <= 'f') c -= 'a' - 10; else if (c >= 'A' && c <= 'F') c -= 'A' - 10; else return -1; v = v * 16 + c; } while (*++p); return v;}/* retrieve CID from parsed response * returns 0 if no CID, -1 if invalid CID, or CID value 1..65535 */static int cid_of_response(char *s){ int cid; if (s[-1] != ';') return 0; /* no CID separator */ cid = isdn_getnum(s);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?