126 lines
3.0 KiB
C++
126 lines
3.0 KiB
C++
//
|
|
// Copyright (C) 2020 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "host/commands/modem_simulator/command_parser.h"
|
|
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
namespace cuttlefish {
|
|
|
|
/**
|
|
* Parses the next string between double quotes
|
|
* returns the string on success and "" on fail
|
|
* updates command_
|
|
*/
|
|
std::string_view CommandParser::GetNextStr() {
|
|
auto fpos = command_.find('\"');
|
|
if (fpos == std::string_view::npos) {
|
|
return {};
|
|
}
|
|
|
|
auto spos = command_.find('\"', fpos + 1);
|
|
if (spos == std::string_view::npos) {
|
|
command_ = command_.substr(fpos + 1);
|
|
return {};
|
|
}
|
|
|
|
auto str = command_.substr(fpos + 1, (spos - fpos - 1));
|
|
command_ = command_.substr(spos + 1);
|
|
SkipComma();
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* Parses the next string before the flag
|
|
* If flag not exists, returns the whole command_
|
|
* updates command_
|
|
*/
|
|
std::string_view CommandParser::GetNextStr(char flag) {
|
|
auto pos = command_.find(flag);
|
|
auto str = command_.substr(0, pos);
|
|
if (pos != std::string_view::npos) pos += 1; // npos + 1 = 0
|
|
command_.remove_prefix(std::min(pos, command_.size()));
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* Parses the next base 10 integer in the AT command and convert to upper case
|
|
* hex string
|
|
* returns the hex string on success and "" on fail
|
|
* updates command_
|
|
*
|
|
* Specially, for AT+CRSM
|
|
*/
|
|
std::string CommandParser::GetNextStrDeciToHex() {
|
|
std::string str;
|
|
int value = GetNextInt();
|
|
if (value == -1) {
|
|
return {};
|
|
} else {
|
|
std::stringstream ss;
|
|
ss << std::hex << std::uppercase << value;
|
|
return ss.str();
|
|
}
|
|
}
|
|
|
|
static int parse_int(const std::string& snumber, int base) {
|
|
if (snumber.empty()) return -1;
|
|
const char* p = snumber.c_str();
|
|
char* p_end = nullptr;
|
|
errno = 0;
|
|
const long lval = std::strtol(p, &p_end, base);
|
|
if (p == p_end) {
|
|
return -1;
|
|
}
|
|
const bool range_error = errno == ERANGE;
|
|
|
|
if (range_error) return -1;
|
|
return lval;
|
|
}
|
|
|
|
/**
|
|
* Parses the next base 10 integer in the AT command
|
|
* returns the value on success and -1 on fail
|
|
* updates command_
|
|
*/
|
|
int CommandParser::GetNextInt() {
|
|
if (command_.empty()) {
|
|
return -1;
|
|
}
|
|
std::string sub(GetNextStr(','));
|
|
|
|
int value = parse_int(sub, 10);
|
|
|
|
return value;
|
|
}
|
|
|
|
/**
|
|
* Parses the next base 16 integer in the AT command
|
|
* returns the value on success and -1 on fail
|
|
* updates command_
|
|
*/
|
|
int CommandParser::GetNextHexInt() {
|
|
if (command_.empty()) {
|
|
return -1;
|
|
}
|
|
|
|
std::string sub(GetNextStr(','));
|
|
int value = parse_int(sub, 16);
|
|
return value;
|
|
}
|
|
|
|
} // namespace cuttlefish
|