From c06f69163d78aa58bd5b21b17dd826fbf7ce37fc Mon Sep 17 00:00:00 2001 From: anders_k Date: Tue, 14 Sep 2021 22:42:37 +0000 Subject: [PATCH] Force nightly fresh external files git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7324 212acab6-be3b-0410-9dea-997c60f758d6 --- Docs/src/bin/halibut/bk_xhtml.c | 1 + Docs/src/bin/halibut/halibut.h | 9 ++++ Docs/src/bin/halibut/input.c | 72 +++++++++++++++++++++++++------- Docs/src/bin/halibut/main.c | 3 ++ Docs/src/bin/halibut/malloc.c | 14 +++++++ Docs/src/bin/halibut/misc.c | 19 +++++++++ Docs/src/bin/halibut/ustring.c | 17 +++++++- Docs/src/config_web.but | 2 +- Docs/unreleased.png | Bin 2820 -> 5239 bytes 9 files changed, 121 insertions(+), 16 deletions(-) diff --git a/Docs/src/bin/halibut/bk_xhtml.c b/Docs/src/bin/halibut/bk_xhtml.c index de874fcb..6f71f5a5 100644 --- a/Docs/src/bin/halibut/bk_xhtml.c +++ b/Docs/src/bin/halibut/bk_xhtml.c @@ -864,6 +864,7 @@ xhtml_backend(paragraph * sourceform, keywordlist * in_keywords, sfree(conf.fsect[i].number_suffix); sfree(conf.fsect); } + free_ustr_slist(conf.meta_append); } static int xhtml_para_level(paragraph * p) diff --git a/Docs/src/bin/halibut/halibut.h b/Docs/src/bin/halibut/halibut.h index a0ab4c33..07abf19c 100644 --- a/Docs/src/bin/halibut/halibut.h +++ b/Docs/src/bin/halibut/halibut.h @@ -1,6 +1,10 @@ #ifndef HALIBUT_HALIBUT_H #define HALIBUT_HALIBUT_H +#ifdef _WIN32 +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + #include #include #include @@ -92,6 +96,7 @@ struct paragraph_Tag { void *private_data; /* for temp use in backends */ }; +#define initpara(p) ( (p).type = para_NotParaType, (p).keyword = NULL, (p).words = NULL ) enum { para_IM, /* index merge */ para_BR, /* bibliography rewrite */ @@ -232,6 +237,7 @@ void *smalloc(int size); void *srealloc(void *p, int size); void sfree(void *p); #endif +void free_list(void*p); void free_word_list(word * w); void free_para_list(paragraph * p); word *dup_word_list(word * w); @@ -256,11 +262,13 @@ wchar_t *ustrcpy(wchar_t * dest, const wchar_t * source); wchar_t utolower(wchar_t); int ustrcmp(const wchar_t * lhs, const wchar_t * rhs); int ustricmp(const wchar_t * lhs, const wchar_t * rhs); +void ultou(unsigned long v, wchar_t *o); int utoi(const wchar_t *); int utob(const wchar_t *); int uisdigit(wchar_t); wchar_t *ustrlow(wchar_t * s); wchar_t *ustrftime(wchar_t * fmt, struct tm *timespec); +#define free_ustr_slist free_list ustr_slist* ustr_slist_append(ustr_slist**headaddr, const wchar_t*str); /* @@ -321,6 +329,7 @@ struct tagWrappedLine { }; wrappedline *wrap_para(word *, int, int, int (*)(word *)); void wrap_free(wrappedline *); +unsigned long getutcunixtime(); /* * input.c diff --git a/Docs/src/bin/halibut/input.c b/Docs/src/bin/halibut/input.c index cca822e6..a4d1a149 100644 --- a/Docs/src/bin/halibut/input.c +++ b/Docs/src/bin/halibut/input.c @@ -175,12 +175,16 @@ enum { tok_rbrace /* } */ }; +#define tokiscmd(t,c) ( (t).type == tok_cmd && (t).cmd == (c) ) + /* Halibut command keywords. */ enum { c__invalid, /* invalid command */ c__comment, /* comment command (\#) */ c__escaped, /* escaped character */ + c__nop, /* no-op */ c__nbsp, /* nonbreaking space */ + c__midparacmd_unixnow, c_A, /* appendix heading */ c_B, /* bibliography entry */ c_BR, /* bibliography rewrite */ @@ -215,6 +219,13 @@ enum { c_versionid /* document RCS id */ }; +#define getcmdstyle(c) \ + (c) == c_c ? word_Code : \ + (c) == c_cw ? word_WeakCode : \ + (c) == c_e ? word_Emph : \ + word_Normal + + /* Perhaps whitespace should be defined in a more Unicode-friendly way? */ #define iswhite(c) ( (c)==32 || (c)==9 || (c)==13 || (c)==10 ) #define isnl(c) ( (c)==10 ) @@ -260,6 +271,7 @@ static void match_kw(token * tok) { "-", c__escaped} , /* nonbreaking hyphen */ + { ".", c__nop }, { "A", c_A} , /* appendix heading */ @@ -326,6 +338,7 @@ static void match_kw(token * tok) { "e", c_e} , /* emphasis */ + { "hackunixnow", c__midparacmd_unixnow }, { "i", c_i} , /* visible index mark */ @@ -474,7 +487,7 @@ token get_token(input * in) { /* tok_cmd */ c = get(in, &cpos); if (c == '-' || c == '\\' || c == '_' || - c == '#' || c == '{' || c == '}') + c == '#' || c == '{' || c == '}' || c == '.') { /* single-char command */ rdadd(&rs, (wchar_t)c); @@ -635,6 +648,36 @@ static paragraph *addpara(paragraph newpara, paragraph *** hptrptr) */ #define dtor(t) ( sfree(t.text) ) +static int is_special_midpara_cmd(token*t) +{ + return tokiscmd(*t, c__midparacmd_unixnow); +} + +static int handle_special_midpara_cmd(token*t, rdstring*rs, paragraph ***hptrptr) +{ + wchar_t wbuf[100]; + paragraph par; + + if (t->type != tok_cmd) return 0; + initpara(par); + par.fpos = t->pos; + switch(t->cmd) + { + case c__midparacmd_unixnow: + ultou(getutcunixtime(), wbuf); + rdadds(rs, wbuf); + return 1; + } + return 0; +} + +#define stack_item_push(stck__, sitype__) do { \ + struct stack_item *si__ = mknew(struct stack_item); \ + si__->type = sitype__; \ + stk_push((stck__), si__); \ + } while(!__LINE__) + + /* * Reads a single file (ie until get() returns EOF) */ @@ -644,7 +687,7 @@ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *m paragraph par; word wd, **whptr, **idximplicit; wchar_t utext[2], *wdtext; - int style, spcstyle; + int style, spcstyle, tmpstyle; int already; int iswhite, seenwhite; int type; @@ -883,12 +926,14 @@ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *m t.type == tok_word || t.type == tok_white || (t.type == tok_cmd && t.cmd == c__nbsp) || - (t.type == tok_cmd && t.cmd == c__escaped)) + (t.type == tok_cmd && t.cmd == c__escaped) || + /* TODO: Merge from upstream?: (t.type == tok_cmd && t.cmd == c_u) || */ + is_special_midpara_cmd(&t)) { if (t.type == tok_white || (t.type == tok_cmd && t.cmd == c__nbsp)) rdadd(&rs, ' '); - else + else if (!handle_special_midpara_cmd(&t, &rs, ret)) rdadds(&rs, t.text); } if (t.type != tok_rbrace) @@ -994,6 +1039,10 @@ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *m break; } + if (t.type == tok_cmd && t.cmd == c__nop) { + dtor(t), t = get_token(in); + continue; /* do nothing! */ + } if (t.type == tok_cmd && t.cmd == c__escaped) { t.type = tok_word; /* nice and simple */ @@ -1283,15 +1332,13 @@ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *m */ sitem = mknew(struct stack_item); sitem->type = stack_hyper; - if (t.type == tok_cmd && - (t.cmd == c_e || t.cmd == c_c || t.cmd == c_cw)) + if (t.type == tok_cmd && (tmpstyle = getcmdstyle(t.cmd))) { if (style != word_Normal) error(err_nestedstyles, &t.pos); else { - style = (t.cmd == c_c ? word_Code : - t.cmd == c_cw ? word_WeakCode : word_Emph); + style = tmpstyle; spcstyle = tospacestyle(style); sitem->type |= stack_style; } @@ -1326,8 +1373,7 @@ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *m error(err_explbr, &t.pos); } else { - style = (type == c_c ? word_Code : - type == c_cw ? word_WeakCode : word_Emph); + style = getcmdstyle(type); spcstyle = tospacestyle(style); sitem = mknew(struct stack_item); sitem->type = stack_style; @@ -1354,15 +1400,13 @@ static void read_file(paragraph *** ret, input * in, indexdata * idx, tree234 *m * Special cases: \i\c, \i\e, \i\cw */ wd.fpos = t.pos; - if (t.type == tok_cmd && - (t.cmd == c_e || t.cmd == c_c || t.cmd == c_cw)) + if (t.type == tok_cmd && (tmpstyle = getcmdstyle(t.cmd))) { if (style != word_Normal) error(err_nestedstyles, &t.pos); else { - style = (t.cmd == c_c ? word_Code : - t.cmd == c_cw ? word_WeakCode : word_Emph); + style = tmpstyle; spcstyle = tospacestyle(style); sitem->type |= stack_style; } diff --git a/Docs/src/bin/halibut/main.c b/Docs/src/bin/halibut/main.c index 2b413d9e..a80c0417 100644 --- a/Docs/src/bin/halibut/main.c +++ b/Docs/src/bin/halibut/main.c @@ -20,6 +20,9 @@ int main(int argc, char **argv) int errs; int reportcols; int debug; +#ifdef C_ASSERT + { C_ASSERT(!word_Normal); /* For getcmdstyle */ } +#endif initversionstring(); diff --git a/Docs/src/bin/halibut/malloc.c b/Docs/src/bin/halibut/malloc.c index 24cb6765..90ee658d 100644 --- a/Docs/src/bin/halibut/malloc.c +++ b/Docs/src/bin/halibut/malloc.c @@ -129,6 +129,20 @@ word *dup_word_list(word * w) return head; } +/* + * Free a generic linked list + */ +void free_list(void*p) +{ + void *s = p, *n; + for (; p; p = n) + { + n = *(void**) p; /* Assmumes next pointer is the first member! */ + if (n == s) n = NULL; /* Around the ring? */ + sfree(p); + } +} + /* * Free a linked list of words */ diff --git a/Docs/src/bin/halibut/misc.c b/Docs/src/bin/halibut/misc.c index 5fad528d..83d4ba78 100644 --- a/Docs/src/bin/halibut/misc.c +++ b/Docs/src/bin/halibut/misc.c @@ -2,6 +2,7 @@ * misc.c: miscellaneous useful items */ #include +#include #include "halibut.h" struct stackTag { @@ -355,3 +356,21 @@ void wrap_free(wrappedline * w) w = t; } } + +unsigned long getutcunixtime() +{ +#ifndef _WIN32 + struct timespec ts; + ts.tv_sec = 0; + /* gettimeofday()? */ +#if (_XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 199309L) + if (0 == clock_gettime(CLOCK_REALTIME, &ts)) + return ts.tv_sec; +#endif +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + if (timespec_get(&ts, TIME_UTC)) /* implementation defined epoch :( */ + return ts.tv_sec; +#endif +#endif /*~ _WIN32 */ + return (unsigned long) time(NULL); +} diff --git a/Docs/src/bin/halibut/ustring.c b/Docs/src/bin/halibut/ustring.c index b4e0a050..63c68dbd 100644 --- a/Docs/src/bin/halibut/ustring.c +++ b/Docs/src/bin/halibut/ustring.c @@ -2,9 +2,17 @@ * ustring.c: Unicode string routines */ +#include "halibut.h" #include #include -#include "halibut.h" +#include + +static void asciitou(wchar_t *dest, const char *src) +{ + for (;;) + if (!(*dest++ = *src++)) + break; +} wchar_t *ustrdup(const wchar_t * s) { @@ -119,6 +127,13 @@ wchar_t *ustrlow(wchar_t * s) return s; } +void ultou(unsigned long v, wchar_t *o) +{ + char buf[42]; + sprintf(buf, "%lu", v); + asciitou(o, buf); +} + int utoi(const wchar_t *s) { int sign = +1; diff --git a/Docs/src/config_web.but b/Docs/src/config_web.but index c9d7555f..bed94434 100644 --- a/Docs/src/config_web.but +++ b/Docs/src/config_web.but @@ -11,6 +11,6 @@ \cfg{xhtml-contents-depth-0}{3} -\cfg{xhtml-head-end}{} +\cfg{xhtml-head-end}{} \cfg{xhtml-body-end}{SourceForge Logo} diff --git a/Docs/unreleased.png b/Docs/unreleased.png index f3d4a719396d4fdd5aa87414526692d2166bbb6e..3e61a9753deb6f1820dbb58d01357e67fd4e708e 100644 GIT binary patch literal 5239 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 literal 2820 zcmd5;30IRx7k=4P#7F{Vkyrvzf&xMa$fA`sSlJXpuuwE4L8Kze4gw8^BJc(UH31BQ zMNxJ{Qbffz0wzF}K%~V2vMCVu#ju1WEPeTYM9(+p%$YlPnfsiX=gthn^M?g#+LdhL>fG`PEprqEy%<>V9P7!gQ`x)gdGNe)rJLMY*07@#` zUFNU;#C1q1A7t-t4*;CoO6wE_XzuCZMs(WR+7gLGo12>(8yky@i}UmI3kwVD>+52% zSR#=uEiJ9Ct}ZVxOQq7awY8O%m9JmFj*X3tkB`sJ&Q48DjgF2^PEO9v%}q~FPfSeA z%*;&YMU6uMHl6YI#A~GK1{p;t)myBz#G-}b2ZQAQzU6Zh8n61LB>|uA0-*oh&cT5# z2mj$GG{zCV^9_BhBcJ&rcDz|_X_a*80Qyr$^P{csbKswH1V~sqfqrjz5k=UXC{RLN zd8NS0lJ?PJuj!)Gyaf*XQZMa$rYyx10kv#%iP?_=-pA+g4p^+`!mtkg367Lc0uNDO z#g9f_QI&`0Qr@*%qj_k9!^+4PWXUN~`)CTNaz7Y!Y|?U5^C@@LUvR*0B;~OV(iuPU zc)$8HY3Rw8eaf+(e%Rc|s}31LUp+*$n* zH@zp!ESu1QdwfroA9uJ{+il&-s* zYP;%QPbDRcS8V8`{1CCKxVj*1v*8=JCYi#jV@GSdoHWteq%~t%w1F(q^JuQjXZ1Jj zN{HzCt@L=r7J|E?;3J7kNvOI3p+I?^LUp(v188RUL#?mirah>~G8hAAKu}eFSRIAx zNi^BAJio0T`hGEj$DvfHf2T9Sv9bubNL^Kg^4`=yeQ($IZN-9i^;d~d51_2G8sMJG z2<}0*vzM>14KdlcsNwW}DZAcyLDe*#!4{PD$dY5uY7fpPD2k?@!%gES))dQ!SkHcH zciv}kma|-N;X1rSx}kAZ-NlXc;BWYehlTS5wi~{``f*!)hz;nRKEo}UGm6ut63Spe z{&LwZ6!OBwqU&5o43(GCHFATS_X9_YUe)n^Iby_)D7KZWucXE9Vu$g%SCmZRRp&0Bp*7J{K;ow(aiXa>P}S zUa+Q9z=iqf(2$=y^?PBG{s0qvAJX+|%$pVXo|$6_xx~blT3V z7kP2+gBzQBPIopVgU-n95BKx*c9|72HPEveB1%f>efgas?Gv1V;Kb7;(8?q@@vuuYj!x6nW=%jC(Ra<f{~yK@u5%7j_tU zW}s!9cPUu~@;?J>EJ4##iSHA89^(0xe|@<_eE*9t!M6&T1p$j|R3Z3yenin}y^wXJ zNXD{c%@K-YX&nD#ULj4}p@+tppo@d)bp?=rch3G1k%-$Bu1occSU*C$;^AUidi|W9 zvZYXd)Py=eKib-w@IuaR!Eq4vO0;Zeb_qY$iKI|*Dje| zn+F)*xY=dE=zjQwe*eC+6OW3SSnml#TO8^Sv-Ea8476EuU!B2FlL-w5<;>;~yZ(yv z>+l2AWabxmw)x)hCQ`-PO>zMUb4l$n=To|?b0Y;yCJ1B}8dGa7QM>GsJ!N9Rurf7M zckKXFH)_baBspkL7jC8bc5W_W++T{Hv@^ljcZAEl3v0{s*W`Ckt+vDGn6|sKHno4; z<4PUuK1xkuZtS}=OIJE2R>`i_Zf|HcP(2pf+@8nZ>PY zbA$v!$h8jw@)nYB(@JcXW0n5?@=jGU4K4A_VXMKTKh_0uXMT8RgOC~p7}Hg~S*g)Z zN@KPyV0Tb%nxd-*tc;3#YB)j@{>Bobeo)~EBgTWClMMpnrG0uP`ie=L^=3Q(bFBO1rfHy|MB?!hgk0I+rm{_xTobeCN@{S1mTSr z8igt@Z(1ln-&aSUZuKDu>=>qQR($=r04HS2%A)Hn@LqtmGA;Q`(XNNO*_yx+QM3MqonTp( z=3Cbk!mC#CX6ZXwqovnjx4?v)FPWI)h@D2@1IQdM z#5I@FbJJxo>=|GlRw3`iulCwnF|`pNp|TT_Qg|p=Skx7#J0vc$44G^Z z0|KI!wnQ*4+QSJ8IgzOrR{Vmj5)Hj|`j_9~jrQjOeFCB(c`{$?A9&hkR}j8axuX|( zRIa?t1TPl`)&~3J48~i;E~Av~px6F*jdWyluBuA{R586M1dM z{wL8x?h&?c<}xypc?QKlxMK00H1k6+#jrx={BkT6AL8*Ide#