//****************************************************************************** /// \brief Read command on a single line /// \return #mxt_rc static int readline(struct mxt_device *mxt, int fd, struct mxt_buffer *linebuf) { int ret; int n; int readcount; char c; mxt_buf_reset(linebuf); for (n = 1; n < MAX_LINESIZE; n++) { /* read 1 character at a time */ readcount = read(fd, &c, 1); if (readcount == 1) { if ((c == '\n') || (c == '\r')) break; ret = mxt_buf_add(linebuf, c); if (ret) return ret; } else if (readcount == 0) { if (n == 1) return MXT_SUCCESS; else break; } else { mxt_err(mxt->ctx, "Read error: %s (%d)", strerror(errno), errno); return mxt_errno_to_rc(errno); } } /* null-terminate the buffer */ ret = mxt_buf_add(linebuf, '\0'); if (ret) return ret; return MXT_SUCCESS; }
//****************************************************************************** /// \brief Read hex encoded data from file /// \return #mxt_rc static int mxt_t68_load_file(struct t68_ctx *ctx) { int ret; uint8_t value = 0; FILE *fp; bool file_read = false; char buf[256]; uint16_t hexcount; int c; /* open file */ fp = fopen(ctx->filename, "r"); if (fp == NULL) { mxt_err(ctx->lc, "Error opening %s", ctx->filename); return mxt_errno_to_rc(errno); } ret = mxt_buf_init(&ctx->buf); if (ret) { mxt_err(ctx->lc, "Error initialising buffer"); goto close; } while (!file_read) { /* Read next value from file */ c = getc(fp); if (c == EOF) { break; } /* skip spaces, newlines, commas*/ else if (c == 0x20 || c == '\r' || c == '\n' || c == ',') { continue; } /* Ignore comment lines */ else if (c == '[') { // Grab comment key if (fscanf(fp, "%255[^]]", buf) != 1) { ret = MXT_ERROR_FILE_FORMAT; goto fail; } mxt_verb(ctx->lc, "[%s]", buf); if (!strncasecmp(buf, "datatype=", 9)) { if (sscanf(buf + 9, "%d", &c) != 1) { mxt_warn(ctx->lc, "Unable to parse datatype"); } else { ctx->t68_datatype = c; mxt_info(ctx->lc, "DATATYPE set to %u by file", ctx->t68_datatype); } } // Read until end of line while (c != '\n') { c = getc(fp); } continue; } /* A value looks like "0xABu," */ else if (c == '0') { if (fscanf(fp, "x%2su", (char *)&buf) != 1) { mxt_err(ctx->lc, "Parse error"); ret = MXT_ERROR_FILE_FORMAT; goto fail; } ret = mxt_convert_hex(buf, &value, &hexcount, 3); if (ret) goto fail; ret = mxt_buf_add(&ctx->buf, value); if (ret) goto fail; } else { mxt_err(ctx->lc, "Unexpected character \"%c\"", c); ret = MXT_ERROR_FILE_FORMAT; goto fail; } } mxt_info(ctx->lc, "Loaded file %s, %zu bytes", ctx->filename, ctx->buf.size); return MXT_SUCCESS; fail: mxt_buf_free(&ctx->buf); close: fclose(fp); return ret; }