+
+/* returns true if register is declaration and not a receipt */
+static int decfile_reg_is_dec(char *line)
+{
+ if (line[0] >= '0' && line[0] <= '9' &&
+ line[1] >= '0' && line[1] <= '9')
+ return 1;
+ if (!strncmp(line, "IRPF ", 8))
+ return 1;
+ if (!strncmp(line, "T9", 2))
+ return 1;
+ return 0;
+}
+
+/* strip a register from its control number and append it to message */
+static int append_stripped_reg_ctrl(struct rnet_message **message, char *line)
+{
+ size_t len;
+ struct rnet_message *msg = *message;
+ if (!decfile_reg_is_dec(line))
+ return 0;
+ len = strlen(line);
+ if (len < 12)
+ return -EINVAL;
+ if (msg->alen - msg->len < len) {
+ if (rnet_message_expand(message, MAX(msg->len, len)))
+ return -ENOMEM;
+ msg = *message;
+ }
+ memcpy(&msg->buffer[msg->len], line, len - 12);
+ msg->buffer[msg->len + len - 12] = '\r';
+ msg->buffer[msg->len + len - 11] = '\n';
+ msg->len += len - 10;
+ return 0;
+}
+
+static int decfile_parse_file(struct rnet_decfile *decfile)
+{
+ int i;
+ int r;
+ for (i = 0; i < decfile->lines_len; i++) {
+ r = append_stripped_reg_ctrl(&decfile->message,
+ decfile->lines[i]);
+ if (r)
+ return r;
+ }
+ return 0;
+}
+
+struct rnet_message * rnet_decfile_get_file(struct rnet_decfile *decfile)
+{
+ return decfile->message;
+}