| /* |
| * Copyright (C) 2017 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 "chre/util/nanoapp/debug.h" |
| |
| #include <cctype> |
| #include <cstdio> |
| |
| #ifdef CHRE_NANOAPP_INTERNAL |
| #include "chre/platform/log.h" |
| #else |
| #define LOG_TAG "[DEBUG]" |
| #include "chre/util/nanoapp/log.h" |
| #endif |
| |
| namespace chre { |
| |
| void logBuffer(const uint8_t *buffer, size_t bufferSize) { |
| char line[32]; |
| char lineChars[32]; |
| size_t offset = 0; |
| size_t offsetChars = 0; |
| |
| if (bufferSize > 128) { |
| LOGD("Dumping first 128 bytes of buffer @ %p, size %zu", buffer, |
| bufferSize); |
| bufferSize = 128; |
| } else { |
| LOGD("Dumping buffer @ %p, size %zu", buffer, bufferSize); |
| } |
| |
| for (size_t i = 1; i <= bufferSize; i++) { |
| // This ignores potential errors returned by snprintf. This is a relatively |
| // simple case and the deliberate decision to ignore them has been made. |
| offset += static_cast<size_t>( |
| snprintf(&line[offset], sizeof(line) - offset, "%02x ", buffer[i - 1])); |
| offsetChars += static_cast<size_t>( |
| snprintf(&lineChars[offsetChars], sizeof(lineChars) - offsetChars, "%c", |
| (isprint(buffer[i - 1])) ? buffer[i - 1] : '.')); |
| if ((i % 8) == 0) { |
| LOGD(" %s\t%s", line, lineChars); |
| offset = 0; |
| offsetChars = 0; |
| } else if ((i % 4) == 0) { |
| offset += static_cast<size_t>( |
| snprintf(&line[offset], sizeof(line) - offset, " ")); |
| } |
| } |
| |
| if (offset > 0) { |
| char tabs[8]; |
| char *pos = tabs; |
| while (offset < 28) { |
| *pos++ = '\t'; |
| offset += 8; |
| } |
| *pos = '\0'; |
| LOGD(" %s%s%s", line, tabs, lineChars); |
| } |
| } |
| |
| } // namespace chre |