static struct value *make_exn_lns_error(struct info *info, struct lns_error *err, const char *text) { struct value *v; if (HAS_ERR(info)) return exn_error(); v = make_exn_value(ref(info), "%s", err->message); if (err->lens != NULL) { char *s = format_info(err->lens->info); exn_printf_line(v, "Lens: %s", s); free(s); } if (err->pos >= 0) { char *pos = format_pos(text, err->pos); size_t line, ofs; calc_line_ofs(text, err->pos, &line, &ofs); exn_printf_line(v, "Error encountered at %d:%d (%d characters into string)", (int) line, (int) ofs, err->pos); if (pos != NULL) exn_printf_line(v, "%s", pos); free(pos); } else { exn_printf_line(v, "Error encountered at path %s", err->path); } return v; }
void print_pos(FILE *out, const char *text, int pos) { char *format = format_pos(text, pos); if (format != NULL) { fputs(format, out); FREE(format); } }