100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/system/reference-ril/at_tok.c 200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project 400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License"); 67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License. 77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at 800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** http://www.apache.org/licenses/LICENSE-2.0 1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software 127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS, 137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and 1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License. 1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "at_tok.h" 1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h> 2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h> 2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h> 2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Starts tokenizing an AT response string 2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * returns -1 if this is not a valid response string, 0 on success. 2600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * updates *p_cur with current position 2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectint at_tok_start(char **p_cur) 2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 3000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) { 3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // skip prefix 3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // consume "^[^:]:" 3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *p_cur = strchr(*p_cur, ':'); 3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) { 4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (*p_cur)++; 4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void skipWhiteSpace(char **p_cur) 4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) return; 5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (**p_cur != '\0' && isspace(**p_cur)) { 5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (*p_cur)++; 5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void skipNextComma(char **p_cur) 5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) return; 6000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (**p_cur != '\0' && **p_cur != ',') { 6200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (*p_cur)++; 6300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (**p_cur == ',') { 6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (*p_cur)++; 677f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } 6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char * nextTok(char **p_cur) 7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *ret = NULL; 7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project skipWhiteSpace(p_cur); 7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) { 7700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = NULL; 7800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (**p_cur == '"') { 7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (*p_cur)++; 8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = strsep(p_cur, "\""); 8100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project skipNextComma(p_cur); 8200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = strsep(p_cur, ","); 8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Parses the next integer in the AT response line and places it in *p_out 9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * returns 0 on success and -1 on fail 9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * updates *p_cur 9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * "base" is the same as the base param in strtol 9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 9600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int at_tok_nextint_base(char **p_cur, int *p_out, int base, int uns) 9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *ret; 1007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) { 10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 10400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = nextTok(p_cur); 10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == NULL) { 10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project long l; 11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *end; 11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (uns) 11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project l = strtoul(ret, &end, base); 11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project else 11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project l = strtol(ret, &end, base); 11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *p_out = (int)l; 11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (end == ret) { 12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 1297f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Parses the next base 10 integer in the AT response line 13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * and places it in *p_out 13100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * returns 0 on success and -1 on fail 13200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * updates *p_cur 13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectint at_tok_nextint(char **p_cur, int *p_out) 13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 13600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return at_tok_nextint_base(p_cur, p_out, 10, 0); 13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 13800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 13900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 1407f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Parses the next base 16 integer in the AT response line 14100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * and places it in *p_out 14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * returns 0 on success and -1 on fail 14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * updates *p_cur 14400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 14500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectint at_tok_nexthexint(char **p_cur, int *p_out) 14600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return at_tok_nextint_base(p_cur, p_out, 16, 1); 14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectint at_tok_nextbool(char **p_cur, char *p_out) 15100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 15200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 15300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int result; 15400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = at_tok_nextint(p_cur, &result); 15600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 15800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 15900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 16000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // booleans should be 0 or 1 16200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!(result == 0 || result == 1)) { 16300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 16400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 16500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (p_out != NULL) { 16700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *p_out = (char)result; 16800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 16900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectint at_tok_nextstr(char **p_cur, char **p_out) 17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (*p_cur == NULL) { 17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *p_out = nextTok(p_cur); 18000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** returns 1 on "has more tokens" and 0 if no */ 18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectint at_tok_hasmore(char **p_cur) 18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ! (*p_cur == NULL || **p_cur == '\0'); 18800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 18900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 191