Minor speed optimisations following profiling of inform7

This commit is contained in:
Graham Nelson 2022-03-23 23:02:07 +00:00
parent 23180b41f8
commit 59d3e6beb9
8 changed files with 117 additions and 71 deletions

View file

@ -1,6 +1,6 @@
# Inweb 7
v7-alpha.1+1A80 'Escape to Danger' (11 March 2022)
v7-alpha.1+1A81 'Escape to Danger' (23 March 2022)
## About Inweb

View file

@ -2868,22 +2868,24 @@ void Dictionaries__destroy_literal(dictionary *D, wchar_t *lit) ;
#line 125 "inweb/foundation-module/Chapter 2/Dictionaries.w"
dict_entry * Dictionaries__find_p(dictionary *D, text_stream *K, int change) ;
#line 202 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void * Dictionaries__value_for_entry(dict_entry *de) ;
#line 207 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void * Dictionaries__read_value(dictionary *D, text_stream *key) ;
#line 210 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 215 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void * Dictionaries__read_value_literal(dictionary *D, wchar_t *key) ;
#line 219 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 224 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void Dictionaries__write_value(dictionary *D, text_stream *key, void *val) ;
#line 227 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 232 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void Dictionaries__write_value_literal(dictionary *D, wchar_t *key, void *val) ;
#line 240 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 245 "inweb/foundation-module/Chapter 2/Dictionaries.w"
text_stream * Dictionaries__create_text(dictionary *D, text_stream *key) ;
#line 246 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 251 "inweb/foundation-module/Chapter 2/Dictionaries.w"
text_stream * Dictionaries__create_text_literal(dictionary *D, wchar_t *lit) ;
#line 257 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 262 "inweb/foundation-module/Chapter 2/Dictionaries.w"
text_stream * Dictionaries__get_text(dictionary *D, text_stream *key) ;
#line 265 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 270 "inweb/foundation-module/Chapter 2/Dictionaries.w"
text_stream * Dictionaries__get_text_literal(dictionary *D, wchar_t *lit) ;
#line 278 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 283 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void Dictionaries__dispose_of(dictionary *D) ;
#line 18 "inweb/foundation-module/Chapter 2/Trees.w"
heterogeneous_tree * Trees__new(tree_type *type) ;
@ -3279,53 +3281,53 @@ int Str__eq_insensitive(text_stream *S1, text_stream *S2) ;
int Str__ne(text_stream *S1, text_stream *S2) ;
#line 368 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__ne_insensitive(text_stream *S1, text_stream *S2) ;
#line 377 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 390 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__cmp(text_stream *S1, text_stream *S2) ;
#line 387 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 400 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__cmp_insensitive(text_stream *S1, text_stream *S2) ;
#line 408 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 421 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__prefix_eq(text_stream *S1, text_stream *S2, int N) ;
#line 417 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 430 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__suffix_eq(text_stream *S1, text_stream *S2, int N) ;
#line 426 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 439 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__begins_with_wide_string(text_stream *S, wchar_t *prefix) ;
#line 435 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 448 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__ends_with_wide_string(text_stream *S, wchar_t *suffix) ;
#line 445 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 458 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__eq_wide_string(text_stream *S1, wchar_t *S2) ;
#line 456 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 469 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__eq_narrow_string(text_stream *S1, char *S2) ;
#line 467 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 480 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__ne_wide_string(text_stream *S1, wchar_t *S2) ;
#line 474 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 487 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__is_whitespace(text_stream *S) ;
#line 484 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 497 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__trim_white_space(text_stream *S) ;
#line 513 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 526 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__trim_white_space_at_end(text_stream *S) ;
#line 524 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 537 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__trim_all_white_space_at_end(text_stream *S) ;
#line 538 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 551 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__delete_first_character(text_stream *S) ;
#line 542 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 555 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__delete_last_character(text_stream *S) ;
#line 547 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 560 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__delete_nth_character(text_stream *S, int n) ;
#line 552 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__delete_n_characters(text_stream *S, int n) ;
#line 565 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__delete_n_characters(text_stream *S, int n) ;
#line 578 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__substr(OUTPUT_STREAM, string_position from, string_position to) ;
#line 571 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 584 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__includes_character(text_stream *S, wchar_t c) ;
#line 579 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 592 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__includes_wide_string_at(text_stream *S, wchar_t *prefix, int j) ;
#line 588 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 601 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__includes_wide_string_at_insensitive(text_stream *S, wchar_t *prefix, int j) ;
#line 597 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 610 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__includes(text_stream *S, text_stream *T) ;
#line 612 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 625 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__includes_at(text_stream *line, int i, text_stream *pattern) ;
#line 635 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 648 "inweb/foundation-module/Chapter 4/String Manipulation.w"
text_stream * Str__literal(wchar_t *wide_C_string) ;
#line 15 "inweb/foundation-module/Chapter 4/Text Files.w"
int TextFiles__exists(filename *F) ;
@ -7890,6 +7892,11 @@ dict_entry *Dictionaries__find_p(dictionary *D, text_stream *K, int change) {
}
#line 202 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void *Dictionaries__value_for_entry(dict_entry *de) {
if (de) return de->value;
return NULL;
}
void *Dictionaries__read_value(dictionary *D, text_stream *key) {
if (D == NULL) return NULL;
if (D->textual) internal_error("textual dictionary accessed as pointy");
@ -7924,7 +7931,7 @@ void Dictionaries__write_value_literal(dictionary *D, wchar_t *key, void *val) {
E->value = val;
}
#line 240 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 245 "inweb/foundation-module/Chapter 2/Dictionaries.w"
text_stream *Dictionaries__create_text(dictionary *D, text_stream *key) {
if (D == NULL) internal_error("wrote to null dictionary");
if (D->textual == FALSE) internal_error("pointy dictionary accessed as textual");
@ -7938,7 +7945,7 @@ text_stream *Dictionaries__create_text_literal(dictionary *D, wchar_t *lit) {
return (text_stream *) E->value;
}
#line 257 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 262 "inweb/foundation-module/Chapter 2/Dictionaries.w"
text_stream *Dictionaries__get_text(dictionary *D, text_stream *key) {
if (D == NULL) return NULL;
if (D->textual == FALSE) internal_error("pointy dictionary accessed as textual");
@ -7955,7 +7962,7 @@ text_stream *Dictionaries__get_text_literal(dictionary *D, wchar_t *lit) {
return (text_stream *) E->value;
}
#line 278 "inweb/foundation-module/Chapter 2/Dictionaries.w"
#line 283 "inweb/foundation-module/Chapter 2/Dictionaries.w"
void Dictionaries__dispose_of(dictionary *D) {
if (D->textual)
for (int i=0; i<D->hash_table_size; i++)
@ -8576,11 +8583,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-alpha.1+1A79";
char *svn = "7-alpha.1+1A80";
if (svn[0]) PRINT(" version %s", svn);
char *vname = "Escape to Danger";
if (vname[0]) PRINT(" '%s'", vname);
char *d = "5 March 2022";
char *d = "11 March 2022";
if (d[0]) PRINT(" (%s)", d);
PRINT("\n");
innocuous = TRUE; break;
@ -10472,7 +10479,7 @@ void Str__copy_wide_string(text_stream *S, wchar_t *C_string) {
#line 353 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__eq(text_stream *S1, text_stream *S2) {
if ((Str__len(S1) == Str__len(S2)) && (Str__cmp(S1, S2) == 0)) return TRUE;
if (Str__cmp(S1, S2) == 0) return TRUE;
return FALSE;
}
@ -10482,7 +10489,7 @@ int Str__eq_insensitive(text_stream *S1, text_stream *S2) {
}
int Str__ne(text_stream *S1, text_stream *S2) {
if ((Str__len(S1) != Str__len(S2)) || (Str__cmp(S1, S2) != 0)) return TRUE;
if (Str__cmp(S1, S2) != 0) return TRUE;
return FALSE;
}
@ -10491,15 +10498,15 @@ int Str__ne_insensitive(text_stream *S1, text_stream *S2) {
return FALSE;
}
#line 377 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 390 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__cmp(text_stream *S1, text_stream *S2) {
for (string_position P = Str__start(S1), Q = Str__start(S2);
(P.index < Str__len(S1)) && (Q.index < Str__len(S2));
P = Str__forward(P), Q = Str__forward(Q)) {
int d = (int) Str__get(P) - (int) Str__get(Q);
int L1 = Str__len(S1), L2 = Str__len(S2), M = L1;
if (L2 < M) M = L2;
for (int i=0; i<M; i++) {
int d = (int) Str__get_at(S1, i) - (int) Str__get_at(S2, i);
if (d != 0) return d;
}
return Str__len(S1) - Str__len(S2);
return L1 - L2;
}
int Str__cmp_insensitive(text_stream *S1, text_stream *S2) {
@ -10512,7 +10519,7 @@ int Str__cmp_insensitive(text_stream *S1, text_stream *S2) {
return Str__len(S1) - Str__len(S2);
}
#line 408 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 421 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__prefix_eq(text_stream *S1, text_stream *S2, int N) {
int L1 = Str__len(S1), L2 = Str__len(S2);
if ((N > L1) || (N > L2)) return FALSE;
@ -10549,7 +10556,7 @@ int Str__ends_with_wide_string(text_stream *S, wchar_t *suffix) {
return TRUE;
}
#line 445 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 458 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__eq_wide_string(text_stream *S1, wchar_t *S2) {
if (S2 == NULL) return (Str__len(S1) == 0)?TRUE:FALSE;
if (Str__len(S1) == (int) wcslen(S2)) {
@ -10576,7 +10583,7 @@ int Str__ne_wide_string(text_stream *S1, wchar_t *S2) {
return (Str__eq_wide_string(S1, S2)?FALSE:TRUE);
}
#line 474 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 487 "inweb/foundation-module/Chapter 4/String Manipulation.w"
int Str__is_whitespace(text_stream *S) {
LOOP_THROUGH_TEXT(pos, S)
if (Characters__is_space_or_tab(Str__get(pos)) == FALSE)
@ -10584,7 +10591,7 @@ int Str__is_whitespace(text_stream *S) {
return TRUE;
}
#line 484 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 497 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__trim_white_space(text_stream *S) {
int len = Str__len(S), i = 0, j = 0;
string_position F = Str__start(S);
@ -10636,7 +10643,7 @@ int Str__trim_all_white_space_at_end(text_stream *S) {
return shortened;
}
#line 538 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 551 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__delete_first_character(text_stream *S) {
Str__delete_nth_character(S, 0);
}
@ -10661,7 +10668,7 @@ void Str__delete_n_characters(text_stream *S, int n) {
}
}
#line 565 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 578 "inweb/foundation-module/Chapter 4/String Manipulation.w"
void Str__substr(OUTPUT_STREAM, string_position from, string_position to) {
if (from.S != to.S) internal_error("substr on two different strings");
for (int i = from.index; i < to.index; i++)
@ -10719,7 +10726,7 @@ int Str__includes_at(text_stream *line, int i, text_stream *pattern) {
return TRUE;
}
#line 633 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 646 "inweb/foundation-module/Chapter 4/String Manipulation.w"
dictionary *string_literals_dictionary = NULL;
text_stream *Str__literal(wchar_t *wide_C_string) {
@ -10728,7 +10735,7 @@ text_stream *Str__literal(wchar_t *wide_C_string) {
LOCK_MUTEX(mutex);
{
#line 645 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 658 "inweb/foundation-module/Chapter 4/String Manipulation.w"
if (string_literals_dictionary == NULL)
string_literals_dictionary = Dictionaries__new(100, TRUE);
answer = Dictionaries__get_text_literal(string_literals_dictionary, wide_C_string);
@ -10740,7 +10747,7 @@ text_stream *Str__literal(wchar_t *wide_C_string) {
}
}
#line 639 "inweb/foundation-module/Chapter 4/String Manipulation.w"
#line 652 "inweb/foundation-module/Chapter 4/String Manipulation.w"
;
UNLOCK_MUTEX(mutex);
return answer;
@ -30847,7 +30854,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-alpha.1+1A79\t/built 5 March 2022/\n");
WRITE("!_TAG_PROGRAM_VERSION\t7-alpha.1+1A80\t/built 11 March 2022/\n");
}
#line 47 "inweb/Chapter 6/Ctags Support.w"

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 11 March 2022
Build Number: 1A80
Build Date: 23 March 2022
Build Number: 1A81

View file

@ -275,6 +275,11 @@ values which are arbitrary pointers, so we have to use void pointers:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="function-syntax">Dictionaries::value_for_entry</span><span class="plain-syntax">(</span><span class="reserved-syntax">dict_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">de</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">de</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">de</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">value</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</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">Dictionaries::read_value</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Dictionaries::read_value</span></span>:<br/>Command Line Arguments - <a href="3-cla.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">dictionary</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">key</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">D</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="identifier-syntax">NULL</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">D</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">textual</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"textual dictionary accessed as pointy"</span><span class="plain-syntax">);</span>

View file

@ -282,7 +282,7 @@ at those positions may well not be, of course.)
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-str.html#SP40" class="function-link"><span class="function-syntax">Streams::get_char_at_index</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">.</span><span class="element-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">.</span><span class="element-syntax">index</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="function-syntax">Str::get_at</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Str::get_at</span></span>:<br/><a href="4-sm.html#SP21">&#167;21</a>, <a href="4-sm.html#SP24">&#167;24</a>, <a href="4-sm.html#SP26">&#167;26</a><br/>Pathnames - <a href="3-pth.html#SP7">&#167;7</a><br/>Filenames - <a href="3-fln.html#SP5">&#167;5</a><br/>Tries and Avinues - <a href="4-taa.html#SP2">&#167;2</a><br/>Pattern Matching - <a href="4-pm.html#SP3">&#167;3</a>, <a href="4-pm.html#SP4">&#167;4</a>, <a href="4-pm.html#SP11">&#167;11</a>, <a href="4-pm.html#SP11_4">&#167;11.4</a>, <a href="4-pm.html#SP11_6">&#167;11.6</a>, <a href="4-pm.html#SP14">&#167;14</a>, <a href="4-pm.html#SP14_1">&#167;14.1</a><br/>Web Structure - <a href="8-ws.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="8-ws.html#SP7">&#167;7</a><br/>Build Files - <a href="8-bf.html#SP9">&#167;9</a><br/>Simple Tangler - <a href="8-st.html#SP7_2_1">&#167;7.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">index</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="function-syntax">Str::get_at</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Str::get_at</span></span>:<br/><a href="4-sm.html#SP20">&#167;20</a>, <a href="4-sm.html#SP21">&#167;21</a>, <a href="4-sm.html#SP24">&#167;24</a>, <a href="4-sm.html#SP26">&#167;26</a><br/>Pathnames - <a href="3-pth.html#SP7">&#167;7</a><br/>Filenames - <a href="3-fln.html#SP5">&#167;5</a><br/>Tries and Avinues - <a href="4-taa.html#SP2">&#167;2</a><br/>Pattern Matching - <a href="4-pm.html#SP3">&#167;3</a>, <a href="4-pm.html#SP4">&#167;4</a>, <a href="4-pm.html#SP11">&#167;11</a>, <a href="4-pm.html#SP11_4">&#167;11.4</a>, <a href="4-pm.html#SP11_6">&#167;11.6</a>, <a href="4-pm.html#SP14">&#167;14</a>, <a href="4-pm.html#SP14_1">&#167;14.1</a><br/>Web Structure - <a href="8-ws.html#SP5_4_1_1">&#167;5.4.1.1</a>, <a href="8-ws.html#SP7">&#167;7</a><br/>Build Files - <a href="8-bf.html#SP9">&#167;9</a><br/>Simple Tangler - <a href="8-st.html#SP7_2_1">&#167;7.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">index</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">S</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">index</span><span class="plain-syntax"> &lt; </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="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-str.html#SP40" class="function-link"><span class="function-syntax">Streams::get_char_at_index</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">index</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -412,7 +412,7 @@ at those positions may well not be, of course.)
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Str::eq</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">Str::eq</span></span>:<br/>Debugging Log - <a href="2-dl.html#SP9">&#167;9</a><br/>Dictionaries - <a href="2-dct.html#SP7_3">&#167;7.3</a><br/>Pathnames - <a href="3-pth.html#SP3">&#167;3</a>, <a href="3-pth.html#SP8">&#167;8</a><br/>Filenames - <a href="3-fln.html#SP11">&#167;11</a><br/>Web Structure - <a href="8-ws.html#SP5_4">&#167;5.4</a>, <a href="8-ws.html#SP5_4_1_2">&#167;5.4.1.2</a>, <a href="8-ws.html#SP7_1">&#167;7.1</a><br/>Bibliographic Data for Webs - <a href="8-bdfw.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">) == </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">)) &amp;&amp; (</span><a href="4-sm.html#SP20" class="function-link"><span class="function-syntax">Str::cmp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2</span><span class="plain-syntax">) == </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="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-sm.html#SP20" class="function-link"><span class="function-syntax">Str::cmp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2</span><span class="plain-syntax">) == </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="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -422,7 +422,7 @@ at those positions may well not be, of course.)
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Str::ne</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">Str::ne</span></span>:<br/>Version Numbers - <a href="7-vn.html#SP8">&#167;8</a><br/>Build Files - <a href="8-bf.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">) != </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">)) || (</span><a href="4-sm.html#SP20" class="function-link"><span class="function-syntax">Str::cmp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2</span><span class="plain-syntax">) != </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="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-sm.html#SP20" class="function-link"><span class="function-syntax">Str::cmp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="identifier-syntax">S2</span><span class="plain-syntax">) != </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="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -435,15 +435,31 @@ at those positions may well not be, of course.)
alphabetic sorting, like <span class="extract"><span class="extract-syntax">strlen</span></span> in the C standard library.
</p>
<p class="commentary">This would be a more elegant implementation:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Str::cmp</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">Str::cmp</span></span>:<br/><a href="4-sm.html#SP19">&#167;19</a><br/>Time - <a href="3-tm.html#SP8">&#167;8</a><br/>Version Numbers - <a href="7-vn.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2</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">string_position</span><span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::start</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">), </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> = </span><a href="4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::start</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">.</span><span class="identifier-syntax">index</span><span class="plain-syntax"> &lt; </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="identifier-syntax">Q</span><span class="plain-syntax">.</span><span class="element-syntax">index</span><span class="plain-syntax"> &lt; </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="4-sm.html#SP11" class="function-link"><span class="function-syntax">Str::forward</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> = </span><a href="4-sm.html#SP11" class="function-link"><span class="function-syntax">Str::forward</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Q</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">d</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">) - (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Q</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">string_position</span><span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="function-syntax">Str::start</span><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">), </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> = </span><span class="function-syntax">Str::start</span><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">.</span><span class="identifier-syntax">index</span><span class="plain-syntax"> &lt; </span><span class="function-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="identifier-syntax">Q</span><span class="plain-syntax">.</span><span class="element-syntax">index</span><span class="plain-syntax"> &lt; </span><span class="function-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="function-syntax">Str::forward</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> = </span><span class="function-syntax">Str::forward</span><span class="plain-syntax">(</span><span class="identifier-syntax">Q</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">d</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="function-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">) - (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="function-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">Q</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">d</span><span class="plain-syntax"> != </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="identifier-syntax">d</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">) - </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="function-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">) - </span><span class="function-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">);</span>
</pre>
<p class="commentary">But profiling shows that the following speeds up the Inform 7 compiler by
around 1%.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Str::cmp</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">Str::cmp</span></span>:<br/><a href="4-sm.html#SP19">&#167;19</a><br/>Time - <a href="3-tm.html#SP8">&#167;8</a><br/>Version Numbers - <a href="7-vn.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">L1</span><span class="plain-syntax"> = </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">), </span><span class="identifier-syntax">L2</span><span class="plain-syntax"> = </span><a href="4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">), </span><span class="identifier-syntax">M</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L1</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">L2</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">M</span><span class="plain-syntax">) </span><span class="identifier-syntax">M</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L2</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">M</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">d</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) - (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">S2</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</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">d</span><span class="plain-syntax"> != </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="identifier-syntax">d</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">L1</span><span class="plain-syntax"> - </span><span class="identifier-syntax">L2</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Str::cmp_insensitive</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">Str::cmp_insensitive</span></span>:<br/><a href="4-sm.html#SP19">&#167;19</a><br/>Command Line Arguments - <a href="3-cla.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S1</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S2</span><span class="plain-syntax">) {</span>

Binary file not shown.

View file

@ -199,6 +199,11 @@ Eventually we're going to want the value. In principle we could be storing
values which are arbitrary pointers, so we have to use void pointers:
=
void *Dictionaries::value_for_entry(dict_entry *de) {
if (de) return de->value;
return NULL;
}
void *Dictionaries::read_value(dictionary *D, text_stream *key) {
if (D == NULL) return NULL;
if (D->textual) internal_error("textual dictionary accessed as pointy");

View file

@ -351,7 +351,7 @@ We provide both case sensitive and insensitive versions.
=
int Str::eq(text_stream *S1, text_stream *S2) {
if ((Str::len(S1) == Str::len(S2)) && (Str::cmp(S1, S2) == 0)) return TRUE;
if (Str::cmp(S1, S2) == 0) return TRUE;
return FALSE;
}
@ -361,7 +361,7 @@ int Str::eq_insensitive(text_stream *S1, text_stream *S2) {
}
int Str::ne(text_stream *S1, text_stream *S2) {
if ((Str::len(S1) != Str::len(S2)) || (Str::cmp(S1, S2) != 0)) return TRUE;
if (Str::cmp(S1, S2) != 0) return TRUE;
return FALSE;
}
@ -373,8 +373,8 @@ int Str::ne_insensitive(text_stream *S1, text_stream *S2) {
@ These two routines produce a numerical string difference suitable for
alphabetic sorting, like |strlen| in the C standard library.
=
int Str::cmp(text_stream *S1, text_stream *S2) {
This would be a more elegant implementation:
= (text as InC)
for (string_position P = Str::start(S1), Q = Str::start(S2);
(P.index < Str::len(S1)) && (Q.index < Str::len(S2));
P = Str::forward(P), Q = Str::forward(Q)) {
@ -382,6 +382,19 @@ int Str::cmp(text_stream *S1, text_stream *S2) {
if (d != 0) return d;
}
return Str::len(S1) - Str::len(S2);
=
But profiling shows that the following speeds up the Inform 7 compiler by
around 1%.
=
int Str::cmp(text_stream *S1, text_stream *S2) {
int L1 = Str::len(S1), L2 = Str::len(S2), M = L1;
if (L2 < M) M = L2;
for (int i=0; i<M; i++) {
int d = (int) Str::get_at(S1, i) - (int) Str::get_at(S2, i);
if (d != 0) return d;
}
return L1 - L2;
}
int Str::cmp_insensitive(text_stream *S1, text_stream *S2) {