Mercurial > pasana
diff codetools.c @ 2:ff5e493bc9cb default tip
2003-01-29
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 13 Oct 2012 21:14:50 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/codetools.c Sat Oct 13 21:14:50 2012 +0200 @@ -0,0 +1,138 @@ +#include <stdio.h> +#include "codetools.h" + + +#define COMM_INDENT 60 + +/* Zwiększa wcięcie kolejnych linii. */ +void +codeIndent(CodeText *text) +{ + ++(text->indent); + if (text->last_line->string->len==0) + ++(text->last_line->indent); +} + +/* Zmniejsza wcięcie. */ +void +codeUnindent(CodeText *text) +{ + --(text->indent); + if (text->last_line->string->len==0) + --(text->last_line->indent); +} + +/* Przechodzi do nowej linijki. */ +void +codeNewLine(CodeText *text) +{ + CodeLine *line; + + line = newCodeLine(text); + line->indent = text->indent; + text->last_line = line; + text->line_list = g_list_append(text->line_list, line); +} + +/* Dodaje tekst do ostatniej linijki. */ +void +codePrint(CodeText *text, const char *string) +{ + if (text->last_line == NULL) + codeNewLine(text); + text->last_line->string = g_string_append(text->last_line->string, string); +} + +/* Dodaje tekst etykiety do ostatniej linijki. */ +void +codeLabel(CodeText *text, const char *string) +{ + if (text->last_line == NULL) + codeNewLine(text); + if (text->last_line->label==NULL) { + text->last_line->label = g_string_new(string); + } else { + text->last_line->label = g_string_append(text->last_line->label, string); + } +} + +/* Dodaje tekst komentarza do ostatniej linijki. */ +void +codeComment(CodeText *text, const char *string) +{ + if (text->last_line == NULL) + codeNewLine(text); + if (text->last_line->comment==NULL) { + text->last_line->comment = g_string_new(string); + } else { + text->last_line->comment = g_string_append(text->last_line->comment, string); + } +} + +/* Wyświetla kod na ekranie. */ +void +codeShow(CodeText *text) +{ + GList *iter; + CodeLine *line; + int ind; + + if (text==NULL) + return; + for (iter=text->line_list; iter!=NULL; iter=iter->next) { + line = ((CodeLine *)iter->data); + if (line->label!=NULL) { + ind = line->label->len; + printf("%s", line->label->str); + } else { + ind = 0; + } + while (ind<line->indent*4) { + printf(" "); + ++ind; + } + printf("%s", line->string->str); + ind += line->string->len; + if (line->comment!=NULL) { + while (ind<COMM_INDENT) { + printf(" "); + ++ind; + } + printf("%s", line->comment->str); + } + printf("\n"); + } +} + +/* Zaznacza początek tokena. */ +void +codeBeginTag(CodeText *text, int group, void *node) +{ + CodeTag *tag; + int kind; + + if (text->last_line == NULL) + codeNewLine(text); + tag = newCodeTag(); + tag->xstart = text->last_line->string->len; + tag->ystart = (text->last_line->number)-1; + text->tag_stack = g_list_prepend(text->tag_stack, tag); + text->last_line->tag_list = g_list_append(text->last_line->tag_list, tag); + tag->group = group; + tag->node = node; +} + +/* Zanzacza koniec tokena. */ +void +codeEndTag(CodeText *text) +{ + GList *first; + CodeTag *tag; + + tag = text->tag_stack->data; + tag->xend = text->last_line->string->len; + tag->yend = (text->last_line->number)-1; + first = text->tag_stack; + text->tag_stack = g_list_remove_link(text->tag_stack, first); + g_list_free(first); +}
