134 lines
23 KiB
HTML
134 lines
23 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html>
|
||
|
<head>
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||
|
<title>CLiki: file-position on non-files</title>
|
||
|
<link rel="alternate" type="application/atom+xml" title="ATOM feed of edits to current article"
|
||
|
href="https://www.cliki.net/site/feed/article.atom?title=file-position%20on%20non-files">
|
||
|
<link rel="stylesheet" href="static/css/style.css">
|
||
|
<link rel="stylesheet" href="static/css/colorize.css">
|
||
|
</head>
|
||
|
|
||
|
<body>
|
||
|
<span class="hidden">CLiki - file-position on non-files</span>
|
||
|
<div id="content"><div id="content-area"><div id="article-title">file-position on non-files</div><div id="article">Here's a can of worms. It involves a <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_string-stream.html" class="hyperspec">string-stream</a>, but <a href="https://trac.clozure.com/ccl/wiki/VectorStreams">vector streams in Clozure CL</a> (see <a href="https://github.com/Clozure/ccl/blob/master/level-1/l1-streams.lisp">l1-streams.lisp</a>) work similarly.<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_with-output-to-string.html" class="symbol"><i><span class="symbol">with-output-to-string</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-str_m_write-line.html" class="symbol">write-string</a> <span class="string">"foo"</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="symbol">file-position</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> 0</span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-char.html" class="symbol">write-char</a> <span class="character">#\w</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span></span>)</span></span></div><p>The result varies by <a href="Common Lisp implementation.html" class="internal">Common Lisp implementation</a>:<p><table>
|
||
|
<tr>
|
||
|
<td><a href="CCL.html" class="internal">CCL</a></td>
|
||
|
<td><tt>"w"</tt></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><a href="CLISP.html" class="internal">CLISP</a></td>
|
||
|
<td><tt>"w"</tt></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><a href="ACL.html" class="internal">ACL</a></td>
|
||
|
<td><tt>"w"</tt></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><a href="ECL.html" class="internal">ECL</a></td>
|
||
|
<td><tt>"w"</tt></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><a href="SBCL.html" class="internal">SBCL</a></td>
|
||
|
<td><tt>"woo"</tt></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><a href="LispWorks.html" class="internal">LispWorks</a></td>
|
||
|
<td><tt>"woo"</tt></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><a href="Corman Common Lisp.html" class="internal">Corman</a></td>
|
||
|
<td><tt>"foow"</tt></td>
|
||
|
</tr>
|
||
|
</table><p>So for a few implementations, the output is truncated by the use of <a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="hyperspec">file-position</a> (as if by setting the <a href="https://www.cliki.net/site/HyperSpec/Body/acc_fill-pointer.html" class="hyperspec">fill-pointer</a>). <a href="https://sourceforge.net/p/sbcl/sbcl/ci/954902abeb19dac4f79f0a5b800eac45179b8d7c/tree/src/code/stream.lisp#l1245">SBCL's implementation</a> (since <a href="https://sourceforge.net/p/sbcl/sbcl/ci/954902abeb19dac4f79f0a5b800eac45179b8d7c/">version 0.8.3.77</a>) remembers the ending position and doesn't truncate the output. Which may be less surprising, unless you actually <i>wanted</i> to truncate the output. Then you'd have to find another way to do that. <a href="LispWorks.html" class="internal">LispWorks</a> appears to be in the same camp. In <a href="Corman Common Lisp.html" class="internal">Corman Common Lisp</a>, the <a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="hyperspec">file-position</a> is different from the actual output position.<p><h2>Clozure CL</h2><p>Since <a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="hyperspec">file-position</a> in <a href="CCL.html" class="internal">CCL</a> interfaces this way with <a href="https://trac.clozure.com/ccl/wiki/VectorStreams">vector streams</a> (that is: having the effect of truncation), <a href="David Mullen.html" class="internal">David Mullen</a> often does low-level tricks like writing directly to the underlying vector. This gets into the internals (specifically: stuff that's private to the <a href="https://github.com/Clozure/ccl/blob/master/lib/ccl-export-syms.lisp"><tt>CCL</tt> package</a>) and isn't exactly <i><a href="https://www.cliki.net/site/HyperSpec/Body/glo_s.html#safe">safe</a></i> code, since it assumes there is already space in the buffer, and would otherwise need to call <tt>%extend-vector-output-stream</tt> (directly or indirectly):<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> %vector-stream-write-u32 <span class="paren2">(<span class="nonparen">u <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_positionc_ition-if-not.html" class="symbol">position</a></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">ioblock <span class="paren5">(<span class="nonparen">basic-stream-ioblock <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen">origin <span class="paren5">(<span class="nonparen">vector-output-stream-ioblock-displacement
|
||
|
ioblock</span>)</span></span>)</span></span>)</span>
|
||
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_integer.html" class="symbol">integer</a> 0 #.array-dimension-limit</span>)</span> origin</span>)</span></span>)</span>
|
||
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_integer.html" class="symbol">integer</a> 0 #.array-dimension-limit</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_positionc_ition-if-not.html" class="symbol">position</a></span>)</span></span>)</span>
|
||
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">optimize</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">safety</a> 0</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">speed</a> 3</span>)</span></span>)</span></span>)</span>
|
||
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">outbuf <span class="paren6">(<span class="nonparen">ioblock-outbuf ioblock</span>)</span></span>)</span>
|
||
|
<span class="paren5">(<span class="nonparen">buffer <span class="paren6">(<span class="nonparen">io-buffer-buffer outbuf</span>)</span></span>)</span>
|
||
|
<span class="paren5">(<span class="nonparen">index <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> origin <a href="https://www.cliki.net/site/HyperSpec/Body/fun_positionc_ition-if-not.html" class="symbol">position</a></span>)</span></span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 32</span>)</span> u</span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_integer.html" class="symbol">integer</a> 0 #.array-dimension-limit</span>)</span> index</span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_simple-array.html" class="symbol">simple-array</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 8</span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a></span>)</span></span>)</span> buffer</span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> buffer <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> index 0</span>)</span></span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 0</span>)</span> u</span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> buffer <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> index 1</span>)</span></span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 8</span>)</span> u</span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> buffer <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> index 2</span>)</span></span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 16</span>)</span> u</span>)</span></span>)</span>
|
||
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> buffer <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> index 3</span>)</span></span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 24</span>)</span> u</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span></div><p>An example (possibly unwise):<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen"><i><span class="symbol">with-output-to-vector</span></i> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-str_m_write-line.html" class="symbol">write-string</a> <span class="string">"time"</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
||
|
<span class="comment">;; Vector streams are bivalent, meaning they take octets and characters.
|
||
|
</span> <span class="comment">;; So we just wrote the string "time" and we'll overwrite it with the
|
||
|
</span> <span class="comment">;; value of (get-universal-time) encoded in little-endian 32-bit format.
|
||
|
</span> <span class="paren2">(<span class="nonparen">%vector-stream-write-u32 <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_get-unive_decoded-time.html" class="symbol">get-universal-time</a></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> 0</span>)</span></span>)</span></span></div><p>As of this writing, that gives <tt>#(164 231 121 229)</tt> corresponding to the <i><a href="https://www.cliki.net/site/HyperSpec/Body/glo_u.html#universal_time">universal time</a></i> 3849971620.<p>Which—the careful programmer will note—doesn't overflow 32 (unsigned) bits. That'll happen in 2036.<p><h2>Allegro CL</h2><p><a href="ACL.html" class="internal">ACL</a> has <a href="https://franz.com/support/documentation/current/doc/operators/excl/with-output-to-buffer.htm">with-output-to-buffer</a>:<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen"><i><span class="symbol">with-output-to-buffer</span></i> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-str_m_write-line.html" class="symbol">write-string</a> <span class="string">"foo"</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="symbol">file-position</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> 0</span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-char.html" class="symbol">write-char</a> <span class="character">#\w</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span></span>)</span></span></div><p>Result of the above:<p><div class="code"><span class="nonparen">#<span class="paren1">(<span class="nonparen">119</span>)</span></span></div><p>Which is similar to the result of <a href="https://www.cliki.net/site/HyperSpec/Body/mac_with-output-to-string.html" class="hyperspec">with-output-to-string</a>. The buffer wants to be a <a href="https://www.cliki.net/site/HyperSpec/Body/typ_simple-array.html" class="hyperspec">simple-array</a> (and a vector, of course) with an <i>element-type</i> of either <tt>(unsigned-byte 8)</tt> or <tt>(signed-byte 8)</tt>. Passing a non-simple array as the second argument can have peculiar effects. Consider this example, where the version of <a href="ACL.html" class="internal">ACL</a> is noted in the comment, and the default optimization settings are in effect:<p><div class="code"><span class="nonparen"><span class="comment">;;; International Allegro CL Free Express Edition
|
||
|
</span><span class="comment">;;; 10.1 [32-bit Windows] (Jan 27, 2021 17:58)
|
||
|
</span><span class="comment">;;; Optimization settings: safety 1, space 1, speed 1, debug 2.
|
||
|
</span>
|
||
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="symbol"><i><span class="symbol">defvar</span></i></a> <span class="special">*buffer*</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> 20
|
||
|
<span class="keyword">:element-type</span> '<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 8</span>)</span>
|
||
|
<span class="keyword">:initial-element</span> 0</span>)</span></span>)</span>
|
||
|
|
||
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="symbol"><i><span class="symbol">defvar</span></i></a> <span class="special">*displaced*</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> 10
|
||
|
<span class="keyword">:element-type</span> '<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 8</span>)</span>
|
||
|
<span class="keyword">:displaced-index-offset</span> 10
|
||
|
<span class="keyword">:displaced-to</span> <span class="special">*buffer*</span></span>)</span></span>)</span>
|
||
|
|
||
|
<span class="paren1">(<span class="nonparen"><i><span class="symbol">with-output-to-buffer</span></i> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="special">*displaced*</span></span>)</span>
|
||
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-str_m_write-line.html" class="symbol">write-string</a> <span class="string">"0123456789"</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span></span>)</span></span></div><p>Then we have this output from <a href="ACL.html" class="internal">ACL</a>'s <a href="https://franz.com/support/documentation/current/doc/ide-menus-and-dialogs/debug-window.htm">Debug Window</a>:<p><pre>CG-USER(4): *buffer*
|
||
|
#(0 0 0 0 0 0 0 0 0 0 ...)
|
||
|
CG-USER(5): *displaced*
|
||
|
#<Printer Error, obj=#x21712102: Attempt to take the car of 231574861 which is not listp.>
|
||
|
CG-USER(6): (type-of *displaced*)
|
||
|
(ARRAY (UNSIGNED-BYTE 8) (10))
|
||
|
CG-USER(7): (aref *displaced* 0)
|
||
|
Error: Attempt to take the car of 231574861 which is not listp.
|
||
|
[condition type: TYPE-ERROR]
|
||
|
CG-USER(8): (length *displaced*)
|
||
|
214731852</pre><p>As the saying goes: "Don't do that, then."<p><hr>
|
||
|
<a href="Programming Tips.html" class="category">Programming Tips</a></div></div>
|
||
|
<div id="footer" class="buttonbar"><ul><li><a href="file-position on non-files.html">Current version</a></li>
|
||
|
<li><a href="https://www.cliki.net/site/history?article=file-position%20on%20non-files">History</a></li>
|
||
|
<li><a href="https://www.cliki.net/site/backlinks?article=file-position%20on%20non-files">Backlinks</a></li><li><a href="https://www.cliki.net/site/edit-article?title=file-position%20on%20non-files&from-revision=3860346022">Edit</a></li><li><a href="https://www.cliki.net/site/edit-article?create=t">Create</a></li></ul></div>
|
||
|
</div>
|
||
|
<div id="header-buttons" class="buttonbar">
|
||
|
<ul>
|
||
|
<li><a href="https://www.cliki.net/">Home</a></li>
|
||
|
<li><a href="https://www.cliki.net/site/recent-changes">Recent Changes</a></li>
|
||
|
<li><a href="CLiki.html">About</a></li>
|
||
|
<li><a href="Text Formatting.html">Text Formatting</a></li>
|
||
|
<li><a href="https://www.cliki.net/site/tools">Tools</a></li>
|
||
|
</ul>
|
||
|
<div id="search">
|
||
|
<form action="https://www.cliki.net/site/search">
|
||
|
<label for="search_query" class="hidden">Search CLiki</label>
|
||
|
<input type="text" name="query" id="search_query" value="" />
|
||
|
<input type="submit" value="search" />
|
||
|
</form>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div id="pageheader">
|
||
|
<div id="header">
|
||
|
<span id="logo">CLiki</span>
|
||
|
<span id="slogan">the common lisp wiki</span>
|
||
|
<div id="login"><form method="post" action="https://www.cliki.net/site/login">
|
||
|
<label for="login_name" class="hidden">Account name</label>
|
||
|
<input type="text" name="name" id="login_name" class="login_input" />
|
||
|
<label for= "login_password" class="hidden">Password</label>
|
||
|
<input type="password" name="password" id="login_password" class="login_input" />
|
||
|
<input type="submit" name="login" value="login" id="login_submit" /><br />
|
||
|
<div id="register"><a href="https://www.cliki.net/site/register">register</a></div>
|
||
|
<input type="submit" name="reset-pw" value="reset password" id="reset_pw" />
|
||
|
</form>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</body></html>
|