From 0a6ebc60f0b8aacf8b01e14bd9b6447c750edeb5 Mon Sep 17 00:00:00 2001 From: Udo Date: Mon, 31 Jan 2022 00:42:16 +0000 Subject: [PATCH] precompile on startup --- doc/areas/noise.txt | 1 + doc/pages/gen_sha1.txt | 3 + examples/blog/LICENSE.txt | 19 + examples/blog/browserconfig.xml | 12 + examples/blog/css/main.css | 263 +++++++++++++ examples/blog/css/normalize.css | 349 ++++++++++++++++++ examples/blog/favicon.ico | Bin 0 -> 766 bytes examples/blog/humans.txt | 15 + examples/blog/icon.png | Bin 0 -> 4029 bytes examples/blog/img/.gitignore | 0 examples/blog/index.uce | 7 +- examples/blog/js/main.js | 0 examples/blog/js/plugins.js | 24 ++ .../blog/js/vendor/modernizr-3.11.2.min.js | 3 + examples/blog/{lib.uce => lib/site.uce} | 2 +- examples/blog/pages/page.html.uce | 47 +++ examples/blog/robots.txt | 5 + examples/blog/site.webmanifest | 12 + examples/blog/tile-wide.png | Bin 0 -> 1854 bytes examples/blog/tile.png | Bin 0 -> 3482 bytes scripts/compile | 6 + src/lib/compiler.cpp | 138 ++++--- src/lib/compiler.h | 7 + src/lib/functionlib.cpp | 10 + src/lib/functionlib.h | 1 + src/lib/sys.cpp | 2 +- src/lib/types.cpp | 4 + src/lib/types.h | 8 +- src/linux_fastcgi.cpp | 46 ++- test/random.uce | 6 +- test/working-dir.uce | 2 +- 31 files changed, 930 insertions(+), 62 deletions(-) create mode 100644 examples/blog/LICENSE.txt create mode 100644 examples/blog/browserconfig.xml create mode 100644 examples/blog/css/main.css create mode 100644 examples/blog/css/normalize.css create mode 100644 examples/blog/favicon.ico create mode 100644 examples/blog/humans.txt create mode 100644 examples/blog/icon.png create mode 100644 examples/blog/img/.gitignore create mode 100644 examples/blog/js/main.js create mode 100644 examples/blog/js/plugins.js create mode 100644 examples/blog/js/vendor/modernizr-3.11.2.min.js rename examples/blog/{lib.uce => lib/site.uce} (86%) create mode 100644 examples/blog/pages/page.html.uce create mode 100644 examples/blog/robots.txt create mode 100644 examples/blog/site.webmanifest create mode 100644 examples/blog/tile-wide.png create mode 100644 examples/blog/tile.png diff --git a/doc/areas/noise.txt b/doc/areas/noise.txt index cc9cdfe..1e40100 100644 --- a/doc/areas/noise.txt +++ b/doc/areas/noise.txt @@ -7,3 +7,4 @@ gen_noise32 gen_noise64 gen_float gen_int +gen_sha1 diff --git a/doc/pages/gen_sha1.txt b/doc/pages/gen_sha1.txt index 98181b7..d992497 100644 --- a/doc/pages/gen_sha1.txt +++ b/doc/pages/gen_sha1.txt @@ -8,3 +8,6 @@ return value : the resulting hash value :desc Returns the sha1 hash of 's'. + +:see +>noise diff --git a/examples/blog/LICENSE.txt b/examples/blog/LICENSE.txt new file mode 100644 index 0000000..294e91d --- /dev/null +++ b/examples/blog/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) HTML5 Boilerplate + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/examples/blog/browserconfig.xml b/examples/blog/browserconfig.xml new file mode 100644 index 0000000..e5a529d --- /dev/null +++ b/examples/blog/browserconfig.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/examples/blog/css/main.css b/examples/blog/css/main.css new file mode 100644 index 0000000..416a37e --- /dev/null +++ b/examples/blog/css/main.css @@ -0,0 +1,263 @@ +/*! HTML5 Boilerplate v8.0.0 | MIT License | https://html5boilerplate.com/ */ + +/* main.css 2.1.0 | MIT License | https://github.com/h5bp/main.css#readme */ +/* + * What follows is the result of much research on cross-browser styling. + * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, + * Kroc Camen, and the H5BP dev community and team. + */ + +/* ========================================================================== + Base styles: opinionated defaults + ========================================================================== */ + +html { + color: #222; + font-size: 1em; + line-height: 1.4; +} + +/* + * Remove text-shadow in selection highlight: + * https://twitter.com/miketaylr/status/12228805301 + * + * Vendor-prefixed and regular ::selection selectors cannot be combined: + * https://stackoverflow.com/a/16982510/7133471 + * + * Customize the background color to match your design. + */ + +::-moz-selection { + background: #b3d4fc; + text-shadow: none; +} + +::selection { + background: #b3d4fc; + text-shadow: none; +} + +/* + * A better looking default horizontal rule + */ + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +/* + * Remove the gap between audio, canvas, iframes, + * images, videos and the bottom of their containers: + * https://github.com/h5bp/html5-boilerplate/issues/440 + */ + +audio, +canvas, +iframe, +img, +svg, +video { + vertical-align: middle; +} + +/* + * Remove default fieldset styles. + */ + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +/* + * Allow only vertical resizing of textareas. + */ + +textarea { + resize: vertical; +} + +/* ========================================================================== + Author's custom styles + ========================================================================== */ + +/* ========================================================================== + Helper classes + ========================================================================== */ + +/* + * Hide visually and from screen readers + */ + +.hidden, +[hidden] { + display: none !important; +} + +/* + * Hide only visually, but have it available for screen readers: + * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility + * + * 1. For long content, line feeds are not interpreted as spaces and small width + * causes content to wrap 1 word per line: + * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe + */ + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; + width: 1px; + /* 1 */ +} + +/* + * Extends the .sr-only class to allow the element + * to be focusable when navigated to via the keyboard: + * https://www.drupal.org/node/897638 + */ + +.sr-only.focusable:active, +.sr-only.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + white-space: inherit; + width: auto; +} + +/* + * Hide visually and from screen readers, but maintain layout + */ + +.invisible { + visibility: hidden; +} + +/* + * Clearfix: contain floats + * + * For modern browsers + * 1. The space content is one way to avoid an Opera bug when the + * `contenteditable` attribute is included anywhere else in the document. + * Otherwise it causes space to appear at the top and bottom of elements + * that receive the `clearfix` class. + * 2. The use of `table` rather than `block` is only necessary if using + * `:before` to contain the top-margins of child elements. + */ + +.clearfix::before, +.clearfix::after { + content: " "; + display: table; +} + +.clearfix::after { + clear: both; +} + +/* ========================================================================== + EXAMPLE Media Queries for Responsive Design. + These examples override the primary ('mobile first') styles. + Modify as content requires. + ========================================================================== */ + +@media only screen and (min-width: 35em) { + /* Style adjustments for viewports that meet the condition */ +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 1.25dppx), + (min-resolution: 120dpi) { + /* Style adjustments for high resolution devices */ +} + +/* ========================================================================== + Print styles. + Inlined to avoid the additional HTTP request: + https://www.phpied.com/delay-loading-your-print-css/ + ========================================================================== */ + +@media print { + *, + *::before, + *::after { + background: #fff !important; + color: #000 !important; + /* Black prints faster */ + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]::after { + content: " (" attr(href) ")"; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + /* + * Don't show links that are fragment identifiers, + * or use the `javascript:` pseudo protocol + */ + a[href^="#"]::after, + a[href^="javascript:"]::after { + content: ""; + } + + pre { + white-space: pre-wrap !important; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + /* + * Printing Tables: + * https://web.archive.org/web/20180815150934/http://css-discuss.incutio.com/wiki/Printing_Tables + */ + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } +} + diff --git a/examples/blog/css/normalize.css b/examples/blog/css/normalize.css new file mode 100644 index 0000000..192eb9c --- /dev/null +++ b/examples/blog/css/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/examples/blog/favicon.ico b/examples/blog/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..be74abd69ad6a32de7375df13cab9354798e328f GIT binary patch literal 766 zcmc(dze~eV5XUd2fg&jH87YDYDQKxq1{4b-_ydP-wqS9vgGh17QXQQAwOE{VaBvi* zmu^z9t({y-&1ey8Y_x;?x+`BviV9;aRjMgZ8M*!jgkRrFqSI9;F zHyfX@Az|AvVmn~YWWZP`0&JWEY~BFm?*Vq}VD7&_%x%MP$p`D`4JMC!K|B7pt?Mmp zUJAB7rxMXS6=!P+AtLU9V)J#61WPxwipRXCHO{BJ`l{m53#=t97a!znv~vfmr|AaP zRGIT7#0FyJy3Z*hL{GQp-0TRhX8UzZ)+>%?mK0^goaX4Q;x -- -- + +# THANKS + + + +# TECHNOLOGY COLOPHON + + CSS3, HTML5 + Apache Server Configs, jQuery, Modernizr, Normalize.css diff --git a/examples/blog/icon.png b/examples/blog/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8a42581d4a2a2a28bee1888835d21ffe4d6378d0 GIT binary patch literal 4029 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 - Hello world23 - - + render_file("pages/page.html.uce"); } diff --git a/examples/blog/js/main.js b/examples/blog/js/main.js new file mode 100644 index 0000000..e69de29 diff --git a/examples/blog/js/plugins.js b/examples/blog/js/plugins.js new file mode 100644 index 0000000..feb7d19 --- /dev/null +++ b/examples/blog/js/plugins.js @@ -0,0 +1,24 @@ +// Avoid `console` errors in browsers that lack a console. +(function() { + var method; + var noop = function () {}; + var methods = [ + 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', + 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', + 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', + 'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn' + ]; + var length = methods.length; + var console = (window.console = window.console || {}); + + while (length--) { + method = methods[length]; + + // Only stub undefined methods. + if (!console[method]) { + console[method] = noop; + } + } +}()); + +// Place any jQuery/helper plugins in here. diff --git a/examples/blog/js/vendor/modernizr-3.11.2.min.js b/examples/blog/js/vendor/modernizr-3.11.2.min.js new file mode 100644 index 0000000..feada51 --- /dev/null +++ b/examples/blog/js/vendor/modernizr-3.11.2.min.js @@ -0,0 +1,3 @@ +/*! modernizr 3.11.2 (Custom Build) | MIT * + * https://modernizr.com/download/?-cssanimations-csscolumns-customelements-flexbox-history-picture-pointerevents-postmessage-sizes-srcset-webgl-websockets-webworkers-addtest-domprefixes-hasevent-mq-prefixedcssvalue-prefixes-setclasses-testallprops-testprop-teststyles !*/ +!function(e,t,n,r){function o(e,t){return typeof e===t}function i(e){var t=_.className,n=Modernizr._config.classPrefix||"";if(S&&(t=t.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}Modernizr._config.enableClasses&&(e.length>0&&(t+=" "+n+e.join(" "+n)),S?_.className.baseVal=t:_.className=t)}function s(e,t){if("object"==typeof e)for(var n in e)k(e,n)&&s(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),o=Modernizr[r[0]];if(2===r.length&&(o=o[r[1]]),void 0!==o)return Modernizr;t="function"==typeof t?t():t,1===r.length?Modernizr[r[0]]=t:(!Modernizr[r[0]]||Modernizr[r[0]]instanceof Boolean||(Modernizr[r[0]]=new Boolean(Modernizr[r[0]])),Modernizr[r[0]][r[1]]=t),i([(t&&!1!==t?"":"no-")+r.join("-")]),Modernizr._trigger(e,t)}return Modernizr}function a(){return"function"!=typeof n.createElement?n.createElement(arguments[0]):S?n.createElementNS.call(n,"http://www.w3.org/2000/svg",arguments[0]):n.createElement.apply(n,arguments)}function l(){var e=n.body;return e||(e=a(S?"svg":"body"),e.fake=!0),e}function u(e,t,r,o){var i,s,u,f,c="modernizr",d=a("div"),p=l();if(parseInt(r,10))for(;r--;)u=a("div"),u.id=o?o[r]:c+(r+1),d.appendChild(u);return i=a("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(n.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),s=t(d,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=f,_.offsetHeight):d.parentNode.removeChild(d),!!s}function f(e,n,r){var o;if("getComputedStyle"in t){o=getComputedStyle.call(t,e,n);var i=t.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!n&&e.currentStyle&&e.currentStyle[r];return o}function c(e,t){return!!~(""+e).indexOf(t)}function d(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function p(e,n){var o=e.length;if("CSS"in t&&"supports"in t.CSS){for(;o--;)if(t.CSS.supports(d(e[o]),n))return!0;return!1}if("CSSSupportsRule"in t){for(var i=[];o--;)i.push("("+d(e[o])+":"+n+")");return i=i.join(" or "),u("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"===f(e,null,"position")})}return r}function m(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function h(e,t,n,i){function s(){u&&(delete N.style,delete N.modElem)}if(i=!o(i,"undefined")&&i,!o(n,"undefined")){var l=p(e,n);if(!o(l,"undefined"))return l}for(var u,f,d,h,A,v=["modernizr","tspan","samp"];!N.style&&v.length;)u=!0,N.modElem=a(v.shift()),N.style=N.modElem.style;for(d=e.length,f=0;f + Hello + + return(0); +} + +RENDER() +{ + <> + + + + + + + + + + + + + + + + + + + + + + + + get["view"], "default")) + ".uce"; + if(file_exists(view_name)) + render_file(view_name); + else + print("view not found"); + ?> + + + + +} diff --git a/examples/blog/robots.txt b/examples/blog/robots.txt new file mode 100644 index 0000000..d0e5f1b --- /dev/null +++ b/examples/blog/robots.txt @@ -0,0 +1,5 @@ +# www.robotstxt.org/ + +# Allow crawling of all content +User-agent: * +Disallow: diff --git a/examples/blog/site.webmanifest b/examples/blog/site.webmanifest new file mode 100644 index 0000000..222ae16 --- /dev/null +++ b/examples/blog/site.webmanifest @@ -0,0 +1,12 @@ +{ + "short_name": "", + "name": "", + "icons": [{ + "src": "icon.png", + "type": "image/png", + "sizes": "192x192" + }], + "start_url": "/?utm_source=homescreen", + "background_color": "#fafafa", + "theme_color": "#fafafa" +} diff --git a/examples/blog/tile-wide.png b/examples/blog/tile-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd739c7da5f47f6f36c9de6163cab77b534da6a GIT binary patch literal 1854 zcmZ`)X;{+P9!4}nOoMyJ1;#}FD2-joEyO(_Br$T!oJSlK#qEMinxiFZ%2lJ(a$HhV z(~P>gj^wgz*#KsaL{dN)HT+y> z945;bC}d*rW`HmhG>^mF!U@z zU0jzNJN`H|kCHgI@e__1b!V>cz2rNe|~K!jU7}>hz&fJTy-ISoHarB)dMH;p#;gYZTJz ziUP;y60>d2h}OZ35EM9VBr5KpN|nnD8YGA=;6XsRNf_&2iLY1&U}APjK;&F`@F69V z&1WKm5(pbJdoB<2Di;RZUAdRtzo*B^_+2WNHo$GE=OIl&ac*)nsI^zFjg5d`PD^eT zoJiBkJ+q~KFH<)b(scW0=w*;5E;y+fZGYm}J-uPz8_ZL~mU;%GinAJ^o9oS$_n^DU z*|ut977ixgU>48_@zM!U1pK(DN(^YL*c=#Qd6<9JA565s(}%jRTSm0@ihi}allXp1 z8;dQ@MX`xfs~Z5?>tLabX_#8g9ISceZ^B*J%1bzD^?bCz78NUu zPI91_b$(ETz)y0>lspJLEbu3RuBj>sphRRt;A~Bj1RWeXf&H2+(D#RUzp-wgp7cM1 zLj$hcd%SBGfg*ckP_qata%^YW9--vm)ULp~3`rb>zpeM*t4AlXM1c|jt%{%b8c2u& zh-Bf!^D%N>vN7c`+p+i)`T1DSxR~yQo;3RU`SoCKhJeSG$M{{_a1~rg_gY$L@@9@= z*qR<4?SAs4?SK{-!#g!zu+!gUGv#IyHL7W)>3%DT&WT zM)|7XIvix)7_4+R=tqBLiSRl{2Olg+X{6psqiu%eg7+?S1NTk#?AB9TzIgt)0bVu& z#xkb{dYk%%oiSrh8YS^XuMHDQpxn@+M@A4A4ou#X$+9u1rtB|W$-UFBxjeM2Pjp3?Ko7h9f1 z=S!-1pNr5Fvz;~7vje?C-X?;;e5xZv*;)s%B~dY5f!Jw!o zT@c~<>rcX|19q33zxQoET;i+Mxo-qgkpg(<7IW_WdS7JX>;jC!js#?PQj< zDDtc^%BMj=y(~Uj?v6Y=ibEziO>q|Ymm^B!|6SbGPuLkRs>^PG+pket6*^b{Jl8^H zH{BvIQ7>TA1GHR04&59g^rvNjP3Vp)nvE1$c{8N;K(1V>{uRBkvUnC#DAM~)w8dJ>;*v{dWy>0RzDuqWKHdltkfKQj= zdsGx{KS&dEM!n)uy5mmJ&Ks0|6Pu;$@XaGm(v_dKHmU+HZyfT)3^q9Xg6KM8=L># zG_mH$>VP2hZ2yOJTCI?n%*r<~KkG6A=?7ksXbcm*JnBW%U;jAD%C1V-O&(spc;(if NjOOA_X(Y4w{{!#vJbVBE literal 0 HcmV?d00001 diff --git a/examples/blog/tile.png b/examples/blog/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..f820f61a0b95dd42dca6cbd06ca08ed4e1ef098a GIT binary patch literal 3482 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 literal 0 HcmV?d00001 diff --git a/scripts/compile b/scripts/compile index 64f194d..0fba5f6 100755 --- a/scripts/compile +++ b/scripts/compile @@ -9,6 +9,8 @@ SRC_FN="$3" PP_FN="$4" SO_FN="$5" +LINK_OBJECTS="$6" + #echo "Source Dir: $SRC_DIR" #echo "Dest Dir: $DEST_DIR" #echo "Source File: $SRC_FN" @@ -32,6 +34,10 @@ SRCFLAGS="-D PLATFORM_NAME=\"linux\"" # echo "Compliling executable..." $COMPILER "$DEST_DIR/$PP_FN" $SRCFLAGS $FLAGS $LIBS -o "$DEST_DIR/$SO_FN" +# separate .o file +#$COMPILER -c "$DEST_DIR/$PP_FN" $SRCFLAGS $FLAGS $LIBS -o "$DEST_DIR/$PP_FN.o" +#$COMPILER "$DEST_DIR/$PP_FN.o" "$LINK_OBJECTS" $SRCFLAGS $FLAGS $LIBS -o "$DEST_DIR/$SO_FN" + if [ $? -eq 0 ] then # ls -lh "$DEST_DIR" diff --git a/src/lib/compiler.cpp b/src/lib/compiler.cpp index 1360ee3..4be7395 100644 --- a/src/lib/compiler.cpp +++ b/src/lib/compiler.cpp @@ -159,13 +159,14 @@ String preprocess_shared_unit_char_wise(Request* context, SharedUnit* su, String pc.append("#include \"" + sub_su->bin_path + "/" + sub_su->pre_file_name + "\"\n"); } } - else if(current_line.length() == 4 && current_line.substr(0, 4) == "API ") + else if(false && current_line.substr(0, 6) == "EXPORT" && isspace(current_line[6])) { auto end_declaration_pos = content.find("{", i); if(end_declaration_pos != std::string::npos) { // remove string "API " from output - pc.resize(pc.length() - 4); + //pc.resize(pc.length() - 7); + pc.append(1, '\n'); String declaration = trim(content.substr(i, end_declaration_pos - i)); String return_type_and_name = nibble(declaration, "("); StringList rtn_list = split_space(return_type_and_name); @@ -208,7 +209,7 @@ void setup_unit_paths(Request* context, SharedUnit* su, String file_name) su->pre_file_name = su->src_file_name + ".cpp"; su->so_name = su->bin_path + "/" + su->bin_file_name; - su->api_file_name = su->bin_path + "/" + su->src_file_name + ".api.txt"; + su->api_file_name = su->bin_path + "/" + su->src_file_name + ".exports.txt"; su->setup_file_name = su->bin_path + "/" + su->src_file_name + ".setup.h"; } @@ -224,7 +225,7 @@ void load_shared_unit(Request* context, SharedUnit* su, String file_name) { if(su->opt_so_optional) return; - printf("(i) unit file not found: %s\n", su->so_name.c_str()); + //printf("(i) unit file not found: %s\n", su->so_name.c_str()); su->compiler_messages = "unit file not found"; return; } @@ -235,11 +236,11 @@ void load_shared_unit(Request* context, SharedUnit* su, String file_name) su->last_compiled = file_mtime(su->so_name); char *error; su->on_setup = (request_handler)dlsym(su->so_handle, "set_current_request"); - su->on_render = (call_handler)dlsym(su->so_handle, "render"); if ((error = dlerror()) != NULL) printf("Error - %s in %s\n", error, su->file_name.c_str()); - else - printf("(i) loaded unit %s\n", su->file_name.c_str()); + su->on_render = (call_handler)dlsym(su->so_handle, "render"); + //else + // printf("(i) loaded unit %s\n", su->file_name.c_str()); } else { @@ -253,7 +254,7 @@ String compile_setup_file(Request* context, SharedUnit* su) String("#ifndef UCE_LIB_INCLUDED\n") + "#define UCE_LIB_INCLUDED\n" + ("#include \"")+context->server->config.COMPILER_SYS_PATH +"/src/lib/uce_lib.h\" \n"+ - file_get_contents(context->server->config.SETUP_TEMPLATE) + + file_get_contents(context->server->config.COMPILER_SYS_PATH + "/" + context->server->config.SETUP_TEMPLATE) + "#endif \n"; StringList declarations; StringList load_units; @@ -296,7 +297,7 @@ void compile_shared_unit(Request* context, SharedUnit* su, String file_name) else { load_shared_unit(context, su, file_name); - printf("(i) compiled unit %s\n", file_name.c_str()); + //printf("(i) compiled unit %s\n", file_name.c_str()); } } @@ -356,52 +357,18 @@ SharedUnit* get_shared_unit(Request* context, String file_name, bool opt_so_opti return(su); } -void compiler_invoke(Request* context, String file_name, DTree& call_param) -{ - - if(file_name[0] != '/') - { - file_name = expand_path(file_name); - } - //printf("(i) invoke %s\n", file_name.c_str()); - - //printf("(i) invoke(%s)\n", file_name.c_str()); - switch_to_system_alloc(); - auto su = get_shared_unit(context, file_name); - switch_to_arena(context->mem); - if(!su) - { - printf("Error loading unit %s\n", file_name.c_str()); - print("Error loading unit: "+file_name); - } - else if(su->compiler_messages.length() > 0) - { - context->header["Content-Type"] = "text/plain"; - print(su->compiler_messages); - } - else if(!su->on_render) - { - context->header["Content-Type"] = "text/plain"; - print("no RENDER() entry point"); - } - else - { - String prev_wd = get_cwd(); - set_cwd(su->src_path); - su->on_setup(context); - su->on_render(call_param); - set_cwd(prev_wd); - } -} - SharedUnit* compiler_load_shared_unit(Request* context, String file_name, String current_path, bool opt_so_optional) { + context->stats.invoke_count++; + if(file_name[0] != '/') { file_name = expand_path(file_name, current_path); } + //printf("(i) load '%s'\n", file_name.c_str()); + switch_to_system_alloc(); auto su = get_shared_unit(context, file_name, opt_so_optional); switch_to_arena(context->mem); @@ -413,7 +380,8 @@ SharedUnit* compiler_load_shared_unit(Request* context, String file_name, String } else if(su->compiler_messages.length() > 0) { - context->header["Content-Type"] = "text/plain"; + if(context->stats.invoke_count == 1) + context->header["Content-Type"] = "text/plain"; print(su->compiler_messages); return(0); } @@ -424,3 +392,77 @@ SharedUnit* compiler_load_shared_unit(Request* context, String file_name, String } +void compiler_invoke(Request* context, String file_name, DTree& call_param) +{ + auto su = compiler_load_shared_unit(context, file_name, "", false); + if(su) + { + if(!su->on_setup) + { + if(context->stats.invoke_count == 1) + context->header["Content-Type"] = "text/plain"; + print("internal error: set_current_request() not defined in", file_name, "\n"); + } + else if(!su->on_render) + { + if(context->stats.invoke_count == 1) + context->header["Content-Type"] = "text/plain"; + print("no RENDER() entry point"); + } + else + { + String prev_wd = get_cwd(); + set_cwd(su->src_path); + su->on_setup(context); + su->on_render(call_param); + set_cwd(prev_wd); + } + } +} + +void render_file(String file_name) +{ + //printf("(i) render_file(%s)\n", file_name.c_str()); + DTree call_param; + compiler_invoke(context, file_name, call_param); +} + +void render_file(String file_name, DTree& call_param) +{ + compiler_invoke(context, file_name, call_param); +} + +DTree* call_file_function(String file_name, String function_name, DTree* call_param) +{ + DTree* result; + auto su = compiler_load_shared_unit(context, file_name, "", false); + if(su && su->so_handle) + { + if(!su->on_setup) + { + print("internal error: set_current_request() not defined in", file_name, "\n"); + } + else + { + auto f = (dtree_call_handler)dlsym(su->so_handle, function_name.c_str()); + if(!f) + { + print("Error: call_file_function() function '", function_name, "' not found"); + } + else + { + String prev_wd = get_cwd(); + set_cwd(su->src_path); + su->on_setup(context); + result = f(call_param); + set_cwd(prev_wd); + } + } + } + else + { + print("Error: call_file_function() could not load unit file '", file_name, "'"); + } + return(result); +} + diff --git a/src/lib/compiler.h b/src/lib/compiler.h index 4263e6c..b43d6ba 100644 --- a/src/lib/compiler.h +++ b/src/lib/compiler.h @@ -1,4 +1,5 @@ #define RENDER() extern "C" void render(DTree& call) +#define EXPORT extern "C" String process_html_literal(Request* context, SharedUnit* su, String content); String preprocess_shared_unit(Request* context, SharedUnit* su); @@ -8,3 +9,9 @@ void compile_shared_unit(Request* context, SharedUnit* su, String file_name); SharedUnit* get_shared_unit(Request* context, String file_name, bool opt_so_optional = false); void compiler_invoke(Request* context, String file_name, DTree& call_param); SharedUnit* compiler_load_shared_unit(Request* context, String file_name, String current_path, bool opt_so_optional = false); + +void render_file(String file_name); +void render_file(String file_name, DTree& call_param); +DTree* call_file_function(String file_name, String function_name, DTree* call_param = 0); + +StringList precompile_jobs; diff --git a/src/lib/functionlib.cpp b/src/lib/functionlib.cpp index e986b36..fb2d63b 100644 --- a/src/lib/functionlib.cpp +++ b/src/lib/functionlib.cpp @@ -533,3 +533,13 @@ String ob_get_close() return(result); } +String safe_name(String raw) +{ + String result = ""; + for(auto c : raw) + { + if(isalnum(c) || c == '_') + result.append(1, c); + } + return(result); +} diff --git a/src/lib/functionlib.h b/src/lib/functionlib.h index edd0de8..857d9c4 100644 --- a/src/lib/functionlib.h +++ b/src/lib/functionlib.h @@ -60,5 +60,6 @@ void ob_start(); void ob_clear(); String ob_get_clear(); String ob_get(); +String safe_name(String raw); #define is_bit_set(var,pos) ((var) & (1<<(pos))) diff --git a/src/lib/sys.cpp b/src/lib/sys.cpp index 2317fa0..050e095 100644 --- a/src/lib/sys.cpp +++ b/src/lib/sys.cpp @@ -12,7 +12,7 @@ String shell_exec(String cmd) { - printf("(i) shell_exec(%s)\n", cmd.c_str()); + //printf("(i) shell_exec(%s)\n", cmd.c_str()); String data; FILE * stream; const int max_buffer = 256; diff --git a/src/lib/types.cpp b/src/lib/types.cpp index b255529..855c8e4 100644 --- a/src/lib/types.cpp +++ b/src/lib/types.cpp @@ -39,6 +39,7 @@ String nibble(String div, String& haystack) } } +/* void Request::invoke(String file_name) { DTree call_param; @@ -50,6 +51,8 @@ void Request::invoke(String file_name, DTree& call_param) compiler_invoke(this, file_name, call_param); } +*/ + void Request::ob_start() { ob_stack.push_back(new std::ostringstream()); @@ -61,3 +64,4 @@ Request::~Request() for(auto& sockfd : resources.sockets) close(sockfd); } + diff --git a/src/lib/types.h b/src/lib/types.h index 272fa9e..732a6ba 100644 --- a/src/lib/types.h +++ b/src/lib/types.h @@ -141,6 +141,7 @@ struct Request; struct DTree; typedef void (*call_handler)(DTree& call_param); +typedef DTree* (*dtree_call_handler)(DTree* call_param); typedef void (*request_handler)(Request* request); String to_string(s64 v) { return(std::to_string(v)); } @@ -156,6 +157,8 @@ struct ServerSettings { String TMP_UPLOAD_PATH = "/tmp/uce/uploads"; String SESSION_PATH = "/tmp/uce/sessions"; String COMPILER_SYS_PATH = "."; + String PRECOMPILE_FILES_IN = "."; + u32 LISTEN_PORT = 9993; u64 SESSION_TIME = 60*60*24*30; u32 WORKER_COUNT = 4; @@ -260,6 +263,7 @@ struct Request { f64 time_init; f64 time_start; f64 time_end; + u32 invoke_count = 0; } stats; struct Resources { @@ -268,8 +272,8 @@ struct Request { u64 fcgi_socket = 0; } resources; - void invoke(String file_name); - void invoke(String file_name, DTree& call_param); + //void invoke(String file_name); + //void invoke(String file_name, DTree& call_param); void ob_start(); diff --git a/src/linux_fastcgi.cpp b/src/linux_fastcgi.cpp index 0f02cd0..d16d7a3 100644 --- a/src/linux_fastcgi.cpp +++ b/src/linux_fastcgi.cpp @@ -70,7 +70,7 @@ int handle_complete(FastCGIRequest& request) { } // printf("(i) request ready\n"); - request.invoke(request.params["SCRIPT_FILENAME"]); + render_file(request.params["SCRIPT_FILENAME"]); for( auto &f : request.uploaded_files) { @@ -87,6 +87,17 @@ int handle_complete(FastCGIRequest& request) { void listen_for_connections() { + if(precompile_jobs.size() > 0) + { + context = new Request(); + context->server = &server_state; + for(auto s : precompile_jobs) + { + printf("- worker [%i] precompile %s\n", getpid(), s.c_str()); + get_shared_unit(context, s, false); + } + } + signal(SIGSEGV, on_segfault); server.on_request = &handle_request; server.on_data = &handle_data; @@ -106,6 +117,9 @@ void listen_for_connections() int main(int argc, char** argv) { + StringList precompile_jobs_pending; + u32 precompile_jobs_per_worker = 1; + printf("(P) Starting parent server PID:%i\n", getpid()); signal(SIGCHLD, on_child_exit); @@ -143,11 +157,41 @@ int main(int argc, char** argv) { std::cout << e.what(); }*/ + if(server_state.config.PRECOMPILE_FILES_IN != "" && server_state.config.WORKER_COUNT >= 2) + { + if(server_state.config.PRECOMPILE_FILES_IN != "/") + server_state.config.PRECOMPILE_FILES_IN = expand_path(server_state.config.PRECOMPILE_FILES_IN); + precompile_jobs_pending = split(trim(shell_exec( + "find " + + shell_escape(server_state.config.PRECOMPILE_FILES_IN) + + " -iname '*.uce' ")), "\n"); + precompile_jobs_per_worker = 1 + (precompile_jobs_pending.size() / (server_state.config.WORKER_COUNT -1)); + /* + */ + } + + s32 worker_spawn_count = 0; for(;;) { while(workers.size() < server_state.config.WORKER_COUNT) { + worker_spawn_count++; + precompile_jobs.clear(); + // spawn workers with precompile jobs if necessary but + // leave the first worker alone so it can start responding + // to requests right away + if(precompile_jobs_pending.size() > 0 && worker_spawn_count > 1) + { + for(u32 i = 0; i < precompile_jobs_per_worker; i++) + { + if(precompile_jobs_pending.size() > 0) + { + precompile_jobs.push_back(precompile_jobs_pending.back()); + precompile_jobs_pending.pop_back(); + } + } + } spawn_subprocess(listen_for_connections); } sleep(1); diff --git a/test/random.uce b/test/random.uce index ea92559..f922630 100644 --- a/test/random.uce +++ b/test/random.uce @@ -20,8 +20,8 @@ RENDER() for(auto i = 0; i < 100; i++) { - print(i, ": ", (float)noise32(i)/(float)max_32, " / ", (float)noise64(i)/(float)max_64, " / ", noise01(i), " / ", - generate_int(0, 4, i), " / ", generate_float(0.0, 4.0, i), "\n"); + print(i, ": ", (float)gen_noise32(i)/(float)max_32, " / ", (float)gen_noise64(i)/(float)max_64, " / ", gen_noise01(i), " / ", + gen_int(0, 4, i), " / ", gen_float(0.0, 4.0, i), "\n"); } ?> @@ -39,7 +39,7 @@ RENDER() ?>
- Sha1 of '1234': + Sha1 of '1234':
Params diff --git a/test/working-dir.uce b/test/working-dir.uce index 6322d3d..f4fd296 100644 --- a/test/working-dir.uce +++ b/test/working-dir.uce @@ -11,7 +11,7 @@ RENDER()
invoke("test2/working-dir-test.uce");
+			render_file("test2/working-dir-test.uce");
 		?>
params) ?>