/* Useful for printing annotations as comments. Expects that * the annotation is a BrickAnnote. */ void Printer::print_annote(Annote *annote) { start_comment(); IdString name = annote->get_name(); if (name != k_comment) fprintf(out, "[%s", name.chars()); if (is_kind_of<BrickAnnote>(annote)) { BrickAnnote *an = (BrickAnnote *)(annote); char *separator = ": "; for (Iter<SuifBrick*> iter = an->get_brick_iterator(); iter.is_valid(); iter.next()) { fputs(separator, out); separator = ", "; SuifBrick *brick = iter.current(); if (is_a<IntegerBrick>(brick)) { Integer i = ((IntegerBrick*)iter.current())->get_value(); if (i.is_c_string_int()) fputs(i.chars(), out); else fprintf(out, "%ld", i.c_long()); } else if (is_a<StringBrick>(brick)) { putc('"', out); for (const char *p = ((StringBrick*)iter.current())->get_value().c_str(); *p != '\0'; ++p) { if (*p == '"' || *p == '\\') putc('\\', out); putc(*p, out); } putc('"', out); } else { claim(is_a<SuifObjectBrick>(brick)); SuifObject *so = ((SuifObjectBrick*)brick)->get_object(); if (is_kind_of<Type>(so)) fprint(out, (TypeId)so); else { const char *kind = so ? get_class_name(so) : "NULL"; fprintf(out, "<<<%s object>>>", kind); } } } } else { claim(is_kind_of<GeneralAnnote>(annote), "Unexpected kind of Annote"); } if (name != k_comment) fputs("]", out); fputs("\n", out); }
static bool end_vernac_command (string s, int i) { int n= N(s); if (!(i<n && s[i] == '.')) return false; i++; while (i<n) { if (is_spacing (s[i])) i++; else if (start_comment (s, i)) parse_comment (s, i); else break; } return i >= n || s[i] == '\n'; }
static array<string> split_command (string s) { int start= 0, i=0, n= N(s); array<string> r; while (i<n) { if (s[i] == '.' && i+1<n && is_spacing (s[i+1])) { r << s(start, ++i); while (i<n && is_spacing (s[i])) i++; start= i; } else if (start_comment (s, i)) parse_comment (s, i); else i++; } if (start < n) r << s(start, n); return r; }
static tree parse_subcommand (string s, bool wrap= false) { int start= 0, i= 0, n= N(s); tree r= ""; while (i<n) { if (start_comment (s, i)) { append_commands (r, indent_subcommand (from_verbatim (s(start, i), wrap))); if (start_coqdoc (s, i)) append_commands (r, parse_coqdoc (s, i)); else append_commands (r, parse_comment (s, i)); start= i; } else i++; } if (start < n) append_commands (r, indent_subcommand (from_verbatim (s(start, i), wrap))); if ((is_concat (r) || is_document (r)) && N(r) == 1) r= r[0]; return r; }
static tree parse_coqdoc_hide_show (string s, int &i) { tree beg= parse_coqdoc_hide_show_comment (s, i); int cnt= 1, n= N(s), start= i, stop= i; while (i<n && cnt > 0) { if (start_comment (s, i)) { if (is_hide_or_show (s, i)) { stop= i; tree tmp= parse_coqdoc_hide_show_comment (s, i); if (N(tmp) != 1); else if (tmp == beg) cnt++; else if (is_func (tmp, END, 1) && tmp[0] == beg[0]) cnt--; } else parse_comment (s, i); } else i++; } tree body; if (cnt == 0) body= parse_raw_coq (s(start, stop)); else body= parse_raw_coq (s(start, n)); string lbl, msg; if (as_string (beg[0]) == "hide") { lbl= "folded"; msg= "(* hidden *)"; } else { lbl= "unfolded"; msg= "(* shown *)"; } return compound (lbl, msg, body); }
static tree parse_raw_coq (string s) { tree doc (DOCUMENT), proof (DOCUMENT); tree *r= &doc; int i= 0, startcmd= 0, n= N(s), indent_level=-1; bool in_cmd= false; while (i<n) { if (!in_cmd && start_comment (s, i)) { if (start_coqdoc (s, i)) *r << parse_coqdoc (s, i); else if (is_hide_or_show (s, i)) *r << parse_coqdoc_hide_show (s, i); else *r << parse_comment (s, i); } else if (start_comment (s, i)) { if (is_hide_or_show (s, i)) *r << parse_coqdoc_hide_show (s, i); else parse_comment (s, i); } else if (end_vernac_command (s, i)) { string body= s (startcmd, ++i); if (is_enunciation (body)) { *r << parse_enunciation (body); r= &proof; } else if (is_definition (body)) { *r << parse_enunciation (body); } else { tree tmp= parse_vernac_command (body); if (begin_proof (tmp) && end_proof (tmp)) { proof << parse_vernac_proof (body); doc << format_proof (proof); proof= tree (DOCUMENT); r= &doc; } else if (r == &proof) { if (end_proof (tmp)) { proof << tmp; doc << format_proof (proof); proof= tree (DOCUMENT); r= &doc; } else if (begin_proof (tmp)) { r= &proof; *r << parse_vernac_proof (body); } else *r << tmp; } else if (begin_proof (tmp)) { r= &proof; *r << parse_vernac_proof (body); } else *r << tmp; } in_cmd= false; } else if (!in_cmd && s[i] == '\n') { i++; int tmp= parse_indent (s, i); if (tmp >= 0 && tmp != indent_level) { *r << compound ("coq-indent", as_string (tmp)); indent_level= tmp; } else if (i < n && s[i] == '\n') { *r << ""; while (i+1 < n && s[i+1] == '\n') i++; } } else { if (!in_cmd && !is_blank (s[i])) { in_cmd= true; startcmd= i; } i++; } } if (N(proof) > 0) doc << format_proof (proof); if (in_cmd) doc << parse_vernac_command (s (startcmd, n)); return doc; }