aboutsummaryrefslogtreecommitdiffstats
path: root/longbow/src/LongBow/longBow_Debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'longbow/src/LongBow/longBow_Debug.c')
-rwxr-xr-xlongbow/src/LongBow/longBow_Debug.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/longbow/src/LongBow/longBow_Debug.c b/longbow/src/LongBow/longBow_Debug.c
new file mode 100755
index 00000000..6a72603f
--- /dev/null
+++ b/longbow/src/LongBow/longBow_Debug.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * 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 <config.h>
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <LongBow/longBow_Debug.h>
+#include <LongBow/Reporting/longBowReport_Runtime.h>
+
+/** @cond */
+struct longbow_debug_criteria {
+ bool enabled;
+};
+/** @endcond */
+
+static struct longbow_debug_criteria LongBowDebug_StaticCriteria = {
+ .enabled = true
+};
+
+static LongBowDebugCriteria *LongBowDebug_CurrentCriteria = &LongBowDebug_StaticCriteria;
+
+LongBowDebugCriteria *
+longBowDebug_CurrentCriteria(void)
+{
+ return LongBowDebug_CurrentCriteria;
+}
+
+static void
+_longBowDebug_MemoryDumpLine(const char *memory, size_t offset, size_t length)
+{
+ int bytesPerLine = 16;
+ char accumulator[bytesPerLine + 1];
+ memset(accumulator, ' ', bytesPerLine);
+ accumulator[bytesPerLine] = 0;
+
+ printf("%5zd: ", offset);
+
+ for (size_t i = 0; i < bytesPerLine; i++) {
+ if (offset + i >= length) {
+ printf(" ");
+ accumulator[i] = ' ';
+ } else {
+ char c = memory[offset + i];
+ printf("%02x ", c & 0xFF);
+ if (isprint(c)) {
+ accumulator[i] = c;
+ } else {
+ accumulator[i] = '.';
+ }
+ }
+ }
+ printf(" %s\n", accumulator);
+}
+
+void
+longBowDebug_MemoryDump(const char *memory, size_t length)
+{
+ size_t bytesPerLine = 16;
+
+ for (size_t offset = 0; offset < length; offset += bytesPerLine) {
+ _longBowDebug_MemoryDumpLine(memory, offset, length);
+ }
+}
+
+void
+longBowDebug_Message(LongBowDebugCriteria *criteria, const LongBowLocation *location, const char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+
+ char *message;
+ int status = vasprintf(&message, format, ap);
+ va_end(ap);
+ if (status != -1) {
+#if 1
+ char *locationString = longBowLocation_ToString(location);
+ longBowReportRuntime_Message("%s %s\r\n", locationString, message);
+
+ free(locationString);
+#else
+ longBowReportRuntime_Message(location, message);
+#endif
+ free(message);
+ }
+}
+
+ssize_t
+longBowDebug_WriteFile(const char *fileName, const char *data, size_t length)
+{
+ ssize_t result = 0;
+
+ int fd = open(fileName, O_CREAT | O_TRUNC | O_WRONLY, 0600);
+ if (fd == -1) {
+ perror(fileName);
+ } else {
+ result = write(fd, data, length);
+ }
+ close(fd);
+ return result;
+}
+
+ssize_t
+longBowDebug_ReadFile(const char *fileName, char **data)
+{
+ ssize_t result = -1;
+ struct stat statbuf;
+ char *buffer;
+
+ int fd = open(fileName, O_RDONLY);
+ if (fd == -1) {
+ perror(fileName);
+ } else {
+ if (fstat(fd, &statbuf) != -1) {
+ buffer = malloc((unsigned long) statbuf.st_size + 1);
+ result = read(fd, buffer, (unsigned long) statbuf.st_size);
+ buffer[statbuf.st_size] = 0;
+ *data = buffer;
+ }
+ }
+ return result;
+}