Improved paragraph numbering and fixed bug leading to circular writes of paragraph numbers

This commit is contained in:
Graham Nelson 2022-05-16 16:49:04 +01:00
parent cca0366c8f
commit 030eb040b3
13 changed files with 136 additions and 132 deletions

View file

@ -95,9 +95,12 @@ other nodes a bit speculatively.
paragraph *P;
LOOP_OVER_LINKED_LIST(P, paragraph, S->paragraphs)
if (P->defines_macro) {
macro_usage *mu =
FIRST_IN_LINKED_LIST(macro_usage, P->defines_macro->macro_usages);
if (mu) P->parent_paragraph = mu->used_in_paragraph;
macro_usage *mu;
LOOP_OVER_LINKED_LIST(mu, macro_usage, P->defines_macro->macro_usages)
if (P != mu->used_in_paragraph) {
Numbering::set_parent(P, mu->used_in_paragraph);
break;
}
}
@<Otherwise share the parent of a following paragraph, provided it precedes us@> =
@ -108,7 +111,7 @@ other nodes a bit speculatively.
paragraph *P2 = CONTENT_IN_ITEM(P2_item, paragraph);
if (P2->parent_paragraph) {
if (P2->parent_paragraph->allocation_id < P->allocation_id)
P->parent_paragraph = P2->parent_paragraph;
Numbering::set_parent(P, P2->parent_paragraph);
break;
}
}
@ -147,8 +150,15 @@ void Numbering::settle_paragraph_number(paragraph *P) {
if (Str::len(P->paragraph_number) > 0) return;
WRITE_TO(P->paragraph_number, "X"); /* to prevent malformed sections hanging this */
if (P->parent_paragraph) Numbering::settle_paragraph_number(P->parent_paragraph);
if (P == P->parent_paragraph) internal_error("paragraph is its own parent");
Str::clear(P->paragraph_number);
WRITE_TO(P->paragraph_number, "%S.%d", P->parent_paragraph->paragraph_number,
P->parent_paragraph->next_child_number++);
P->next_child_number = 1;
}
void Numbering::set_parent(paragraph *of, paragraph *to) {
if (of == NULL) internal_error("no paragraph");
if (to == of) internal_error("paragraph parent set to itself");
of->parent_paragraph = to;
}

View file

@ -179,9 +179,6 @@ int Debugging::render_visit(tree_node *N, void *state, int L) {
weave_vskip_node *C = RETRIEVE_POINTER_weave_vskip_node(N->content);
if (C->in_comment) WRITE(" (in comment)");
@<Render apres-defn@> =
;
@<Render chapter@> =
weave_chapter_node *C = RETRIEVE_POINTER_weave_chapter_node(N->content);
WRITE(" <%S>", C->chap->md->ch_title);

View file

@ -505,13 +505,6 @@ void TeX::source_code(text_stream *OUT, weave_order *wv,
colour_wanted = PLAIN_COLOUR; @<Adjust code colour as necessary@>;
}
@ We actually use |\qquad| horizontal spaces rather than risk using TeX's
messy alignment system:
@<Weave a suitable horizontal advance for that many tab stops@> =
int tab_stops_of_indentation = Str::remove_indentation(matter, 4);
for (int i=0; i<tab_stops_of_indentation; i++) WRITE("\\qquad");
@<Adjust code colour as necessary@> =
if (colour_wanted != current_colour) {
TeX::change_colour_PDF(OUT, colour_wanted, TRUE);

View file

@ -1,6 +1,6 @@
# Inweb 7.1.0
v7.1.0-beta+1B03 'Escape to Danger' (15 May 2022)
v7.1.0-beta+1B04 'Escape to Danger' (16 May 2022)
## About Inweb

View file

@ -142,13 +142,12 @@ typedef pthread_attr_t foundation_thread_attributes;
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>
#undef IN
#undef OUT
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 68 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 67 "inweb/foundation-module/Chapter 1/Windows Platform.w"
char *Platform__getenv(const char *name) {
char *env = getenv(name);
if (env == 0) {
@ -167,7 +166,7 @@ char *Platform__getenv(const char *name) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 101 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 100 "inweb/foundation-module/Chapter 1/Windows Platform.w"
/* Check the first element of the command: if it has path separators in
it, we assume we are running one of our commands, otherwise it is a
Unix style command. */
@ -240,7 +239,7 @@ int Platform__system(const char *cmd) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 363 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 362 "inweb/foundation-module/Chapter 1/Windows Platform.w"
typedef HANDLE foundation_thread;
typedef int foundation_thread_attributes;
@ -248,7 +247,7 @@ struct Win32_Thread_Start { void *(*fn)(void *); void* arg; };
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 464 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 463 "inweb/foundation-module/Chapter 1/Windows Platform.w"
struct Win32_Mutex { INIT_ONCE init; CRITICAL_SECTION crit; };
#endif /* PLATFORM_WINDOWS */
@ -2611,87 +2610,87 @@ int Platform__get_core_count(void) ;
#endif /* PLATFORM_ANDROID */
#endif /* PLATFORM_POSIX */
#ifdef PLATFORM_WINDOWS
#line 49 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 48 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__Windows_isdigit(int c) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 61 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 60 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__is_folder_separator(wchar_t c) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 93 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 92 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__where_am_i(wchar_t *p, size_t length) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 174 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 173 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__mkdir(char *transcoded_pathname) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 182 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 181 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void * Platform__opendir(char *dir_name) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 187 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 186 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__readdir(void *D, char *dir_name, char *leafname) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 204 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 203 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__closedir(void *D) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 212 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 211 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__path_add(const char* base, const char* add, char* path) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 222 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 221 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__rsync(char *transcoded_source, char *transcoded_dest) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 301 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 300 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__sleep(int seconds) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 308 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 307 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__notification(text_stream *text, int happy) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 326 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 325 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__Win32_ResetConsole(void) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 335 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 334 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__configure_terminal(void) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 377 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 376 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__create_thread(foundation_thread *pt, const foundation_thread_attributes *pa, void *(*fn)(void *), void *arg) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 392 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 391 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__join_thread(foundation_thread pt, void** rv) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 396 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 395 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__init_thread(foundation_thread_attributes* pa, size_t size) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 399 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 398 "inweb/foundation-module/Chapter 1/Windows Platform.w"
size_t Platform__get_thread_stack_size(foundation_thread_attributes* pa) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 409 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 408 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__get_core_count(void) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 430 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 429 "inweb/foundation-module/Chapter 1/Windows Platform.w"
time_t Platform__never_time(void) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 434 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 433 "inweb/foundation-module/Chapter 1/Windows Platform.w"
time_t Platform__timestamp(char *transcoded_filename) ;
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 440 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 439 "inweb/foundation-module/Chapter 1/Windows Platform.w"
off_t Platform__size(char *transcoded_filename) ;
#endif /* PLATFORM_WINDOWS */
#line 64 "inweb/foundation-module/Chapter 2/Debugging Log.w"
@ -2870,7 +2869,7 @@ void Streams__put_char_at_index(text_stream *stream, int position, wchar_t C) ;
void Streams__set_position(text_stream *stream, int position) ;
#line 929 "inweb/foundation-module/Chapter 2/Streams.w"
void Streams__copy(text_stream *to, text_stream *from) ;
#line 945 "inweb/foundation-module/Chapter 2/Streams.w"
#line 946 "inweb/foundation-module/Chapter 2/Streams.w"
void Streams__writer(OUTPUT_STREAM, char *format_string, void *vS) ;
#line 51 "inweb/foundation-module/Chapter 2/Writers and Loggers.w"
void Writers__log_escape_usage(void) ;
@ -4028,8 +4027,10 @@ void Enumerations__define(OUTPUT_STREAM, text_stream *symbol, text_stream *fro
void Enumerations__define_extents(OUTPUT_STREAM, tangle_target *target, programming_language *lang) ;
#line 19 "inweb/Chapter 2/Paragraph Numbering.w"
void Numbering__number_web(web *W) ;
#line 146 "inweb/Chapter 2/Paragraph Numbering.w"
#line 149 "inweb/Chapter 2/Paragraph Numbering.w"
void Numbering__settle_paragraph_number(paragraph *P) ;
#line 160 "inweb/Chapter 2/Paragraph Numbering.w"
void Numbering__set_parent(paragraph *of, paragraph *to) ;
#line 11 "inweb/Chapter 3/The Analyser.w"
void Analyser__scan_line_categories(web *W, text_stream *range) ;
#line 52 "inweb/Chapter 3/The Analyser.w"
@ -4512,13 +4513,13 @@ int TeX__render_visit(tree_node *N, void *state, int L) ;
void TeX__general_heading(text_stream *OUT, weave_order *wv, section *S, paragraph *P, text_stream *heading_text, int weight, int no_skip) ;
#line 496 "inweb/Chapter 5/TeX Format.w"
void TeX__source_code(text_stream *OUT, weave_order *wv, text_stream *matter, text_stream *colouring, int starts) ;
#line 522 "inweb/Chapter 5/TeX Format.w"
#line 515 "inweb/Chapter 5/TeX Format.w"
void TeX__change_colour_PDF(text_stream *OUT, int col, int in_code) ;
#line 545 "inweb/Chapter 5/TeX Format.w"
#line 538 "inweb/Chapter 5/TeX Format.w"
void TeX__para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) ;
#line 565 "inweb/Chapter 5/TeX Format.w"
#line 558 "inweb/Chapter 5/TeX Format.w"
void TeX__commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) ;
#line 590 "inweb/Chapter 5/TeX Format.w"
#line 583 "inweb/Chapter 5/TeX Format.w"
int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) ;
#line 9 "inweb/Chapter 5/HTML Formats.w"
void HTMLFormat__create(void) ;
@ -4550,11 +4551,11 @@ void Debugging__create(void) ;
void Debugging__render(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) ;
#line 31 "inweb/Chapter 5/Debugging Format.w"
int Debugging__render_visit(tree_node *N, void *state, int L) ;
#line 277 "inweb/Chapter 5/Debugging Format.w"
#line 274 "inweb/Chapter 5/Debugging Format.w"
void Debugging__show_text(text_stream *OUT, text_stream *text, int limit) ;
#line 288 "inweb/Chapter 5/Debugging Format.w"
#line 285 "inweb/Chapter 5/Debugging Format.w"
void Debugging__show_para(text_stream *OUT, paragraph *P) ;
#line 293 "inweb/Chapter 5/Debugging Format.w"
#line 290 "inweb/Chapter 5/Debugging Format.w"
void Debugging__show_mat(text_stream *OUT, int m) ;
#line 30 "inweb/Chapter 5/TeX Utilities.w"
tex_results * TeXUtilities__new_results(weave_order *wv, filename *CF) ;
@ -5756,21 +5757,21 @@ int Platform__get_core_count(void) {
#ifdef PLATFORM_WINDOWS
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 49 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 48 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__Windows_isdigit(int c) {
return ((c >= '0') && (c <= '9')) ? 1 : 0;
}
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 61 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 60 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__is_folder_separator(wchar_t c) {
return ((c == '\\') || (c == '/'));
}
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 93 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 92 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__where_am_i(wchar_t *p, size_t length) {
DWORD result = GetModuleFileNameW(NULL, p, (DWORD)length);
if ((result == 0) || (result == length)) p[0] = 0;
@ -5778,7 +5779,7 @@ void Platform__where_am_i(wchar_t *p, size_t length) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 174 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 173 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__mkdir(char *transcoded_pathname) {
errno = 0;
int rv = mkdir(transcoded_pathname);
@ -5816,7 +5817,7 @@ void Platform__closedir(void *D) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 212 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 211 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__path_add(const char* base, const char* add, char* path) {
char last;
@ -5904,20 +5905,20 @@ void Platform__rsync(char *transcoded_source, char *transcoded_dest) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 301 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 300 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__sleep(int seconds) {
Sleep((DWORD)(1000*seconds));
}
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 308 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 307 "inweb/foundation-module/Chapter 1/Windows Platform.w"
void Platform__notification(text_stream *text, int happy) {
}
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 319 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 318 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#define WIN32CONS_RESET_MODE 1
#define WIN32CONS_RESET_OUTCP 2
@ -5961,7 +5962,7 @@ void Platform__configure_terminal(void) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 370 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 369 "inweb/foundation-module/Chapter 1/Windows Platform.w"
DWORD WINAPI Platform__Win32_Thread_Func(LPVOID param) {
struct Win32_Thread_Start* start = (struct Win32_Thread_Start*)param;
(start->fn)(start->arg);
@ -5997,7 +5998,7 @@ size_t Platform__get_thread_stack_size(foundation_thread_attributes* pa) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 409 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 408 "inweb/foundation-module/Chapter 1/Windows Platform.w"
int Platform__get_core_count(void) {
int count = 0;
SYSTEM_INFO sysInfo;
@ -6013,7 +6014,7 @@ int Platform__get_core_count(void) {
#endif /* PLATFORM_WINDOWS */
#ifdef PLATFORM_WINDOWS
#line 430 "inweb/foundation-module/Chapter 1/Windows Platform.w"
#line 429 "inweb/foundation-module/Chapter 1/Windows Platform.w"
time_t Platform__never_time(void) {
return (time_t) 0;
}
@ -7393,6 +7394,7 @@ void Streams__set_position(text_stream *stream, int position) {
#line 929 "inweb/foundation-module/Chapter 2/Streams.w"
void Streams__copy(text_stream *to, text_stream *from) {
if ((from == NULL) || (to == NULL)) return;
if (from == to) internal_error("tried to copy a stream to itself");
if (from->write_to_file) internal_error("stream_copy from file stream");
if (from->write_to_memory) {
for (int i=0; i<from->chars_written; i++) {
@ -7403,7 +7405,7 @@ void Streams__copy(text_stream *to, text_stream *from) {
}
}
#line 945 "inweb/foundation-module/Chapter 2/Streams.w"
#line 946 "inweb/foundation-module/Chapter 2/Streams.w"
void Streams__writer(OUTPUT_STREAM, char *format_string, void *vS) {
text_stream *S = (text_stream *) vS;
Streams__copy(OUT, S);
@ -8748,11 +8750,11 @@ int CommandLine__read_pair_p(text_stream *opt, text_stream *opt_val, int N,
; innocuous = TRUE; break;
case VERSION_CLSW: {
PRINT("inweb");
char *svn = "7.1.0-beta+1B02";
char *svn = "7.1.0-beta+1B04";
if (svn[0]) PRINT(" version %s", svn);
char *vname = "Escape to Danger";
if (vname[0]) PRINT(" '%s'", vname);
char *d = "4 May 2022";
char *d = "16 May 2022";
if (d[0]) PRINT(" (%s)", d);
PRINT("\n");
innocuous = TRUE; break;
@ -20938,9 +20940,12 @@ void Numbering__number_web(web *W) {
paragraph *P;
LOOP_OVER_LINKED_LIST(P, paragraph, S->paragraphs)
if (P->defines_macro) {
macro_usage *mu =
FIRST_IN_LINKED_LIST(macro_usage, P->defines_macro->macro_usages);
if (mu) P->parent_paragraph = mu->used_in_paragraph;
macro_usage *mu;
LOOP_OVER_LINKED_LIST(mu, macro_usage, P->defines_macro->macro_usages)
if (P != mu->used_in_paragraph) {
Numbering__set_parent(P, mu->used_in_paragraph);
break;
}
}
}
@ -20948,7 +20953,7 @@ void Numbering__number_web(web *W) {
;
{
#line 104 "inweb/Chapter 2/Paragraph Numbering.w"
#line 107 "inweb/Chapter 2/Paragraph Numbering.w"
paragraph *P;
LOOP_OVER_LINKED_LIST(P, paragraph, S->paragraphs)
if (P->parent_paragraph == NULL)
@ -20956,7 +20961,7 @@ void Numbering__number_web(web *W) {
paragraph *P2 = CONTENT_IN_ITEM(P2_item, paragraph);
if (P2->parent_paragraph) {
if (P2->parent_paragraph->allocation_id < P->allocation_id)
P->parent_paragraph = P2->parent_paragraph;
Numbering__set_parent(P, P2->parent_paragraph);
break;
}
}
@ -20966,7 +20971,7 @@ void Numbering__number_web(web *W) {
;
{
#line 117 "inweb/Chapter 2/Paragraph Numbering.w"
#line 120 "inweb/Chapter 2/Paragraph Numbering.w"
paragraph *P;
LOOP_OVER_LINKED_LIST(P, paragraph, S->paragraphs)
P->paragraph_number = Str__new();
@ -20976,7 +20981,7 @@ void Numbering__number_web(web *W) {
;
{
#line 126 "inweb/Chapter 2/Paragraph Numbering.w"
#line 129 "inweb/Chapter 2/Paragraph Numbering.w"
int top_level = 1;
paragraph *P;
LOOP_OVER_LINKED_LIST(P, paragraph, S->paragraphs)
@ -20991,7 +20996,7 @@ void Numbering__number_web(web *W) {
;
{
#line 136 "inweb/Chapter 2/Paragraph Numbering.w"
#line 139 "inweb/Chapter 2/Paragraph Numbering.w"
paragraph *P;
LOOP_OVER_LINKED_LIST(P, paragraph, S->paragraphs)
Numbering__settle_paragraph_number(P);
@ -21009,17 +21014,24 @@ void Numbering__number_web(web *W) {
#line 66 "inweb/Chapter 2/Paragraph Numbering.w"
#line 146 "inweb/Chapter 2/Paragraph Numbering.w"
#line 149 "inweb/Chapter 2/Paragraph Numbering.w"
void Numbering__settle_paragraph_number(paragraph *P) {
if (Str__len(P->paragraph_number) > 0) return;
WRITE_TO(P->paragraph_number, "X"); /* to prevent malformed sections hanging this */
if (P->parent_paragraph) Numbering__settle_paragraph_number(P->parent_paragraph);
if (P == P->parent_paragraph) internal_error("paragraph is its own parent");
Str__clear(P->paragraph_number);
WRITE_TO(P->paragraph_number, "%S.%d", P->parent_paragraph->paragraph_number,
P->parent_paragraph->next_child_number++);
P->next_child_number = 1;
}
void Numbering__set_parent(paragraph *of, paragraph *to) {
if (of == NULL) internal_error("no paragraph");
if (to == of) internal_error("paragraph parent set to itself");
of->parent_paragraph = to;
}
#line 11 "inweb/Chapter 3/The Analyser.w"
void Analyser__scan_line_categories(web *W, text_stream *range) {
PRINT("Scan of source lines for '%S'\n", range);
@ -28907,7 +28919,7 @@ void TeX__source_code(text_stream *OUT, weave_order *wv,
colour_wanted = Str__get_at(colouring, i);
{
#line 516 "inweb/Chapter 5/TeX Format.w"
#line 509 "inweb/Chapter 5/TeX Format.w"
if (colour_wanted != current_colour) {
TeX__change_colour_PDF(OUT, colour_wanted, TRUE);
current_colour = colour_wanted;
@ -28921,7 +28933,7 @@ void TeX__source_code(text_stream *OUT, weave_order *wv,
}
colour_wanted = PLAIN_COLOUR;
{
#line 516 "inweb/Chapter 5/TeX Format.w"
#line 509 "inweb/Chapter 5/TeX Format.w"
if (colour_wanted != current_colour) {
TeX__change_colour_PDF(OUT, colour_wanted, TRUE);
current_colour = colour_wanted;
@ -28932,7 +28944,7 @@ void TeX__source_code(text_stream *OUT, weave_order *wv,
;
}
#line 522 "inweb/Chapter 5/TeX Format.w"
#line 515 "inweb/Chapter 5/TeX Format.w"
void TeX__change_colour_PDF(text_stream *OUT, int col, int in_code) {
char *inout = "";
if (in_code) inout = "|";
@ -28948,7 +28960,7 @@ void TeX__change_colour_PDF(text_stream *OUT, int col, int in_code) {
}
}
#line 545 "inweb/Chapter 5/TeX Format.w"
#line 538 "inweb/Chapter 5/TeX Format.w"
void TeX__para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) {
if (defn)
WRITE("|\\pdfdest num %d fit ",
@ -28968,7 +28980,7 @@ void TeX__para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int de
WRITE("\\pdfendlink|");
}
#line 565 "inweb/Chapter 5/TeX Format.w"
#line 558 "inweb/Chapter 5/TeX Format.w"
void TeX__commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) {
int math_mode = FALSE;
for (int i=0; i < Str__len(id); i++) {
@ -28990,7 +29002,7 @@ void TeX__commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) {
}
}
#line 590 "inweb/Chapter 5/TeX Format.w"
#line 583 "inweb/Chapter 5/TeX Format.w"
int TeX__preform_document(weave_format *self, text_stream *OUT, web *W,
weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter,
text_stream *concluding_comment) {
@ -28998,7 +29010,7 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W,
preform_production_count = 0;
{
#line 607 "inweb/Chapter 5/TeX Format.w"
#line 600 "inweb/Chapter 5/TeX Format.w"
WRITE("\\nonterminal{%S} |::=|",
L->preform_nonterminal_defined->unangled_name);
if (L->preform_nonterminal_defined->as_function) {
@ -29015,14 +29027,14 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W,
WRITE("\n");
}
#line 595 "inweb/Chapter 5/TeX Format.w"
#line 588 "inweb/Chapter 5/TeX Format.w"
;
return TRUE;
} else {
if (L->category == PREFORM_GRAMMAR_LCAT) {
{
#line 623 "inweb/Chapter 5/TeX Format.w"
#line 616 "inweb/Chapter 5/TeX Format.w"
TEMPORARY_TEXT(problem)
match_results mr = Regexp__create_mr();
if (Regexp__match(&mr, matter, L"Issue (%c*?) problem"))
@ -29071,7 +29083,7 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W,
Regexp__dispose_of(&mr);
}
#line 599 "inweb/Chapter 5/TeX Format.w"
#line 592 "inweb/Chapter 5/TeX Format.w"
;
return TRUE;
}
@ -30670,7 +30682,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_chapter_node_type)
{
#line 186 "inweb/Chapter 5/Debugging Format.w"
#line 183 "inweb/Chapter 5/Debugging Format.w"
weave_chapter_node *C = RETRIEVE_POINTER_weave_chapter_node(N->content);
WRITE(" <%S>", C->chap->md->ch_title);
@ -30679,7 +30691,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_section_node_type)
{
#line 190 "inweb/Chapter 5/Debugging Format.w"
#line 187 "inweb/Chapter 5/Debugging Format.w"
weave_section_node *C = RETRIEVE_POINTER_weave_section_node(N->content);
WRITE(" <%S>", C->sect->md->sect_title);
@ -30688,7 +30700,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_code_line_node_type)
{
#line 194 "inweb/Chapter 5/Debugging Format.w"
#line 191 "inweb/Chapter 5/Debugging Format.w"
;
}
@ -30696,7 +30708,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_function_usage_node_type)
{
#line 197 "inweb/Chapter 5/Debugging Format.w"
#line 194 "inweb/Chapter 5/Debugging Format.w"
weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content);
WRITE(" <%S>", C->fn->function_name);
@ -30705,7 +30717,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_commentary_node_type)
{
#line 201 "inweb/Chapter 5/Debugging Format.w"
#line 198 "inweb/Chapter 5/Debugging Format.w"
weave_commentary_node *C = RETRIEVE_POINTER_weave_commentary_node(N->content);
Debugging__show_text(OUT, C->text, 80);
if (C->in_code) WRITE(" (code)");
@ -30715,7 +30727,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_carousel_slide_node_type)
{
#line 206 "inweb/Chapter 5/Debugging Format.w"
#line 203 "inweb/Chapter 5/Debugging Format.w"
weave_carousel_slide_node *C = RETRIEVE_POINTER_weave_carousel_slide_node(N->content);
WRITE(" caption <%S>", C->caption);
@ -30724,7 +30736,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_toc_node_type)
{
#line 210 "inweb/Chapter 5/Debugging Format.w"
#line 207 "inweb/Chapter 5/Debugging Format.w"
weave_toc_node *C = RETRIEVE_POINTER_weave_toc_node(N->content);
WRITE(" - <%S>", C->text1);
@ -30733,7 +30745,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_toc_line_node_type)
{
#line 214 "inweb/Chapter 5/Debugging Format.w"
#line 211 "inweb/Chapter 5/Debugging Format.w"
weave_toc_line_node *C = RETRIEVE_POINTER_weave_toc_line_node(N->content);
WRITE(" - <%S, %S>", C->text1, C->text2);
if (C->para) Debugging__show_para(OUT, C->para);
@ -30743,7 +30755,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_chapter_title_page_node_type)
{
#line 219 "inweb/Chapter 5/Debugging Format.w"
#line 216 "inweb/Chapter 5/Debugging Format.w"
weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content);
WRITE(" - something %d", C->allocation_id);
@ -30752,7 +30764,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_defn_node_type)
{
#line 223 "inweb/Chapter 5/Debugging Format.w"
#line 220 "inweb/Chapter 5/Debugging Format.w"
weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content);
WRITE(" <%S>", C->keyword);
@ -30761,7 +30773,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_source_code_node_type)
{
#line 227 "inweb/Chapter 5/Debugging Format.w"
#line 224 "inweb/Chapter 5/Debugging Format.w"
weave_source_code_node *C = RETRIEVE_POINTER_weave_source_code_node(N->content);
WRITE(" <%S>\n", C->matter);
for (int i=0; i<L; i++) WRITE(" ");
@ -30773,7 +30785,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_url_node_type)
{
#line 234 "inweb/Chapter 5/Debugging Format.w"
#line 231 "inweb/Chapter 5/Debugging Format.w"
weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content);
WRITE(" content <%S> url <%S>", C->content, C->url);
@ -30782,7 +30794,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_footnote_cue_node_type)
{
#line 238 "inweb/Chapter 5/Debugging Format.w"
#line 235 "inweb/Chapter 5/Debugging Format.w"
weave_footnote_cue_node *C = RETRIEVE_POINTER_weave_footnote_cue_node(N->content);
WRITE(" [%S]", C->cue_text);
@ -30791,7 +30803,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_begin_footnote_text_node_type)
{
#line 242 "inweb/Chapter 5/Debugging Format.w"
#line 239 "inweb/Chapter 5/Debugging Format.w"
weave_begin_footnote_text_node *C = RETRIEVE_POINTER_weave_begin_footnote_text_node(N->content);
WRITE(" [%S]", C->cue_text);
@ -30800,7 +30812,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_display_line_node_type)
{
#line 246 "inweb/Chapter 5/Debugging Format.w"
#line 243 "inweb/Chapter 5/Debugging Format.w"
weave_display_line_node *C = RETRIEVE_POINTER_weave_display_line_node(N->content);
WRITE(" <%S>", C->text);
@ -30809,7 +30821,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_function_defn_node_type)
{
#line 250 "inweb/Chapter 5/Debugging Format.w"
#line 247 "inweb/Chapter 5/Debugging Format.w"
weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content);
WRITE(" <%S>", C->fn->function_name);
@ -30818,7 +30830,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_item_node_type)
{
#line 254 "inweb/Chapter 5/Debugging Format.w"
#line 251 "inweb/Chapter 5/Debugging Format.w"
weave_item_node *C = RETRIEVE_POINTER_weave_item_node(N->content);
WRITE(" depth %d label <%S>", C->depth, C->label);
@ -30827,7 +30839,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_grammar_index_node_type)
{
#line 258 "inweb/Chapter 5/Debugging Format.w"
#line 255 "inweb/Chapter 5/Debugging Format.w"
;
}
@ -30835,7 +30847,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_inline_node_type)
{
#line 261 "inweb/Chapter 5/Debugging Format.w"
#line 258 "inweb/Chapter 5/Debugging Format.w"
;
}
@ -30843,7 +30855,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_locale_node_type)
{
#line 264 "inweb/Chapter 5/Debugging Format.w"
#line 261 "inweb/Chapter 5/Debugging Format.w"
weave_locale_node *C = RETRIEVE_POINTER_weave_locale_node(N->content);
Debugging__show_para(OUT, C->par1);
if (C->par2) {
@ -30856,7 +30868,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
else if (N->type == weave_maths_node_type)
{
#line 272 "inweb/Chapter 5/Debugging Format.w"
#line 269 "inweb/Chapter 5/Debugging Format.w"
weave_maths_node *C = RETRIEVE_POINTER_weave_maths_node(N->content);
WRITE(" <%S>", C->content);
if (C->displayed) WRITE(" (displayed)");
@ -30869,7 +30881,7 @@ int Debugging__render_visit(tree_node *N, void *state, int L) {
return TRUE;
}
#line 277 "inweb/Chapter 5/Debugging Format.w"
#line 274 "inweb/Chapter 5/Debugging Format.w"
void Debugging__show_text(text_stream *OUT, text_stream *text, int limit) {
WRITE(" <");
for (int i=0; (i<limit) && (i<Str__len(text)); i++)
@ -31781,7 +31793,7 @@ void Ctags__write(web *W, filename *F) {
WRITE("!_TAG_FILE_SORTED\t0\t/0=unsorted, 1=sorted, 2=foldcase/\n");
WRITE("!_TAG_PROGRAM_AUTHOR\tGraham Nelson\t/graham.nelson@mod-langs.ox.ac.uk/\n");
WRITE("!_TAG_PROGRAM_NAME\tinweb\t//\n");
WRITE("!_TAG_PROGRAM_VERSION\t7.1.0-beta+1B02\t/built 4 May 2022/\n");
WRITE("!_TAG_PROGRAM_VERSION\t7.1.0-beta+1B04\t/built 16 May 2022/\n");
}
#line 47 "inweb/Chapter 6/Ctags Support.w"

View file

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 15 May 2022
Build Number: 1B03
Build Date: 16 May 2022
Build Number: 1B04

View file

@ -77,7 +77,6 @@ on a POSIX operating system.
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;windows.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;shellapi.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;shlobj.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;shlwapi.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">undef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IN</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">undef</span><span class="plain-syntax"> </span><span class="identifier-syntax">OUT</span>
</pre>

View file

@ -1049,6 +1049,7 @@ to open similar ones again).
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Streams::copy</span><button class="popup" onclick="togglePopup('usagePopup37')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup37">Usage of <span class="code-font"><span class="function-syntax">Streams::copy</span></span>:<br/><a href="2-str.html#SP14">&#167;14</a>, <a href="2-str.html#SP43">&#167;43</a><br/>String Manipulation - <a href="4-sm.html#SP3">&#167;3</a>, <a href="4-sm.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">to</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to copy a stream to itself"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">write_to_file</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"stream_copy from file stream"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">write_to_memory</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;from-&gt;</span><span class="element-syntax">chars_written</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>

Binary file not shown.

View file

@ -165,9 +165,12 @@ other nodes a bit speculatively.
<span class="plain-syntax"> </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">paragraphs</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defines_macro</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">macro_usage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mu</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">FIRST_IN_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">macro_usage</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defines_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">macro_usages</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">mu</span><span class="plain-syntax">) </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_in_paragraph</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">macro_usage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mu</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">mu</span><span class="plain-syntax">, </span><span class="reserved-syntax">macro_usage</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defines_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">macro_usages</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax"> != </span><span class="identifier-syntax">mu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_in_paragraph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Numbering::set_parent</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">mu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_in_paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-pn.html#SP1_2">&#167;1.2</a>.</li></ul>
@ -182,7 +185,7 @@ other nodes a bit speculatively.
<span class="plain-syntax"> </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CONTENT_IN_ITEM</span><span class="plain-syntax">(</span><span class="identifier-syntax">P2_item</span><span class="plain-syntax">, </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allocation_id</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allocation_id</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Numbering::set_parent</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">P2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -236,11 +239,18 @@ chosen by the author, so 2 it is.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">paragraph_number</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">paragraph_number</span><span class="plain-syntax">, </span><span class="string-syntax">"X"</span><span class="plain-syntax">); </span><span class="comment-syntax"> to prevent malformed sections hanging this</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_paragraph</span><span class="plain-syntax">) </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Numbering::settle_paragraph_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax"> == </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"paragraph is its own parent"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">paragraph_number</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">paragraph_number</span><span class="plain-syntax">, </span><span class="string-syntax">"%S.%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">paragraph_number</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_child_number</span><span class="plain-syntax">++);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_child_number</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Numbering::set_parent</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Numbering::set_parent</span></span>:<br/><a href="2-pn.html#SP1_2_1">&#167;1.2.1</a>, <a href="2-pn.html#SP1_2_2">&#167;1.2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">paragraph</span><span class="plain-syntax"> *</span><span class="identifier-syntax">of</span><span class="plain-syntax">, </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">of</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no paragraph"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">of</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"paragraph parent set to itself"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">of</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_paragraph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-ec.html">&#10094;</a></li><li class="progresschapter"><a href="M-iti.html">M</a></li><li class="progresschapter"><a href="P-htpw.html">P</a></li><li class="progresschapter"><a href="1-bsc.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-tr.html">tr</a></li><li class="progresssection"><a href="2-lc.html">lc</a></li><li class="progresssection"><a href="2-tp.html">tp</a></li><li class="progresssection"><a href="2-pm.html">pm</a></li><li class="progresssection"><a href="2-tgs.html">tgs</a></li><li class="progresssection"><a href="2-ec.html">ec</a></li><li class="progresscurrent">pn</li><li class="progresschapter"><a href="3-ta.html">3</a></li><li class="progresschapter"><a href="4-pl.html">4</a></li><li class="progresschapter"><a href="5-wt.html">5</a></li><li class="progresschapter"><a href="6-mkf.html">6</a></li><li class="progressnext"><a href="3-ta.html">&#10095;</a></li></ul></div>

View file

@ -325,13 +325,6 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">C</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">in_comment</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" (in comment)"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-df.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP_1" class="paragraph-anchor"></a><b>&#167;.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Render apres-defn</span><span class="named-paragraph-number">.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> ;</span>
</pre>
<ul class="endnotetexts"><li>This code is never used.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_25" class="paragraph-anchor"></a><b>&#167;2.25. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Render chapter</span><span class="named-paragraph-number">2.25</span></span><span class="comment-syntax"> =</span>
</p>

View file

@ -749,18 +749,6 @@ mode once again:
<span class="plain-syntax"> </span><span class="identifier-syntax">colour_wanted</span><span class="plain-syntax"> = </span><span class="constant-syntax">PLAIN_COLOUR</span><span class="plain-syntax">; </span><span class="named-paragraph-container code-font"><a href="5-tf.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Adjust code colour as necessary</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP_1" class="paragraph-anchor"></a><b>&#167;.1. </b>We actually use <span class="extract"><span class="extract-syntax">\qquad</span></span> horizontal spaces rather than risk using TeX's
messy alignment system:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Weave a suitable horizontal advance for that many tab stops</span><span class="named-paragraph-number">.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tab_stops_of_indentation</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP16" class="function-link"><span class="function-syntax">Str::remove_indentation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">matter</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">tab_stops_of_indentation</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\\qquad"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is never used.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Adjust code colour as necessary</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
</p>

View file

@ -928,6 +928,7 @@ void Streams::set_position(text_stream *stream, int position) {
=
void Streams::copy(text_stream *to, text_stream *from) {
if ((from == NULL) || (to == NULL)) return;
if (from == to) internal_error("tried to copy a stream to itself");
if (from->write_to_file) internal_error("stream_copy from file stream");
if (from->write_to_memory) {
for (int i=0; i<from->chars_written; i++) {