Sophie

Sophie

distrib > CentOS > 5 > x86_64 > by-pkgid > 67e32647b06c0323bf90c6b54a6438d1 > files > 13

rpm-apidocs-4.4.2.3-34.el5.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>rpm: file/src/ascmagic.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.7 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    <li><a href="globals.html"><span>Globals</span></a></li>
  </ul></div>
<h1>file/src/ascmagic.c</h1><a href="ascmagic_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) Ian F. Darwin 1986-1995.</span>
<a name="l00003"></a>00003 <span class="comment"> * Software written by Ian F. Darwin and others;</span>
<a name="l00004"></a>00004 <span class="comment"> * maintained 1995-present by Christos Zoulas and others.</span>
<a name="l00005"></a>00005 <span class="comment"> * </span>
<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions</span>
<a name="l00008"></a>00008 <span class="comment"> * are met:</span>
<a name="l00009"></a>00009 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
<a name="l00010"></a>00010 <span class="comment"> *    notice immediately at the beginning of the file, without modification,</span>
<a name="l00011"></a>00011 <span class="comment"> *    this list of conditions, and the following disclaimer.</span>
<a name="l00012"></a>00012 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
<a name="l00013"></a>00013 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
<a name="l00014"></a>00014 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
<a name="l00015"></a>00015 <span class="comment"> *  </span>
<a name="l00016"></a>00016 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND</span>
<a name="l00017"></a>00017 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
<a name="l00018"></a>00018 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
<a name="l00019"></a>00019 <span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR</span>
<a name="l00020"></a>00020 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
<a name="l00021"></a>00021 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
<a name="l00022"></a>00022 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
<a name="l00023"></a>00023 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
<a name="l00024"></a>00024 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
<a name="l00025"></a>00025 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
<a name="l00026"></a>00026 <span class="comment"> * SUCH DAMAGE.</span>
<a name="l00027"></a>00027 <span class="comment"> */</span>
<a name="l00028"></a>00028 <span class="comment">/*</span>
<a name="l00029"></a>00029 <span class="comment"> * ASCII magic -- file types that we know based on keywords</span>
<a name="l00030"></a>00030 <span class="comment"> * that can appear anywhere in the file.</span>
<a name="l00031"></a>00031 <span class="comment"> *</span>
<a name="l00032"></a>00032 <span class="comment"> * Extensively modified by Eric Fischer &lt;enf@pobox.com&gt; in July, 2000,</span>
<a name="l00033"></a>00033 <span class="comment"> * to handle character codes other than ASCII on a unified basis.</span>
<a name="l00034"></a>00034 <span class="comment"> *</span>
<a name="l00035"></a>00035 <span class="comment"> * Joerg Wunsch &lt;joerg@freebsd.org&gt; wrote the original support for 8-bit</span>
<a name="l00036"></a>00036 <span class="comment"> * international characters, now subsumed into this file.</span>
<a name="l00037"></a>00037 <span class="comment"> */</span>
<a name="l00038"></a>00038 
<a name="l00039"></a>00039 <span class="preprocessor">#include "<a class="code" href="file_8h.html">file.h</a>"</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include "magic.h"</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &lt;memory.h&gt;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &lt;ctype.h&gt;</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00046"></a>00046 <span class="preprocessor">#ifdef HAVE_UNISTD_H</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00048"></a>00048 <span class="preprocessor">#endif</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="names_8h.html">names.h</a>"</span>
<a name="l00050"></a>00050 
<a name="l00051"></a>00051 <span class="preprocessor">#ifndef lint</span>
<a name="l00052"></a><a class="code" href="ascmagic_8c.html#d3e2f9b6d2324a17d1d4a526b01dbf40">00052</a> <span class="preprocessor"></span><a class="code" href="system_8h.html#b757e9ff04be9e1b95de08c5536ac334">FILE_RCSID</a>(<span class="stringliteral">"@(#)$Id: ascmagic.c,v 1.43 2005/06/25 15:52:14 christos Exp $"</span>)
<a name="l00053"></a>00053 <span class="preprocessor">#endif  </span><span class="comment">/* lint */</span>
<a name="l00054"></a>00054 
<a name="l00055"></a><a class="code" href="ascmagic_8c.html#f206160a172720975b869fed152d0107">00055</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="ascmagic_8c.html#f206160a172720975b869fed152d0107">unichar</a>;
<a name="l00056"></a>00056 
<a name="l00057"></a><a class="code" href="ascmagic_8c.html#624dbcb8b6ccc24c9bf891c174f60b6d">00057</a> <span class="preprocessor">#define MAXLINELEN 300  </span><span class="comment">/* longest sane line length */</span>
<a name="l00058"></a><a class="code" href="ascmagic_8c.html#093cdf87428c6b2b11f3450d44d1ee2b">00058</a> <span class="preprocessor">#define ISSPC(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n' \</span>
<a name="l00059"></a>00059 <span class="preprocessor">                  || (x) == 0x85 || (x) == '\f')</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
<a name="l00061"></a>00061 <span class="keyword">private</span> <span class="keywordtype">int</span> <a class="code" href="ascmagic_8c.html#73884ebc89dc00d2758ed9cd580084e1">looks_ascii</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00062"></a>00062         <span class="comment">/*@modifies *ubuf, *ulen @*/</span>;
<a name="l00063"></a>00063 <span class="keyword">private</span> <span class="keywordtype">int</span> <a class="code" href="ascmagic_8c.html#181a844ab9c892d746837c5727f28358">looks_utf8</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00064"></a>00064         <span class="comment">/*@modifies *ubuf, *ulen @*/</span>;
<a name="l00065"></a>00065 <span class="keyword">private</span> <span class="keywordtype">int</span> <a class="code" href="ascmagic_8c.html#92d0d3f4c94780b510a34de5d4136001">looks_unicode</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00066"></a>00066         <span class="comment">/*@modifies *ubuf, *ulen @*/</span>;
<a name="l00067"></a>00067 <span class="keyword">private</span> <span class="keywordtype">int</span> <a class="code" href="ascmagic_8c.html#1354a65e0ffb3a3ec43624500ac1393f">looks_latin1</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00068"></a>00068         <span class="comment">/*@modifies *ubuf, *ulen @*/</span>;
<a name="l00069"></a>00069 <span class="keyword">private</span> <span class="keywordtype">int</span> <a class="code" href="ascmagic_8c.html#908fae6ebc758400d44ad85f6a3701bc">looks_extended</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00070"></a>00070         <span class="comment">/*@modifies *ubuf, *ulen @*/</span>;
<a name="l00071"></a>00071 <span class="keyword">private</span> <span class="keywordtype">void</span> <a class="code" href="ascmagic_8c.html#fb1a22bccf649f46a313d0969f8ca436">from_ebcdic</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *out)
<a name="l00072"></a>00072         <span class="comment">/*@modifies *out @*/</span>;
<a name="l00073"></a>00073 <span class="keyword">private</span> <span class="keywordtype">int</span> <a class="code" href="ascmagic_8c.html#9566a943bc45c1e3ddc8d839b01fc1c3">ascmatch</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> unichar *us, size_t ulen)
<a name="l00074"></a>00074         <span class="comment">/*@*/</span>;
<a name="l00075"></a>00075 
<a name="l00076"></a>00076 
<a name="l00077"></a>00077 <span class="keyword">protected</span> <span class="keywordtype">int</span>
<a name="l00078"></a><a class="code" href="file_8h.html#30a6e8d35b0349d5b65201c561b2e5ac">00078</a> <a class="code" href="ascmagic_8c.html#8d10796a389295a449a6f3d288fd79e6">file_ascmagic</a>(<span class="keyword">struct</span> <a class="code" href="structmagic__set.html">magic_set</a> *ms, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes)
<a name="l00079"></a>00079 {
<a name="l00080"></a>00080         size_t i;
<a name="l00081"></a>00081         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *nbuf = NULL;
<a name="l00082"></a>00082         unichar *ubuf = NULL;   
<a name="l00083"></a>00083         size_t ulen;
<a name="l00084"></a>00084         <span class="keyword">struct </span><a class="code" href="structnames.html">names</a> *p;
<a name="l00085"></a>00085         <span class="keywordtype">int</span> rv = -1;
<a name="l00086"></a>00086 
<a name="l00087"></a>00087         <span class="keyword">const</span> <span class="keywordtype">char</span> *code = NULL;
<a name="l00088"></a>00088         <span class="keyword">const</span> <span class="keywordtype">char</span> *code_mime = NULL;
<a name="l00089"></a>00089         <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structnames.html#fa46cc2055cbc41c904c69f2be832b01">type</a> = NULL;
<a name="l00090"></a>00090         <span class="keyword">const</span> <span class="keywordtype">char</span> *subtype = NULL;
<a name="l00091"></a>00091         <span class="keyword">const</span> <span class="keywordtype">char</span> *subtype_mime = NULL;
<a name="l00092"></a>00092 
<a name="l00093"></a>00093         <span class="keywordtype">int</span> has_escapes = 0;
<a name="l00094"></a>00094         <span class="keywordtype">int</span> has_backspace = 0;
<a name="l00095"></a>00095         <span class="keywordtype">int</span> seen_cr = 0;
<a name="l00096"></a>00096 
<a name="l00097"></a>00097         <span class="keywordtype">int</span> n_crlf = 0;
<a name="l00098"></a>00098         <span class="keywordtype">int</span> n_lf = 0;
<a name="l00099"></a>00099         <span class="keywordtype">int</span> n_cr = 0;
<a name="l00100"></a>00100         <span class="keywordtype">int</span> n_nel = 0;
<a name="l00101"></a>00101 
<a name="l00102"></a>00102         <span class="keywordtype">int</span> last_line_end = -1;
<a name="l00103"></a>00103         <span class="keywordtype">int</span> has_long_lines = 0;
<a name="l00104"></a>00104 
<a name="l00105"></a>00105         <span class="comment">/*</span>
<a name="l00106"></a>00106 <span class="comment">         * Undo the NUL-termination kindly provided by process()</span>
<a name="l00107"></a>00107 <span class="comment">         * but leave at least one byte to look at</span>
<a name="l00108"></a>00108 <span class="comment">         */</span>
<a name="l00109"></a>00109         <span class="keywordflow">while</span> (nbytes &gt; 1 &amp;&amp; buf[nbytes - 1] == <span class="charliteral">'\0'</span>)
<a name="l00110"></a>00110                 nbytes--;
<a name="l00111"></a>00111 
<a name="l00112"></a>00112         <span class="keywordflow">if</span> ((nbuf = malloc((nbytes + 1) * <span class="keyword">sizeof</span>(nbuf[0]))) == NULL)
<a name="l00113"></a>00113                 <span class="keywordflow">goto</span> done;
<a name="l00114"></a>00114         <span class="keywordflow">if</span> ((ubuf = malloc((nbytes + 1) * <span class="keyword">sizeof</span>(ubuf[0]))) == NULL)
<a name="l00115"></a>00115                 <span class="keywordflow">goto</span> done;
<a name="l00116"></a>00116 
<a name="l00117"></a>00117         <span class="comment">/*</span>
<a name="l00118"></a>00118 <span class="comment">         * Then try to determine whether it's any character code we can</span>
<a name="l00119"></a>00119 <span class="comment">         * identify.  Each of these tests, if it succeeds, will leave</span>
<a name="l00120"></a>00120 <span class="comment">         * the text converted into one-unichar-per-character Unicode in</span>
<a name="l00121"></a>00121 <span class="comment">         * ubuf, and the number of characters converted in ulen.</span>
<a name="l00122"></a>00122 <span class="comment">         */</span>
<a name="l00123"></a>00123         <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#73884ebc89dc00d2758ed9cd580084e1">looks_ascii</a>(buf, nbytes, ubuf, &amp;ulen)) {
<a name="l00124"></a>00124                 code = <span class="stringliteral">"ASCII"</span>;
<a name="l00125"></a>00125                 code_mime = <span class="stringliteral">"us-ascii"</span>;
<a name="l00126"></a>00126                 type = <span class="stringliteral">"text"</span>;
<a name="l00127"></a>00127         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#181a844ab9c892d746837c5727f28358">looks_utf8</a>(buf, nbytes, ubuf, &amp;ulen)) {
<a name="l00128"></a>00128                 code = <span class="stringliteral">"UTF-8 Unicode"</span>;
<a name="l00129"></a>00129                 code_mime = <span class="stringliteral">"utf-8"</span>;
<a name="l00130"></a>00130                 type = <span class="stringliteral">"text"</span>;
<a name="l00131"></a>00131         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((i = <a class="code" href="ascmagic_8c.html#92d0d3f4c94780b510a34de5d4136001">looks_unicode</a>(buf, nbytes, ubuf, &amp;ulen)) != 0) {
<a name="l00132"></a>00132                 <span class="keywordflow">if</span> (i == 1)
<a name="l00133"></a>00133                         code = <span class="stringliteral">"Little-endian UTF-16 Unicode"</span>;
<a name="l00134"></a>00134                 <span class="keywordflow">else</span>
<a name="l00135"></a>00135                         code = <span class="stringliteral">"Big-endian UTF-16 Unicode"</span>;
<a name="l00136"></a>00136 
<a name="l00137"></a>00137                 type = <span class="stringliteral">"character data"</span>;
<a name="l00138"></a>00138                 code_mime = <span class="stringliteral">"utf-16"</span>;    <span class="comment">/* is this defined? */</span>
<a name="l00139"></a>00139         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#1354a65e0ffb3a3ec43624500ac1393f">looks_latin1</a>(buf, nbytes, ubuf, &amp;ulen)) {
<a name="l00140"></a>00140                 code = <span class="stringliteral">"ISO-8859"</span>;
<a name="l00141"></a>00141                 type = <span class="stringliteral">"text"</span>;
<a name="l00142"></a>00142                 code_mime = <span class="stringliteral">"iso-8859-1"</span>; 
<a name="l00143"></a>00143         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#908fae6ebc758400d44ad85f6a3701bc">looks_extended</a>(buf, nbytes, ubuf, &amp;ulen)) {
<a name="l00144"></a>00144                 code = <span class="stringliteral">"Non-ISO extended-ASCII"</span>;
<a name="l00145"></a>00145                 type = <span class="stringliteral">"text"</span>;
<a name="l00146"></a>00146                 code_mime = <span class="stringliteral">"unknown"</span>;
<a name="l00147"></a>00147         } <span class="keywordflow">else</span> {
<a name="l00148"></a>00148                 <a class="code" href="ascmagic_8c.html#fb1a22bccf649f46a313d0969f8ca436">from_ebcdic</a>(buf, nbytes, nbuf);
<a name="l00149"></a>00149 
<a name="l00150"></a>00150                 <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#73884ebc89dc00d2758ed9cd580084e1">looks_ascii</a>(nbuf, nbytes, ubuf, &amp;ulen)) {
<a name="l00151"></a>00151                         code = <span class="stringliteral">"EBCDIC"</span>;
<a name="l00152"></a>00152                         type = <span class="stringliteral">"character data"</span>;
<a name="l00153"></a>00153                         code_mime = <span class="stringliteral">"ebcdic"</span>;
<a name="l00154"></a>00154                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#1354a65e0ffb3a3ec43624500ac1393f">looks_latin1</a>(nbuf, nbytes, ubuf, &amp;ulen)) {
<a name="l00155"></a>00155                         code = <span class="stringliteral">"International EBCDIC"</span>;
<a name="l00156"></a>00156                         type = <span class="stringliteral">"character data"</span>;
<a name="l00157"></a>00157                         code_mime = <span class="stringliteral">"ebcdic"</span>;
<a name="l00158"></a>00158                 } <span class="keywordflow">else</span> {
<a name="l00159"></a>00159                         rv = 0;
<a name="l00160"></a>00160                         <span class="keywordflow">goto</span> done;  <span class="comment">/* doesn't look like text at all */</span>
<a name="l00161"></a>00161                 }
<a name="l00162"></a>00162         }
<a name="l00163"></a>00163 
<a name="l00164"></a>00164         <span class="comment">/*</span>
<a name="l00165"></a>00165 <span class="comment">         * for troff, look for . + letter + letter or .\";</span>
<a name="l00166"></a>00166 <span class="comment">         * this must be done to disambiguate tar archives' ./file</span>
<a name="l00167"></a>00167 <span class="comment">         * and other trash from real troff input.</span>
<a name="l00168"></a>00168 <span class="comment">         *</span>
<a name="l00169"></a>00169 <span class="comment">         * I believe Plan 9 troff allows non-ASCII characters in the names</span>
<a name="l00170"></a>00170 <span class="comment">         * of macros, so this test might possibly fail on such a file.</span>
<a name="l00171"></a>00171 <span class="comment">         */</span>
<a name="l00172"></a>00172         <span class="keywordflow">if</span> (*ubuf == <span class="charliteral">'.'</span>) {
<a name="l00173"></a>00173                 unichar *tp = ubuf + 1;
<a name="l00174"></a>00174 
<a name="l00175"></a>00175                 <span class="keywordflow">while</span> (<a class="code" href="ascmagic_8c.html#093cdf87428c6b2b11f3450d44d1ee2b">ISSPC</a>(*tp))
<a name="l00176"></a>00176                         ++tp;   <span class="comment">/* skip leading whitespace */</span>
<a name="l00177"></a>00177                 <span class="keywordflow">if</span> ((tp[0] == <span class="charliteral">'\\'</span> &amp;&amp; tp[1] == <span class="charliteral">'\"'</span>) ||
<a name="l00178"></a>00178                     (isascii((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)tp[0]) &amp;&amp;
<a name="l00179"></a>00179                      isalnum((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)tp[0]) &amp;&amp;
<a name="l00180"></a>00180                      isascii((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)tp[1]) &amp;&amp;
<a name="l00181"></a>00181                      isalnum((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)tp[1]) &amp;&amp;
<a name="l00182"></a>00182                      <a class="code" href="ascmagic_8c.html#093cdf87428c6b2b11f3450d44d1ee2b">ISSPC</a>(tp[2]))) {
<a name="l00183"></a>00183                         subtype_mime = <span class="stringliteral">"text/troff"</span>;
<a name="l00184"></a>00184                         subtype = <span class="stringliteral">"troff or preprocessor input"</span>;
<a name="l00185"></a>00185                         <span class="keywordflow">goto</span> subtype_identified;
<a name="l00186"></a>00186                 }
<a name="l00187"></a>00187         }
<a name="l00188"></a>00188 
<a name="l00189"></a>00189         <span class="keywordflow">if</span> ((*buf == <span class="charliteral">'c'</span> || *buf == <span class="charliteral">'C'</span>) &amp;&amp; <a class="code" href="ascmagic_8c.html#093cdf87428c6b2b11f3450d44d1ee2b">ISSPC</a>(buf[1])) {
<a name="l00190"></a>00190                 subtype_mime = <span class="stringliteral">"text/fortran"</span>;
<a name="l00191"></a>00191                 subtype = <span class="stringliteral">"fortran program"</span>;
<a name="l00192"></a>00192                 <span class="keywordflow">goto</span> subtype_identified;
<a name="l00193"></a>00193         }
<a name="l00194"></a>00194 
<a name="l00195"></a>00195         <span class="comment">/* look for tokens from names.h - this is expensive! */</span>
<a name="l00196"></a>00196 
<a name="l00197"></a>00197         i = 0;
<a name="l00198"></a>00198         <span class="keywordflow">while</span> (i &lt; ulen) {
<a name="l00199"></a>00199                 size_t end;
<a name="l00200"></a>00200 
<a name="l00201"></a>00201                 <span class="comment">/*</span>
<a name="l00202"></a>00202 <span class="comment">                 * skip past any leading space</span>
<a name="l00203"></a>00203 <span class="comment">                 */</span>
<a name="l00204"></a>00204                 <span class="keywordflow">while</span> (i &lt; ulen &amp;&amp; <a class="code" href="ascmagic_8c.html#093cdf87428c6b2b11f3450d44d1ee2b">ISSPC</a>(ubuf[i]))
<a name="l00205"></a>00205                         i++;
<a name="l00206"></a>00206                 <span class="keywordflow">if</span> (i &gt;= ulen)
<a name="l00207"></a>00207                         <span class="keywordflow">break</span>;
<a name="l00208"></a>00208 
<a name="l00209"></a>00209                 <span class="comment">/*</span>
<a name="l00210"></a>00210 <span class="comment">                 * find the next whitespace</span>
<a name="l00211"></a>00211 <span class="comment">                 */</span>
<a name="l00212"></a>00212                 <span class="keywordflow">for</span> (end = i + 1; end &lt; nbytes; end++)
<a name="l00213"></a>00213                         <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#093cdf87428c6b2b11f3450d44d1ee2b">ISSPC</a>(ubuf[end]))
<a name="l00214"></a>00214                                 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
<a name="l00215"></a>00215 
<a name="l00216"></a>00216                 <span class="comment">/*</span>
<a name="l00217"></a>00217 <span class="comment">                 * compare the word thus isolated against the token list</span>
<a name="l00218"></a>00218 <span class="comment">                 */</span>
<a name="l00219"></a>00219                 <span class="keywordflow">for</span> (p = <a class="code" href="structnames.html">names</a>; p &lt; <a class="code" href="structnames.html">names</a> + <a class="code" href="names_8h.html#71bf80a643bcc6db346468d01abc470f">NNAMES</a>; p++) {
<a name="l00220"></a>00220                         <span class="keywordflow">if</span> (<a class="code" href="ascmagic_8c.html#9566a943bc45c1e3ddc8d839b01fc1c3">ascmatch</a>((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)p-&gt;<a class="code" href="structnames.html#c68735d418c8bafba8f576004bed8f2c">name</a>, ubuf + i,
<a name="l00221"></a>00221                             end - i)) {
<a name="l00222"></a>00222                                 subtype = <a class="code" href="names_8h.html#1f25d131d9f857df4f701186dd2c19f6">types</a>[p-&gt;<a class="code" href="structnames.html#fa46cc2055cbc41c904c69f2be832b01">type</a>].human;
<a name="l00223"></a>00223                                 subtype_mime = <a class="code" href="names_8h.html#1f25d131d9f857df4f701186dd2c19f6">types</a>[p-&gt;<a class="code" href="structnames.html#fa46cc2055cbc41c904c69f2be832b01">type</a>].mime;
<a name="l00224"></a>00224                                 <span class="keywordflow">goto</span> subtype_identified;
<a name="l00225"></a>00225                         }
<a name="l00226"></a>00226                 }
<a name="l00227"></a>00227 
<a name="l00228"></a>00228                 i = end;
<a name="l00229"></a>00229         }
<a name="l00230"></a>00230 
<a name="l00231"></a>00231 subtype_identified:
<a name="l00232"></a>00232 
<a name="l00233"></a>00233         <span class="comment">/*</span>
<a name="l00234"></a>00234 <span class="comment">         * Now try to discover other details about the file.</span>
<a name="l00235"></a>00235 <span class="comment">         */</span>
<a name="l00236"></a>00236         <span class="keywordflow">for</span> (i = 0; i &lt; ulen; i++) {
<a name="l00237"></a>00237                 <span class="keywordflow">if</span> (ubuf[i] == <span class="charliteral">'\n'</span>) {
<a name="l00238"></a>00238                         <span class="keywordflow">if</span> (seen_cr)
<a name="l00239"></a>00239                                 n_crlf++;
<a name="l00240"></a>00240                         <span class="keywordflow">else</span>
<a name="l00241"></a>00241                                 n_lf++;
<a name="l00242"></a>00242                         last_line_end = i;
<a name="l00243"></a>00243                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (seen_cr)
<a name="l00244"></a>00244                         n_cr++;
<a name="l00245"></a>00245 
<a name="l00246"></a>00246                 seen_cr = (ubuf[i] == <span class="charliteral">'\r'</span>);
<a name="l00247"></a>00247                 <span class="keywordflow">if</span> (seen_cr)
<a name="l00248"></a>00248                         last_line_end = i;
<a name="l00249"></a>00249 
<a name="l00250"></a>00250                 <span class="keywordflow">if</span> (ubuf[i] == 0x85) { <span class="comment">/* X3.64/ECMA-43 "next line" character */</span>
<a name="l00251"></a>00251                         n_nel++;
<a name="l00252"></a>00252                         last_line_end = i;
<a name="l00253"></a>00253                 }
<a name="l00254"></a>00254 
<a name="l00255"></a>00255                 <span class="comment">/* If this line is _longer_ than MAXLINELEN, remember it. */</span>
<a name="l00256"></a>00256                 <span class="keywordflow">if</span> (i &gt; last_line_end + <a class="code" href="ascmagic_8c.html#624dbcb8b6ccc24c9bf891c174f60b6d">MAXLINELEN</a>)
<a name="l00257"></a>00257                         has_long_lines = 1;
<a name="l00258"></a>00258 
<a name="l00259"></a>00259                 <span class="keywordflow">if</span> (ubuf[i] == <span class="charliteral">'\033'</span>)
<a name="l00260"></a>00260                         has_escapes = 1;
<a name="l00261"></a>00261                 <span class="keywordflow">if</span> (ubuf[i] == <span class="charliteral">'\b'</span>)
<a name="l00262"></a>00262                         has_backspace = 1;
<a name="l00263"></a>00263         }
<a name="l00264"></a>00264 
<a name="l00265"></a>00265         <span class="comment">/* Beware, if the data has been truncated, the final CR could have</span>
<a name="l00266"></a>00266 <span class="comment">           been followed by a LF.  If we have HOWMANY bytes, it indicates</span>
<a name="l00267"></a>00267 <span class="comment">           that the data might have been truncated, probably even before</span>
<a name="l00268"></a>00268 <span class="comment">           this function was called. */</span>
<a name="l00269"></a>00269         <span class="keywordflow">if</span> (seen_cr &amp;&amp; nbytes &lt; <a class="code" href="file_8h.html#41e00ab4d3de2683b50119458776bde9">HOWMANY</a>)
<a name="l00270"></a>00270                 n_cr++;
<a name="l00271"></a>00271 
<a name="l00272"></a>00272         <span class="keywordflow">if</span> ((ms-&gt;flags &amp; MAGIC_MIME)) {
<a name="l00273"></a>00273                 if (subtype_mime) {
<a name="l00274"></a>00274                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, subtype_mime) == -1)
<a name="l00275"></a>00275                                 <span class="keywordflow">goto</span> done;
<a name="l00276"></a>00276                 } <span class="keywordflow">else</span> {
<a name="l00277"></a>00277                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">"text/plain"</span>) == -1)
<a name="l00278"></a>00278                                 <span class="keywordflow">goto</span> done;
<a name="l00279"></a>00279                 }
<a name="l00280"></a>00280 
<a name="l00281"></a>00281                 <span class="keywordflow">if</span> (code_mime) {
<a name="l00282"></a>00282                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">"; charset="</span>) == -1)
<a name="l00283"></a>00283                                 <span class="keywordflow">goto</span> done;
<a name="l00284"></a>00284                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, code_mime) == -1)
<a name="l00285"></a>00285                                 <span class="keywordflow">goto</span> done;
<a name="l00286"></a>00286                 }
<a name="l00287"></a>00287         } <span class="keywordflow">else</span> {
<a name="l00288"></a>00288                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, code) == -1)
<a name="l00289"></a>00289                         <span class="keywordflow">goto</span> done;
<a name="l00290"></a>00290 
<a name="l00291"></a>00291                 <span class="keywordflow">if</span> (subtype) {
<a name="l00292"></a>00292                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" "</span>) == -1)
<a name="l00293"></a>00293                                 <span class="keywordflow">goto</span> done;
<a name="l00294"></a>00294                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, subtype) == -1)
<a name="l00295"></a>00295                                 <span class="keywordflow">goto</span> done;
<a name="l00296"></a>00296                 }
<a name="l00297"></a>00297 
<a name="l00298"></a>00298                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" "</span>) == -1)
<a name="l00299"></a>00299                         <span class="keywordflow">goto</span> done;
<a name="l00300"></a>00300                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <a class="code" href="structnames.html#fa46cc2055cbc41c904c69f2be832b01">type</a>) == -1)
<a name="l00301"></a>00301                         <span class="keywordflow">goto</span> done;
<a name="l00302"></a>00302 
<a name="l00303"></a>00303                 <span class="keywordflow">if</span> (has_long_lines)
<a name="l00304"></a>00304                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">", with very long lines"</span>) == -1)
<a name="l00305"></a>00305                                 <span class="keywordflow">goto</span> done;
<a name="l00306"></a>00306 
<a name="l00307"></a>00307                 <span class="comment">/*</span>
<a name="l00308"></a>00308 <span class="comment">                 * Only report line terminators if we find one other than LF,</span>
<a name="l00309"></a>00309 <span class="comment">                 * or if we find none at all.</span>
<a name="l00310"></a>00310 <span class="comment">                 */</span>
<a name="l00311"></a>00311                 <span class="keywordflow">if</span> ((n_crlf == 0 &amp;&amp; n_cr == 0 &amp;&amp; n_nel == 0 &amp;&amp; n_lf == 0) ||
<a name="l00312"></a>00312                     (n_crlf != 0 || n_cr != 0 || n_nel != 0)) {
<a name="l00313"></a>00313                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">", with"</span>) == -1)
<a name="l00314"></a>00314                                 <span class="keywordflow">goto</span> done;
<a name="l00315"></a>00315 
<a name="l00316"></a>00316                         <span class="keywordflow">if</span> (n_crlf == 0 &amp;&amp; n_cr == 0 &amp;&amp; n_nel == 0 &amp;&amp; n_lf == 0)                        {
<a name="l00317"></a>00317                                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" no"</span>) == -1)
<a name="l00318"></a>00318                                         <span class="keywordflow">goto</span> done;
<a name="l00319"></a>00319                         } <span class="keywordflow">else</span> {
<a name="l00320"></a>00320                                 <span class="keywordflow">if</span> (n_crlf) {
<a name="l00321"></a>00321                                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" CRLF"</span>) == -1)
<a name="l00322"></a>00322                                                 <span class="keywordflow">goto</span> done;
<a name="l00323"></a>00323                                         <span class="keywordflow">if</span> (n_cr || n_lf || n_nel)
<a name="l00324"></a>00324                                                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">","</span>) == -1)
<a name="l00325"></a>00325                                                         <span class="keywordflow">goto</span> done;
<a name="l00326"></a>00326                                 }
<a name="l00327"></a>00327                                 <span class="keywordflow">if</span> (n_cr) {
<a name="l00328"></a>00328                                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" CR"</span>) == -1)
<a name="l00329"></a>00329                                                 <span class="keywordflow">goto</span> done;
<a name="l00330"></a>00330                                         <span class="keywordflow">if</span> (n_lf || n_nel)
<a name="l00331"></a>00331                                                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">","</span>) == -1)
<a name="l00332"></a>00332                                                         <span class="keywordflow">goto</span> done;
<a name="l00333"></a>00333                                 }
<a name="l00334"></a>00334                                 <span class="keywordflow">if</span> (n_lf) {
<a name="l00335"></a>00335                                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" LF"</span>) == -1)
<a name="l00336"></a>00336                                                 <span class="keywordflow">goto</span> done;
<a name="l00337"></a>00337                                         <span class="keywordflow">if</span> (n_nel)
<a name="l00338"></a>00338                                                 <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">","</span>) == -1)
<a name="l00339"></a>00339                                                         <span class="keywordflow">goto</span> done;
<a name="l00340"></a>00340                                 }
<a name="l00341"></a>00341                                 <span class="keywordflow">if</span> (n_nel)
<a name="l00342"></a>00342                                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" NEL"</span>) == -1)
<a name="l00343"></a>00343                                                 <span class="keywordflow">goto</span> done;
<a name="l00344"></a>00344                         }
<a name="l00345"></a>00345 
<a name="l00346"></a>00346                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">" line terminators"</span>) == -1)
<a name="l00347"></a>00347                                 <span class="keywordflow">goto</span> done;
<a name="l00348"></a>00348                 }
<a name="l00349"></a>00349 
<a name="l00350"></a>00350                 <span class="keywordflow">if</span> (has_escapes)
<a name="l00351"></a>00351                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">", with escape sequences"</span>) == -1)
<a name="l00352"></a>00352                                 <span class="keywordflow">goto</span> done;
<a name="l00353"></a>00353                 <span class="keywordflow">if</span> (has_backspace)
<a name="l00354"></a>00354                         <span class="keywordflow">if</span> (<a class="code" href="file_8h.html#949757705ada92387535cfad72f9243c">file_printf</a>(ms, <span class="stringliteral">", with overstriking"</span>) == -1)
<a name="l00355"></a>00355                                 <span class="keywordflow">goto</span> done;
<a name="l00356"></a>00356         }
<a name="l00357"></a>00357         rv = 1;
<a name="l00358"></a>00358 done:
<a name="l00359"></a>00359         <span class="keywordflow">if</span> (nbuf)
<a name="l00360"></a>00360                 free(nbuf);
<a name="l00361"></a>00361         <span class="keywordflow">if</span> (ubuf)
<a name="l00362"></a>00362                 free(ubuf);
<a name="l00363"></a>00363 
<a name="l00364"></a>00364         <span class="keywordflow">return</span> rv;
<a name="l00365"></a>00365 }
<a name="l00366"></a>00366 
<a name="l00367"></a>00367 <span class="keyword">private</span> <span class="keywordtype">int</span>
<a name="l00368"></a><a class="code" href="ascmagic_8c.html#9566a943bc45c1e3ddc8d839b01fc1c3">00368</a> <a class="code" href="ascmagic_8c.html#9566a943bc45c1e3ddc8d839b01fc1c3">ascmatch</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> unichar *us, size_t ulen)
<a name="l00369"></a>00369 {
<a name="l00370"></a>00370         size_t i;
<a name="l00371"></a>00371 
<a name="l00372"></a>00372         <span class="keywordflow">for</span> (i = 0; i &lt; ulen; i++) {
<a name="l00373"></a>00373                 <span class="keywordflow">if</span> (s[i] != us[i])
<a name="l00374"></a>00374                         <span class="keywordflow">return</span> 0;
<a name="l00375"></a>00375         }
<a name="l00376"></a>00376 
<a name="l00377"></a>00377         <span class="keywordflow">if</span> (s[i])
<a name="l00378"></a>00378                 <span class="keywordflow">return</span> 0;
<a name="l00379"></a>00379         <span class="keywordflow">else</span>
<a name="l00380"></a>00380                 <span class="keywordflow">return</span> 1;
<a name="l00381"></a>00381 }
<a name="l00382"></a>00382 
<a name="l00383"></a>00383 <span class="comment">/*</span>
<a name="l00384"></a>00384 <span class="comment"> * This table reflects a particular philosophy about what constitutes</span>
<a name="l00385"></a>00385 <span class="comment"> * "text," and there is room for disagreement about it.</span>
<a name="l00386"></a>00386 <span class="comment"> *</span>
<a name="l00387"></a>00387 <span class="comment"> * Version 3.31 of the file command considered a file to be ASCII if</span>
<a name="l00388"></a>00388 <span class="comment"> * each of its characters was approved by either the isascii() or</span>
<a name="l00389"></a>00389 <span class="comment"> * isalpha() function.  On most systems, this would mean that any</span>
<a name="l00390"></a>00390 <span class="comment"> * file consisting only of characters in the range 0x00 ... 0x7F</span>
<a name="l00391"></a>00391 <span class="comment"> * would be called ASCII text, but many systems might reasonably</span>
<a name="l00392"></a>00392 <span class="comment"> * consider some characters outside this range to be alphabetic,</span>
<a name="l00393"></a>00393 <span class="comment"> * so the file command would call such characters ASCII.  It might</span>
<a name="l00394"></a>00394 <span class="comment"> * have been more accurate to call this "considered textual on the</span>
<a name="l00395"></a>00395 <span class="comment"> * local system" than "ASCII."</span>
<a name="l00396"></a>00396 <span class="comment"> *</span>
<a name="l00397"></a>00397 <span class="comment"> * It considered a file to be "International language text" if each</span>
<a name="l00398"></a>00398 <span class="comment"> * of its characters was either an ASCII printing character (according</span>
<a name="l00399"></a>00399 <span class="comment"> * to the real ASCII standard, not the above test), a character in</span>
<a name="l00400"></a>00400 <span class="comment"> * the range 0x80 ... 0xFF, or one of the following control characters:</span>
<a name="l00401"></a>00401 <span class="comment"> * backspace, tab, line feed, vertical tab, form feed, carriage return,</span>
<a name="l00402"></a>00402 <span class="comment"> * escape.  No attempt was made to determine the language in which files</span>
<a name="l00403"></a>00403 <span class="comment"> * of this type were written.</span>
<a name="l00404"></a>00404 <span class="comment"> *</span>
<a name="l00405"></a>00405 <span class="comment"> *</span>
<a name="l00406"></a>00406 <span class="comment"> * The table below considers a file to be ASCII if all of its characters</span>
<a name="l00407"></a>00407 <span class="comment"> * are either ASCII printing characters (again, according to the X3.4</span>
<a name="l00408"></a>00408 <span class="comment"> * standard, not isascii()) or any of the following controls: bell,</span>
<a name="l00409"></a>00409 <span class="comment"> * backspace, tab, line feed, form feed, carriage return, esc, nextline.</span>
<a name="l00410"></a>00410 <span class="comment"> *</span>
<a name="l00411"></a>00411 <span class="comment"> * I include bell because some programs (particularly shell scripts)</span>
<a name="l00412"></a>00412 <span class="comment"> * use it literally, even though it is rare in normal text.  I exclude</span>
<a name="l00413"></a>00413 <span class="comment"> * vertical tab because it never seems to be used in real text.  I also</span>
<a name="l00414"></a>00414 <span class="comment"> * include, with hesitation, the X3.64/ECMA-43 control nextline (0x85),</span>
<a name="l00415"></a>00415 <span class="comment"> * because that's what the dd EBCDIC-&gt;ASCII table maps the EBCDIC newline</span>
<a name="l00416"></a>00416 <span class="comment"> * character to.  It might be more appropriate to include it in the 8859</span>
<a name="l00417"></a>00417 <span class="comment"> * set instead of the ASCII set, but it's got to be included in *something*</span>
<a name="l00418"></a>00418 <span class="comment"> * we recognize or EBCDIC files aren't going to be considered textual.</span>
<a name="l00419"></a>00419 <span class="comment"> * Some old Unix source files use SO/SI (^N/^O) to shift between Greek</span>
<a name="l00420"></a>00420 <span class="comment"> * and Latin characters, so these should possibly be allowed.  But they</span>
<a name="l00421"></a>00421 <span class="comment"> * make a real mess on VT100-style displays if they're not paired properly,</span>
<a name="l00422"></a>00422 <span class="comment"> * so we are probably better off not calling them text.</span>
<a name="l00423"></a>00423 <span class="comment"> *</span>
<a name="l00424"></a>00424 <span class="comment"> * A file is considered to be ISO-8859 text if its characters are all</span>
<a name="l00425"></a>00425 <span class="comment"> * either ASCII, according to the above definition, or printing characters</span>
<a name="l00426"></a>00426 <span class="comment"> * from the ISO-8859 8-bit extension, characters 0xA0 ... 0xFF.</span>
<a name="l00427"></a>00427 <span class="comment"> *</span>
<a name="l00428"></a>00428 <span class="comment"> * Finally, a file is considered to be international text from some other</span>
<a name="l00429"></a>00429 <span class="comment"> * character code if its characters are all either ISO-8859 (according to</span>
<a name="l00430"></a>00430 <span class="comment"> * the above definition) or characters in the range 0x80 ... 0x9F, which</span>
<a name="l00431"></a>00431 <span class="comment"> * ISO-8859 considers to be control characters but the IBM PC and Macintosh</span>
<a name="l00432"></a>00432 <span class="comment"> * consider to be printing characters.</span>
<a name="l00433"></a>00433 <span class="comment"> */</span>
<a name="l00434"></a>00434 
<a name="l00435"></a><a class="code" href="ascmagic_8c.html#42257a545daf5b7933d6e8f96adc74f2">00435</a> <span class="preprocessor">#define F 0   </span><span class="comment">/* character never appears in text */</span>
<a name="l00436"></a><a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">00436</a> <span class="preprocessor">#define T 1   </span><span class="comment">/* character appears in plain ASCII text */</span>
<a name="l00437"></a><a class="code" href="ascmagic_8c.html#60ef6e1bcfabb95cfeb300e1d03ce470">00437</a> <span class="preprocessor">#define I 2   </span><span class="comment">/* character appears in ISO-8859 text */</span>
<a name="l00438"></a><a class="code" href="ascmagic_8c.html#207fd5507206d307cd63f95374fcd00d">00438</a> <span class="preprocessor">#define X 3   </span><span class="comment">/* character appears in non-ISO extended ASCII (Mac, IBM PC) */</span>
<a name="l00439"></a>00439 
<a name="l00440"></a>00440 <span class="comment">/*@unchecked@*/</span> <span class="comment">/*@observer@*/</span>
<a name="l00441"></a><a class="code" href="ascmagic_8c.html#d7c056e8e5e3cae34eff0f7dd002b9c2">00441</a> <span class="keyword">private</span> <span class="keywordtype">char</span> <a class="code" href="ascmagic_8c.html#d7c056e8e5e3cae34eff0f7dd002b9c2">text_chars</a>[256] = {
<a name="l00442"></a>00442         <span class="comment">/*                  BEL BS HT LF    FF CR    */</span>
<a name="l00443"></a>00443         <a class="code" href="ascmagic_8c.html#42257a545daf5b7933d6e8f96adc74f2">F</a>, <a class="code" href="ascmagic_8c.html#42257a545daf5b7933d6e8f96adc74f2">F</a>, F, F, F, F, F, <a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">T</a>, T, T, T, F, T, T, F, F,  <span class="comment">/* 0x0X */</span>
<a name="l00444"></a>00444         <span class="comment">/*                              ESC          */</span>
<a name="l00445"></a>00445         F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F,  <span class="comment">/* 0x1X */</span>
<a name="l00446"></a>00446         T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  <span class="comment">/* 0x2X */</span>
<a name="l00447"></a>00447         T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  <span class="comment">/* 0x3X */</span>
<a name="l00448"></a>00448         T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  <span class="comment">/* 0x4X */</span>
<a name="l00449"></a>00449         T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  <span class="comment">/* 0x5X */</span>
<a name="l00450"></a>00450         T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  <span class="comment">/* 0x6X */</span>
<a name="l00451"></a>00451         T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F,  <span class="comment">/* 0x7X */</span>
<a name="l00452"></a>00452         <span class="comment">/*            NEL                            */</span>
<a name="l00453"></a>00453         <a class="code" href="ascmagic_8c.html#207fd5507206d307cd63f95374fcd00d">X</a>, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X,  <span class="comment">/* 0x8X */</span>
<a name="l00454"></a>00454         X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,  <span class="comment">/* 0x9X */</span>
<a name="l00455"></a>00455         <a class="code" href="ascmagic_8c.html#60ef6e1bcfabb95cfeb300e1d03ce470">I</a>, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  <span class="comment">/* 0xaX */</span>
<a name="l00456"></a>00456         I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  <span class="comment">/* 0xbX */</span>
<a name="l00457"></a>00457         I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  <span class="comment">/* 0xcX */</span>
<a name="l00458"></a>00458         I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  <span class="comment">/* 0xdX */</span>
<a name="l00459"></a>00459         I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  <span class="comment">/* 0xeX */</span>
<a name="l00460"></a>00460         I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I   <span class="comment">/* 0xfX */</span>
<a name="l00461"></a>00461 };
<a name="l00462"></a>00462 
<a name="l00463"></a>00463 <span class="keyword">private</span> <span class="keywordtype">int</span>
<a name="l00464"></a><a class="code" href="ascmagic_8c.html#73884ebc89dc00d2758ed9cd580084e1">00464</a> <a class="code" href="ascmagic_8c.html#73884ebc89dc00d2758ed9cd580084e1">looks_ascii</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf,
<a name="l00465"></a>00465     size_t *ulen)
<a name="l00466"></a>00466 {
<a name="l00467"></a>00467         <span class="keywordtype">int</span> i;
<a name="l00468"></a>00468 
<a name="l00469"></a>00469         *ulen = 0;
<a name="l00470"></a>00470 
<a name="l00471"></a>00471         <span class="keywordflow">for</span> (i = 0; i &lt; nbytes; i++) {
<a name="l00472"></a>00472                 <span class="keywordtype">int</span> t = text_chars[buf[i]];
<a name="l00473"></a>00473 
<a name="l00474"></a>00474                 <span class="keywordflow">if</span> (t != <a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">T</a>)
<a name="l00475"></a>00475                         <span class="keywordflow">return</span> 0;
<a name="l00476"></a>00476 
<a name="l00477"></a>00477                 ubuf[(*ulen)++] = buf[i];
<a name="l00478"></a>00478         }
<a name="l00479"></a>00479 
<a name="l00480"></a>00480         <span class="keywordflow">return</span> 1;
<a name="l00481"></a>00481 }
<a name="l00482"></a>00482 
<a name="l00483"></a>00483 <span class="keyword">private</span> <span class="keywordtype">int</span>
<a name="l00484"></a><a class="code" href="ascmagic_8c.html#1354a65e0ffb3a3ec43624500ac1393f">00484</a> <a class="code" href="ascmagic_8c.html#1354a65e0ffb3a3ec43624500ac1393f">looks_latin1</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00485"></a>00485 {
<a name="l00486"></a>00486         <span class="keywordtype">int</span> i;
<a name="l00487"></a>00487 
<a name="l00488"></a>00488         *ulen = 0;
<a name="l00489"></a>00489 
<a name="l00490"></a>00490         <span class="keywordflow">for</span> (i = 0; i &lt; nbytes; i++) {
<a name="l00491"></a>00491                 <span class="keywordtype">int</span> t = text_chars[buf[i]];
<a name="l00492"></a>00492 
<a name="l00493"></a>00493                 <span class="keywordflow">if</span> (t != <a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">T</a> &amp;&amp; t != I)
<a name="l00494"></a>00494                         <span class="keywordflow">return</span> 0;
<a name="l00495"></a>00495 
<a name="l00496"></a>00496                 ubuf[(*ulen)++] = buf[i];
<a name="l00497"></a>00497         }
<a name="l00498"></a>00498 
<a name="l00499"></a>00499         <span class="keywordflow">return</span> 1;
<a name="l00500"></a>00500 }
<a name="l00501"></a>00501 
<a name="l00502"></a>00502 <span class="keyword">private</span> <span class="keywordtype">int</span>
<a name="l00503"></a><a class="code" href="ascmagic_8c.html#908fae6ebc758400d44ad85f6a3701bc">00503</a> <a class="code" href="ascmagic_8c.html#908fae6ebc758400d44ad85f6a3701bc">looks_extended</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf,
<a name="l00504"></a>00504     size_t *ulen)
<a name="l00505"></a>00505 {
<a name="l00506"></a>00506         <span class="keywordtype">int</span> i;
<a name="l00507"></a>00507 
<a name="l00508"></a>00508         *ulen = 0;
<a name="l00509"></a>00509 
<a name="l00510"></a>00510         <span class="keywordflow">for</span> (i = 0; i &lt; nbytes; i++) {
<a name="l00511"></a>00511                 <span class="keywordtype">int</span> t = text_chars[buf[i]];
<a name="l00512"></a>00512 
<a name="l00513"></a>00513                 <span class="keywordflow">if</span> (t != <a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">T</a> &amp;&amp; t != I &amp;&amp; t != <a class="code" href="ascmagic_8c.html#207fd5507206d307cd63f95374fcd00d">X</a>)
<a name="l00514"></a>00514                         <span class="keywordflow">return</span> 0;
<a name="l00515"></a>00515 
<a name="l00516"></a>00516                 ubuf[(*ulen)++] = buf[i];
<a name="l00517"></a>00517         }
<a name="l00518"></a>00518 
<a name="l00519"></a>00519         <span class="keywordflow">return</span> 1;
<a name="l00520"></a>00520 }
<a name="l00521"></a>00521 
<a name="l00522"></a>00522 <span class="keyword">private</span> <span class="keywordtype">int</span>
<a name="l00523"></a><a class="code" href="ascmagic_8c.html#181a844ab9c892d746837c5727f28358">00523</a> <a class="code" href="ascmagic_8c.html#181a844ab9c892d746837c5727f28358">looks_utf8</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
<a name="l00524"></a>00524 {
<a name="l00525"></a>00525         <span class="keywordtype">int</span> i, n;
<a name="l00526"></a>00526         unichar c;
<a name="l00527"></a>00527         <span class="keywordtype">int</span> gotone = 0;
<a name="l00528"></a>00528 
<a name="l00529"></a>00529         *ulen = 0;
<a name="l00530"></a>00530 
<a name="l00531"></a>00531         <span class="keywordflow">for</span> (i = 0; i &lt; nbytes; i++) {
<a name="l00532"></a>00532                 <span class="keywordflow">if</span> ((buf[i] &amp; 0x80) == 0) {        <span class="comment">/* 0xxxxxxx is plain ASCII */</span>
<a name="l00533"></a>00533                         <span class="comment">/*</span>
<a name="l00534"></a>00534 <span class="comment">                         * Even if the whole file is valid UTF-8 sequences,</span>
<a name="l00535"></a>00535 <span class="comment">                         * still reject it if it uses weird control characters.</span>
<a name="l00536"></a>00536 <span class="comment">                         */</span>
<a name="l00537"></a>00537 
<a name="l00538"></a>00538                         <span class="keywordflow">if</span> (text_chars[buf[i]] != <a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">T</a>)
<a name="l00539"></a>00539                                 <span class="keywordflow">return</span> 0;
<a name="l00540"></a>00540 
<a name="l00541"></a>00541                         ubuf[(*ulen)++] = buf[i];
<a name="l00542"></a>00542                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((buf[i] &amp; 0x40) == 0) { <span class="comment">/* 10xxxxxx never 1st byte */</span>
<a name="l00543"></a>00543                         <span class="keywordflow">return</span> 0;
<a name="l00544"></a>00544                 } <span class="keywordflow">else</span> {                           <span class="comment">/* 11xxxxxx begins UTF-8 */</span>
<a name="l00545"></a>00545                         <span class="keywordtype">int</span> following;
<a name="l00546"></a>00546 
<a name="l00547"></a>00547                         <span class="keywordflow">if</span> ((buf[i] &amp; 0x20) == 0) {             <span class="comment">/* 110xxxxx */</span>
<a name="l00548"></a>00548                                 c = buf[i] &amp; 0x1f;
<a name="l00549"></a>00549                                 following = 1;
<a name="l00550"></a>00550                         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((buf[i] &amp; 0x10) == 0) {      <span class="comment">/* 1110xxxx */</span>
<a name="l00551"></a>00551                                 c = buf[i] &amp; 0x0f;
<a name="l00552"></a>00552                                 following = 2;
<a name="l00553"></a>00553                         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((buf[i] &amp; 0x08) == 0) {      <span class="comment">/* 11110xxx */</span>
<a name="l00554"></a>00554                                 c = buf[i] &amp; 0x07;
<a name="l00555"></a>00555                                 following = 3;
<a name="l00556"></a>00556                         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((buf[i] &amp; 0x04) == 0) {      <span class="comment">/* 111110xx */</span>
<a name="l00557"></a>00557                                 c = buf[i] &amp; 0x03;
<a name="l00558"></a>00558                                 following = 4;
<a name="l00559"></a>00559                         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((buf[i] &amp; 0x02) == 0) {      <span class="comment">/* 1111110x */</span>
<a name="l00560"></a>00560                                 c = buf[i] &amp; 0x01;
<a name="l00561"></a>00561                                 following = 5;
<a name="l00562"></a>00562                         } <span class="keywordflow">else</span>
<a name="l00563"></a>00563                                 <span class="keywordflow">return</span> 0;
<a name="l00564"></a>00564 
<a name="l00565"></a>00565                         <span class="keywordflow">for</span> (n = 0; n &lt; following; n++) {
<a name="l00566"></a>00566                                 i++;
<a name="l00567"></a>00567                                 <span class="keywordflow">if</span> (i &gt;= nbytes)
<a name="l00568"></a>00568                                         <span class="keywordflow">goto</span> done;
<a name="l00569"></a>00569 
<a name="l00570"></a>00570                                 <span class="keywordflow">if</span> ((buf[i] &amp; 0x80) == 0 || (buf[i] &amp; 0x40))
<a name="l00571"></a>00571                                         <span class="keywordflow">return</span> 0;
<a name="l00572"></a>00572 
<a name="l00573"></a>00573                                 c = (c &lt;&lt; 6) + (buf[i] &amp; 0x3f);
<a name="l00574"></a>00574                         }
<a name="l00575"></a>00575 
<a name="l00576"></a>00576                         ubuf[(*ulen)++] = c;
<a name="l00577"></a>00577                         gotone = 1;
<a name="l00578"></a>00578                 }
<a name="l00579"></a>00579         }
<a name="l00580"></a>00580 done:
<a name="l00581"></a>00581         <span class="keywordflow">return</span> gotone;   <span class="comment">/* don't claim it's UTF-8 if it's all 7-bit */</span>
<a name="l00582"></a>00582 }
<a name="l00583"></a>00583 
<a name="l00584"></a>00584 <span class="keyword">private</span> <span class="keywordtype">int</span>
<a name="l00585"></a><a class="code" href="ascmagic_8c.html#92d0d3f4c94780b510a34de5d4136001">00585</a> <a class="code" href="ascmagic_8c.html#92d0d3f4c94780b510a34de5d4136001">looks_unicode</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, unichar *ubuf,
<a name="l00586"></a>00586     size_t *ulen)
<a name="l00587"></a>00587 {
<a name="l00588"></a>00588         <span class="keywordtype">int</span> bigend;
<a name="l00589"></a>00589         <span class="keywordtype">int</span> i;
<a name="l00590"></a>00590 
<a name="l00591"></a>00591         <span class="keywordflow">if</span> (nbytes &lt; 2)
<a name="l00592"></a>00592                 <span class="keywordflow">return</span> 0;
<a name="l00593"></a>00593 
<a name="l00594"></a>00594         <span class="keywordflow">if</span> (buf[0] == 0xff &amp;&amp; buf[1] == 0xfe)
<a name="l00595"></a>00595                 bigend = 0;
<a name="l00596"></a>00596         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (buf[0] == 0xfe &amp;&amp; buf[1] == 0xff)
<a name="l00597"></a>00597                 bigend = 1;
<a name="l00598"></a>00598         <span class="keywordflow">else</span>
<a name="l00599"></a>00599                 <span class="keywordflow">return</span> 0;
<a name="l00600"></a>00600 
<a name="l00601"></a>00601         *ulen = 0;
<a name="l00602"></a>00602 
<a name="l00603"></a>00603         <span class="keywordflow">for</span> (i = 2; i + 1 &lt; nbytes; i += 2) {
<a name="l00604"></a>00604                 <span class="comment">/* XXX fix to properly handle chars &gt; 65536 */</span>
<a name="l00605"></a>00605 
<a name="l00606"></a>00606                 <span class="keywordflow">if</span> (bigend)
<a name="l00607"></a>00607                         ubuf[(*ulen)++] = buf[i + 1] + 256 * buf[i];
<a name="l00608"></a>00608                 <span class="keywordflow">else</span>
<a name="l00609"></a>00609                         ubuf[(*ulen)++] = buf[i] + 256 * buf[i + 1];
<a name="l00610"></a>00610 
<a name="l00611"></a>00611                 <span class="keywordflow">if</span> (ubuf[*ulen - 1] == 0xfffe)
<a name="l00612"></a>00612                         <span class="keywordflow">return</span> 0;
<a name="l00613"></a>00613                 <span class="keywordflow">if</span> (ubuf[*ulen - 1] &lt; 128 &amp;&amp;
<a name="l00614"></a>00614                     text_chars[(size_t)ubuf[*ulen - 1]] != <a class="code" href="ascmagic_8c.html#0acb682b8260ab1c60b918599864e2e5">T</a>)
<a name="l00615"></a>00615                         <span class="keywordflow">return</span> 0;
<a name="l00616"></a>00616         }
<a name="l00617"></a>00617 
<a name="l00618"></a>00618         <span class="keywordflow">return</span> 1 + bigend;
<a name="l00619"></a>00619 }
<a name="l00620"></a>00620 
<a name="l00621"></a>00621 <span class="preprocessor">#undef F</span>
<a name="l00622"></a>00622 <span class="preprocessor"></span><span class="preprocessor">#undef T</span>
<a name="l00623"></a>00623 <span class="preprocessor"></span><span class="preprocessor">#undef I</span>
<a name="l00624"></a>00624 <span class="preprocessor"></span><span class="preprocessor">#undef X</span>
<a name="l00625"></a>00625 <span class="preprocessor"></span>
<a name="l00626"></a>00626 <span class="comment">/*</span>
<a name="l00627"></a>00627 <span class="comment"> * This table maps each EBCDIC character to an (8-bit extended) ASCII</span>
<a name="l00628"></a>00628 <span class="comment"> * character, as specified in the rationale for the dd(1) command in</span>
<a name="l00629"></a>00629 <span class="comment"> * draft 11.2 (September, 1991) of the POSIX P1003.2 standard.</span>
<a name="l00630"></a>00630 <span class="comment"> *</span>
<a name="l00631"></a>00631 <span class="comment"> * Unfortunately it does not seem to correspond exactly to any of the</span>
<a name="l00632"></a>00632 <span class="comment"> * five variants of EBCDIC documented in IBM's _Enterprise Systems</span>
<a name="l00633"></a>00633 <span class="comment"> * Architecture/390: Principles of Operation_, SA22-7201-06, Seventh</span>
<a name="l00634"></a>00634 <span class="comment"> * Edition, July, 1999, pp. I-1 - I-4.</span>
<a name="l00635"></a>00635 <span class="comment"> *</span>
<a name="l00636"></a>00636 <span class="comment"> * Fortunately, though, all versions of EBCDIC, including this one, agree</span>
<a name="l00637"></a>00637 <span class="comment"> * on most of the printing characters that also appear in (7-bit) ASCII.</span>
<a name="l00638"></a>00638 <span class="comment"> * Of these, only '|', '!', '~', '^', '[', and ']' are in question at all.</span>
<a name="l00639"></a>00639 <span class="comment"> *</span>
<a name="l00640"></a>00640 <span class="comment"> * Fortunately too, there is general agreement that codes 0x00 through</span>
<a name="l00641"></a>00641 <span class="comment"> * 0x3F represent control characters, 0x41 a nonbreaking space, and the</span>
<a name="l00642"></a>00642 <span class="comment"> * remainder printing characters.</span>
<a name="l00643"></a>00643 <span class="comment"> *</span>
<a name="l00644"></a>00644 <span class="comment"> * This is sufficient to allow us to identify EBCDIC text and to distinguish</span>
<a name="l00645"></a>00645 <span class="comment"> * between old-style and internationalized examples of text.</span>
<a name="l00646"></a>00646 <span class="comment"> */</span>
<a name="l00647"></a>00647 
<a name="l00648"></a>00648 <span class="comment">/*@unchecked@*/</span> <span class="comment">/*@observer@*/</span>
<a name="l00649"></a><a class="code" href="ascmagic_8c.html#19fff20af95804acf66d638dcba6e5b2">00649</a> <span class="keyword">private</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="ascmagic_8c.html#19fff20af95804acf66d638dcba6e5b2">ebcdic_to_ascii</a>[] = {
<a name="l00650"></a>00650   0,   1,   2,   3, 156,   9, 134, 127, 151, 141, 142,  11,  12,  13,  14,  15,
<a name="l00651"></a>00651  16,  17,  18,  19, 157, 133,   8, 135,  24,  25, 146, 143,  28,  29,  30,  31,
<a name="l00652"></a>00652 128, 129, 130, 131, 132,  10,  23,  27, 136, 137, 138, 139, 140,   5,   6,   7,
<a name="l00653"></a>00653 144, 145,  22, 147, 148, 149, 150,   4, 152, 153, 154, 155,  20,  21, 158,  26,
<a name="l00654"></a>00654 <span class="charliteral">' '</span>, 160, 161, 162, 163, 164, 165, 166, 167, 168, 213, <span class="charliteral">'.'</span>, <span class="charliteral">'&lt;'</span>, <span class="charliteral">'('</span>, <span class="charliteral">'+'</span>, <span class="charliteral">'|'</span>,
<a name="l00655"></a>00655 <span class="charliteral">'&amp;'</span>, 169, 170, 171, 172, 173, 174, 175, 176, 177, <span class="charliteral">'!'</span>, <span class="charliteral">'$'</span>, <span class="charliteral">'*'</span>, <span class="charliteral">')'</span>, <span class="charliteral">';'</span>, <span class="charliteral">'~'</span>,
<a name="l00656"></a>00656 <span class="charliteral">'-'</span>, <span class="charliteral">'/'</span>, 178, 179, 180, 181, 182, 183, 184, 185, 203, <span class="charliteral">','</span>, <span class="charliteral">'%'</span>, <span class="charliteral">'_'</span>, <span class="charliteral">'&gt;'</span>, <span class="charliteral">'?'</span>,
<a name="l00657"></a>00657 186, 187, 188, 189, 190, 191, 192, 193, 194, <span class="charliteral">'`'</span>, <span class="charliteral">':'</span>, <span class="charliteral">'#'</span>, <span class="charliteral">'@'</span>, <span class="charliteral">'\''</span>,<span class="charliteral">'='</span>, <span class="charliteral">'"'</span>,
<a name="l00658"></a>00658 195, <span class="charliteral">'a'</span>, <span class="charliteral">'b'</span>, <span class="charliteral">'c'</span>, <span class="charliteral">'d'</span>, <span class="charliteral">'e'</span>, <span class="charliteral">'f'</span>, <span class="charliteral">'g'</span>, <span class="charliteral">'h'</span>, <span class="charliteral">'i'</span>, 196, 197, 198, 199, 200, 201,
<a name="l00659"></a>00659 202, <span class="charliteral">'j'</span>, <span class="charliteral">'k'</span>, <span class="charliteral">'l'</span>, <span class="charliteral">'m'</span>, <span class="charliteral">'n'</span>, <span class="charliteral">'o'</span>, <span class="charliteral">'p'</span>, <span class="charliteral">'q'</span>, <span class="charliteral">'r'</span>, <span class="charliteral">'^'</span>, 204, 205, 206, 207, 208,
<a name="l00660"></a>00660 209, 229, <span class="charliteral">'s'</span>, <span class="charliteral">'t'</span>, <span class="charliteral">'u'</span>, <span class="charliteral">'v'</span>, <span class="charliteral">'w'</span>, <span class="charliteral">'x'</span>, <span class="charliteral">'y'</span>, <span class="charliteral">'z'</span>, 210, 211, 212, <span class="charliteral">'['</span>, 214, 215,
<a name="l00661"></a>00661 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, <span class="charliteral">']'</span>, 230, 231,
<a name="l00662"></a>00662 <span class="charliteral">'{'</span>, <span class="charliteral">'A'</span>, <span class="charliteral">'B'</span>, <span class="charliteral">'C'</span>, <span class="charliteral">'D'</span>, <span class="charliteral">'E'</span>, <span class="charliteral">'F'</span>, <span class="charliteral">'G'</span>, <span class="charliteral">'H'</span>, <span class="charliteral">'I'</span>, 232, 233, 234, 235, 236, 237,
<a name="l00663"></a>00663 <span class="charliteral">'}'</span>, <span class="charliteral">'J'</span>, <span class="charliteral">'K'</span>, <span class="charliteral">'L'</span>, <span class="charliteral">'M'</span>, <span class="charliteral">'N'</span>, <span class="charliteral">'O'</span>, <span class="charliteral">'P'</span>, <span class="charliteral">'Q'</span>, <span class="charliteral">'R'</span>, 238, 239, 240, 241, 242, 243,
<a name="l00664"></a>00664 <span class="charliteral">'\\'</span>,159, <span class="charliteral">'S'</span>, <span class="charliteral">'T'</span>, <span class="charliteral">'U'</span>, <span class="charliteral">'V'</span>, <span class="charliteral">'W'</span>, <span class="charliteral">'X'</span>, <span class="charliteral">'Y'</span>, <span class="charliteral">'Z'</span>, 244, 245, 246, 247, 248, 249,
<a name="l00665"></a>00665 <span class="charliteral">'0'</span>, <span class="charliteral">'1'</span>, <span class="charliteral">'2'</span>, <span class="charliteral">'3'</span>, <span class="charliteral">'4'</span>, <span class="charliteral">'5'</span>, <span class="charliteral">'6'</span>, <span class="charliteral">'7'</span>, <span class="charliteral">'8'</span>, <span class="charliteral">'9'</span>, 250, 251, 252, 253, 254, 255
<a name="l00666"></a>00666 };
<a name="l00667"></a>00667 
<a name="l00668"></a>00668 <span class="preprocessor">#ifdef notdef</span>
<a name="l00669"></a>00669 <span class="preprocessor"></span><span class="comment">/*</span>
<a name="l00670"></a>00670 <span class="comment"> * The following EBCDIC-to-ASCII table may relate more closely to reality,</span>
<a name="l00671"></a>00671 <span class="comment"> * or at least to modern reality.  It comes from</span>
<a name="l00672"></a>00672 <span class="comment"> *</span>
<a name="l00673"></a>00673 <span class="comment"> *   http://ftp.s390.ibm.com/products/oe/bpxqp9.html</span>
<a name="l00674"></a>00674 <span class="comment"> *</span>
<a name="l00675"></a>00675 <span class="comment"> * and maps the characters of EBCDIC code page 1047 (the code used for</span>
<a name="l00676"></a>00676 <span class="comment"> * Unix-derived software on IBM's 390 systems) to the corresponding</span>
<a name="l00677"></a>00677 <span class="comment"> * characters from ISO 8859-1.</span>
<a name="l00678"></a>00678 <span class="comment"> *</span>
<a name="l00679"></a>00679 <span class="comment"> * If this table is used instead of the above one, some of the special</span>
<a name="l00680"></a>00680 <span class="comment"> * cases for the NEL character can be taken out of the code.</span>
<a name="l00681"></a>00681 <span class="comment"> */</span>
<a name="l00682"></a>00682 
<a name="l00683"></a>00683 <span class="comment">/*@unchecked@*/</span> <span class="comment">/*@observer@*/</span>
<a name="l00684"></a>00684 <span class="keyword">private</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ebcdic_1047_to_8859[] = {
<a name="l00685"></a>00685 0x00,0x01,0x02,0x03,0x9C,0x09,0x86,0x7F,0x97,0x8D,0x8E,0x0B,0x0C,0x0D,0x0E,0x0F,
<a name="l00686"></a>00686 0x10,0x11,0x12,0x13,0x9D,0x0A,0x08,0x87,0x18,0x19,0x92,0x8F,0x1C,0x1D,0x1E,0x1F,
<a name="l00687"></a>00687 0x80,0x81,0x82,0x83,0x84,0x85,0x17,0x1B,0x88,0x89,0x8A,0x8B,0x8C,0x05,0x06,0x07,
<a name="l00688"></a>00688 0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9A,0x9B,0x14,0x15,0x9E,0x1A,
<a name="l00689"></a>00689 0x20,0xA0,0xE2,0xE4,0xE0,0xE1,0xE3,0xE5,0xE7,0xF1,0xA2,0x2E,0x3C,0x28,0x2B,0x7C,
<a name="l00690"></a>00690 0x26,0xE9,0xEA,0xEB,0xE8,0xED,0xEE,0xEF,0xEC,0xDF,0x21,0x24,0x2A,0x29,0x3B,0x5E,
<a name="l00691"></a>00691 0x2D,0x2F,0xC2,0xC4,0xC0,0xC1,0xC3,0xC5,0xC7,0xD1,0xA6,0x2C,0x25,0x5F,0x3E,0x3F,
<a name="l00692"></a>00692 0xF8,0xC9,0xCA,0xCB,0xC8,0xCD,0xCE,0xCF,0xCC,0x60,0x3A,0x23,0x40,0x27,0x3D,0x22,
<a name="l00693"></a>00693 0xD8,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0xAB,0xBB,0xF0,0xFD,0xFE,0xB1,
<a name="l00694"></a>00694 0xB0,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0xAA,0xBA,0xE6,0xB8,0xC6,0xA4,
<a name="l00695"></a>00695 0xB5,0x7E,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0xA1,0xBF,0xD0,0x5B,0xDE,0xAE,
<a name="l00696"></a>00696 0xAC,0xA3,0xA5,0xB7,0xA9,0xA7,0xB6,0xBC,0xBD,0xBE,0xDD,0xA8,0xAF,0x5D,0xB4,0xD7,
<a name="l00697"></a>00697 0x7B,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0xAD,0xF4,0xF6,0xF2,0xF3,0xF5,
<a name="l00698"></a>00698 0x7D,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0xB9,0xFB,0xFC,0xF9,0xFA,0xFF,
<a name="l00699"></a>00699 0x5C,0xF7,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0xB2,0xD4,0xD6,0xD2,0xD3,0xD5,
<a name="l00700"></a>00700 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xB3,0xDB,0xDC,0xD9,0xDA,0x9F
<a name="l00701"></a>00701 };
<a name="l00702"></a>00702 <span class="preprocessor">#endif</span>
<a name="l00703"></a>00703 <span class="preprocessor"></span>
<a name="l00704"></a>00704 <span class="comment">/*</span>
<a name="l00705"></a>00705 <span class="comment"> * Copy buf[0 ... nbytes-1] into out[], translating EBCDIC to ASCII.</span>
<a name="l00706"></a>00706 <span class="comment"> */</span>
<a name="l00707"></a>00707 <span class="keyword">private</span> <span class="keywordtype">void</span>
<a name="l00708"></a><a class="code" href="ascmagic_8c.html#fb1a22bccf649f46a313d0969f8ca436">00708</a> <a class="code" href="ascmagic_8c.html#fb1a22bccf649f46a313d0969f8ca436">from_ebcdic</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, size_t nbytes, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *out)
<a name="l00709"></a>00709 {
<a name="l00710"></a>00710         <span class="keywordtype">int</span> i;
<a name="l00711"></a>00711 
<a name="l00712"></a>00712         <span class="keywordflow">for</span> (i = 0; i &lt; nbytes; i++) {
<a name="l00713"></a>00713                 out[i] = ebcdic_to_ascii[buf[i]];
<a name="l00714"></a>00714         }
<a name="l00715"></a>00715 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on 1 Oct 2013 for rpm by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
</body>
</html>