<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>coding my life</title>
<link>http://coji.s9.xrea.com/index.php</link>
<pubDate>Sat, 24 May 2008 01:00:53 </pubDate>
<description>
coding my life - RSS 2.0 (Really Simple Syndication).
</description>
<item>
<title>日本の技術系プレゼンテーション参加者のためのハブサイト</title>
<link>http://coji.s9.xrea.com/article.php?id=73</link>
<pubDate>Sat, 24 May 2008 01:00:53 +0900</pubDate>
<description>
perl-users.jpのインスパイヤブームの流れで、こんなサイトを立ち上げてみました。


TechTalk.jp - 日本の技術系プレゼンテーション参加者のためのハブサイト


今後、セミナーとかイベントで撮ったり公開した動画はそっ...</description>
<content:encoded>
<![CDATA[<p>
<a href="http://perl-users.jp">perl-users.jp</a>のインスパイヤブームの流れで、こんなサイトを立ち上げてみました。</p>
<ul>
<li>
<a href="http://techtalk.jp/">TechTalk.jp - 日本の技術系プレゼンテーション参加者のためのハブサイト</a>
</li>
</ul>
<p>今後、セミナーとかイベントで撮ったり公開した動画はそっちの方に投稿すると思います。
こっちはプログラミング関係のブログとして残します。</p>
]]>
</content:encoded>
</item><item>
<title>perl-users.jp</title>
<link>http://coji.s9.xrea.com/article.php?id=72</link>
<pubDate>Wed, 21 May 2008 09:57:47 +0900</pubDate>
<description>
perl-users.jp - 日本のPerlユーザのためのハブサイト というのを id:yappo が立ち上げてくださいました。
www 上の日本語で書かれている perl 情報は本当に玉石混合で困ってたので、このサイトが内容充実しつつ...</description>
<content:encoded>
<![CDATA[<p>
<a href="http://perl-users.jp/">perl-users.jp - 日本のPerlユーザのためのハブサイト</a> というのを id:yappo が立ち上げてくださいました。</p>
<p>www 上の日本語で書かれている perl 情報は本当に玉石混合で困ってたので、このサイトが内容充実しつつ "perl" で検索して最初の3つぐらいになったら素敵だとおもいます。というわけで支援。</p>
]]>
</content:encoded>
</item><item>
<title>YAPC::Asia 2008 Larry's keynote and DeNA room sessions</title>
<link>http://coji.s9.xrea.com/article.php?id=71</link>
<pubDate>Tue, 20 May 2008 09:11:31 +0900</pubDate>
<description>先週行われたYAPC::Asia 2008の動画、
Larry の Keynote と、私が担当した DeNA room の二日分をニコニコ動画にて公開しました。

YAPC::Asia 2008 のスケジュールページからリンクされている、...</description>
<content:encoded>
<![CDATA[<p>先週行われた<a href="http://conferences.yapcasia.org/ya2008/">YAPC::Asia 2008</a>の動画、
Larry の Keynote と、私が担当した DeNA room の二日分をニコニコ動画にて公開しました。</p>
<p>
<a href="http://conferences.yapcasia.org/ya2008/schedule
">YAPC::Asia 2008 のスケジュールページ</a>からリンクされている、セッション詳細情報のページにも埋め込みされています。</p>
<p>A Standard That Is Meant To Be Broken, 本当に! - Larry Wall</p>
<iframe width="312" height="176" src="http://www.nicovideo.jp/thumb/sm3353500" scrolling="no" style="border:solid 1px #CCC;" frameborder="0">
<a href="http://www.nicovideo.jp/watch/sm3353500">【ニコニコ動画】A Standard That Is Meant To Be Broken, 本当に! - Larry Wall</a>
</iframe>
<p>※ この動画はi-revoの堂前さん・川合さんが撮影されたものを id:lopnor さんにテープから吸い出していただいたものを公開用にエンコードしました。ありがとうございました！</p>
<p>DeNA room (Day 1) 7セッション</p>
<iframe width="312" height="176" src="http://www.nicovideo.jp/thumb_mylist/6727332" scrolling="no" style="border:solid 1px #CCC;" frameborder="0">
<a href="http://www.nicovideo.jp/mylist/6727332">【ニコニコ動画】YAPC::Asia 2008 DeNA room (Day 2)</a>
</iframe>
<p>※ cog の動画だけ、撮影機材のトラブルでうまくとれなかったので Xacti で撮った動画になっています。スライドが見づらくて申し訳ないです。</p>
<p>DeNA room (Day 2) 8セッション</p>
<iframe width="312" height="176" src="http://www.nicovideo.jp/thumb_mylist/6727329" scrolling="no" style="border:solid 1px #CCC;" frameborder="0">
<a href="http://www.nicovideo.jp/mylist/6727329">【ニコニコ動画】YAPC::Asia 2008 DeNA room (Day 1)</a>
</iframe>
<p>講堂とArchTypeルームでのセッション動画は、動画撮影チームでとりまとめて編集・エンコードをしているところです。</p>
<p>ちょっとトラブルもあったので１〜２週間かかるかもしれませんが、でき次第随時公開出来ると思います。</p>
<p>
<strong>2008-05-19 17:18 追記</strong>
</p>
<p>公式サイトのニュースでも告知がでましたー</p>
<ul>
<li>
<a href="http://conferences.yapcasia.org/ya2008/news/160">http://conferences.yapcasia.org/ya2008/news/160</a>
</li>
</ul>
]]>
</content:encoded>
</item><item>
<title>open の実装</title>
<link>http://coji.s9.xrea.com/article.php?id=70</link>
<pubDate>Sun, 18 May 2008 15:15:11 +0900</pubDate>
<description>arg.c:282


bool
do_open(stab,name)
     STAB * stab;
     register char * name;
{
  FILE * fp;
  int len = strlen(name)...</description>
<content:encoded>
<![CDATA[<p>arg.c:282</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
bool
do_open(stab,name)
     STAB * stab;
     register char * name;
{
  FILE * fp;
  int len = strlen(name);
  register STIO * stio = stab->stab_io;
　
  while (len &amp;&amp; isspace(name[len-1]))
    name[--len] = '\0';
  if (!stio)
    stio = stab->stab_io = stio_new();
  if (stio->fp) {
    if (stio->type == '|')
      pclose(stio->fp);
    else if (stio->type != '-')
      fclose(stio->fp);
    stio->fp = Nullfp;
  }
  stio->type = * name;
  if (* name == '|') {
    for (name++; isspace(* name); name++) ;
    fp = popen(name,"w");
  }
  else if (* name == '>' &amp;&amp; name[1] == '>') {
    for (name += 2; isspace(* name); name++) ;
    fp = fopen(name,"a");
  }
  else if (* name == '>') {
    for (name++; isspace(* name); name++) ;
    if (strEQ(name,"-")) {
      fp = stdout;
      stio->type = '-';
    }
    else
      fp = fopen(name,"w");
  }
  else {
    if (* name == '&lt;') {
      for (name++; isspace(* name); name++) ;
      if (strEQ(name,"-")) {
        fp = stdin;
        stio->type = '-';
      }
      else
        fp = fopen(name,"r");
    }
    else if (name[len-1] == '|') {
      name[--len] = '\0';
      while (len &amp;&amp; isspace(name[len-1]))
        name[--len] = '\0';
      for (; isspace(* name); name++) ;
      fp = popen(name,"r");
      stio->type = '|';
    }
    else {
      stio->type = '&lt;';
      for (; isspace(* name); name++) ;
      if (strEQ(name,"-")) {
        fp = stdin;
        stio->type = '-';
      }
      else
        fp = fopen(name,"r");
    }
  }
  if (!fp)
    return FALSE;
  if (stio->type != '|' &amp;&amp; stio->type != '-') {
    if (fstat(fileno(fp),&amp;statbuf) &lt; 0) {
      fclose(fp);
      return FALSE;
    }
    if ((statbuf.st_mode &amp; S_IFMT) != S_IFREG &amp;&amp;
        (statbuf.st_mode &amp; S_IFMT) != S_IFCHR) {
      fclose(fp);
      return FALSE;
    }
  }
  stio->fp = fp;
  return TRUE;
}
</textarea>
</p>
<p>まとめ</p>
<ul>
<li>ファイルがすでに開かれてたらいったん閉じる</li>
<li>open 引数の記号列でfopen時の書き込み・追記などを制御する。記号列とファイル名の間にはスペースを入れてもいい。
<ul>
<li>| 書き換え</li>
<li>>> 追記</li>
<li>> 書き換え (但しファイル名が - の場合は標準出力)</li>
<li>&lt; 読み込み (但しファイル名が - の場合は標準出力)</li>
</ul>
</li>
<li>引数の末尾が | で終わっている場合は popen </li>
<li>記号列自体がない場合はファイル名が指定された読み込みと同じ扱い</li>
</ul>
<p>
<strong>2008-05-18 1:13 追記</strong>
</p>
<p>おもいっきり誤読してた。</p>
<ul>
<li>| 書き込みモードで popen </li>
<li>末尾が | の場合は読み込み専用モードで popen</li>
</ul>
]]>
</content:encoded>
</item><item>
<title>リストと配列 その2 push/popとshift/unshift</title>
<link>http://coji.s9.xrea.com/article.php?id=69</link>
<pubDate>Mon, 12 May 2008 12:07:42 +0900</pubDate>
<description>昨日の続きで、リストと配列の実装を追います。今日はpush/popとshift/unshiftです。
まずは push/pop。配列の末尾に追加(push)、末尾から削除(pop)するものです。


array.c:95
bool
apus...</description>
<content:encoded>
<![CDATA[<p>昨日の続きで、リストと配列の実装を追います。今日はpush/popとshift/unshiftです。</p>
<p>まずは push/pop。配列の末尾に追加(push)、末尾から削除(pop)するものです。</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
array.c:95
bool
apush(ar,val)
     register ARRAY * ar;
     STR * val;
{
  return astore(ar,++(ar->ary_fill),val);
}
</textarea>
</p>
<p>store に処理を任せてますね。要素数を一個増やして末尾に追加。
次はpop。</p>
<p>array.c:103</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
STR *
apop(ar)
register ARRAY * ar;
{
  STR * retval;
  if (ar->ary_fill &lt; 0)
    return Nullstr;
  retval = ar->ary_array[ar->ary_fill];
  ar->ary_array[ar->ary_fill--] = Nullstr;
  return retval;
}
</textarea>
</p>
<p>要素数を一個減らして末尾を Nullstr で埋めて、それまで入ってた奴を戻すと。</p>
<p>さて次は配列の先頭を操作するshift/unshift。まずは先頭から一つ取り出す shift。</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
STR *
ashift(ar)
register ARRAY * ar;
{
  STR * retval;
　
  if (ar->ary_fill &lt; 0)
    return Nullstr;
  retval = ar->ary_array[0];
  bcopy((char<em>)(ar->ary_array+1),(char</em>)ar->ary_array,
        ar->ary_fill * sizeof(STR *));
  ar->ary_array[ar->ary_fill--] = Nullstr;
  return retval;
}
</textarea>
</p>
<p>配列1つめから末尾までのデータを先頭にコピーして、
要素数を一つへらしつつ最後の要素に Nullstrを入れると。</p>
<p>次は先頭に追加するunshift。</p>
<p>array.c:116</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
aunshift(ar,num)
register ARRAY * ar;
register int num;
{
  register int i;
  register STR * * sstr, * * dstr;
　
  if (num &lt;= 0)
    return;
  astore(ar,ar->ary_fill+num,(STR *)0); // maybe extend array
  sstr = ar->ary_array + ar->ary_fill;
  dstr = sstr + num;
  for (i = ar->ary_fill; i >= 0; i--) {
    * dstr-- = * sstr--;
  }
  bzero((char *)(ar->ary_array), num * sizeof(STR *));
}
</textarea>
</p>
<p>ダミー要素を末尾に store を利用して追加した上で、
既存の要素ポインタを一個づつずらして言ってます。
引数が num であることからどうも aunshift 自体は要素を追加するわけではなくて、
先頭に追加する要素分だけスペースを空けるだけのようです。</p>
<p>というわけで aunshift が呼ばれている部分を見てみます。
呼び出し元はやはり arg.c の eval でした。</p>
<p>arg.c:2059</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
  case O_UNSHIFT:
    ary = arg[2].arg_ptr.arg_stab->stab_array;
    if (arg[1].arg_flags &amp; AF_SPECIAL)
      do_unshift(arg,ary);
    else {
      str = str_new(0);     // must copy the STR
      str_sset(str,sarg[1]);
      aunshift(ary,1);
      astore(ary,0,str);
    }
    value = (double)(ary->ary_fill + 1);
    break;
</textarea>
</p>
<p>if AF_SPECIAL else のほうで aunshift で一つスペースを空けた上で、
ゼロ番目にastore しています。AF_SPECIALのほうでやってる do_unshift は配列を指定されたときかな？</p>
<p>do_unshift は同じく arg.c の中にありました。</p>
<p>arg.c:827</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
do_unshift(arg,ary)
register ARG * arg;
register ARRAY * ary;
{
  STR * * tmpary;   // must not be register
  register STR ** elem;
  register STR * str = &str_no;
  register int i;
　
  (void)eval(arg[1].arg_ptr.arg_arg,&amp;tmpary);
  i = 0;
  for (elem = tmpary+1; * elem; elem++)
    i++;
  aunshift(ary,i);
  i = 0;
  for (elem = tmpary+1; * elem; elem++) {
    str = str_new(0);
    str_sset(str,* elem);
    astore(ary,i++,str);
  }
  safefree((char*)tmpary);
}
</textarea>
</p>
<p>どうもそんな雰囲気です。最初に eval して配列を取得した上でその要素だけ指定された配列の先頭に aunshift、astore してます。</p>
<p>AF_SPECIAL というのが何かよくわかりません。arg の内容が問題です。</p>
<p>そろそろ eval の引数を詳しく見た方がいいかもしれません。また今度やります。</p>
]]>
</content:encoded>
</item><item>
<title>リストと配列 その1</title>
<link>http://coji.s9.xrea.com/article.php?id=68</link>
<pubDate>Sun, 11 May 2008 11:49:04 +0900</pubDate>
<description>Perl学習の続き。今日は「はじめてのPerl」第3章、「リストと配列」の前半をやりました。

3.1 配列の要素にアクセスする
3.2 配列の特別なインデクス
3.3 リストリテラル

3.3.1 qw ショートカット


3.4 リスト...</description>
<content:encoded>
<![CDATA[<p>Perl学習の続き。今日は「<a href="http://www.amazon.co.jp/dp/4873111269">はじめてのPerl</a>」第3章、「リストと配列」の前半をやりました。</p>
<ul>
<li>3.1 配列の要素にアクセスする</li>
<li>3.2 配列の特別なインデクス</li>
<li>3.3 リストリテラル
<ul>
<li>3.3.1 qw ショートカット</li>
</ul>
</li>
<li>3.4 リスト代入
<ul>
<li>3.4.1 pop演算子とpush演算子</li>
<li>3.4.2 shift演算子とunshift演算子</li>
</ul>
</li>
<li>3.5 配列を文字列の中に展開する</li>
<li>3.6 foreach 制御構造</li>
<li>3.7 Perl お気に入りのデフォルト: $_
<ul>
<li>3.7.1 reverse演算子</li>
<li>3.7.2 sort演算子</li>
</ul>
</li>
</ul>
<p>ひっかかったこと</p>
<ul>
<li>push/pop と unshift/shift の違い</li>
<li>foreach で受ける変数は要素そのもので(参照?)、代入すると配列の要素自体が変更される</li>
<li>デフォルト変数 $_ はどこでいじられてるのか。内部表現</li>
</ul>
<p>というわけで、とりあえず配列の内部表現を見てみようとまた Perl 1.0 のソースを見ます。</p>
<p>今回は簡単で、 array.h と array.c にまとまっているようです。</p>
<p>array.h (コメントは溝口)</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
struct atbl {
  STR   **ary_array;  // 配列要素のスカラ?
  int   ary_max;      // 配列の最大インデックス番号?
  int   ary_fill;     // 配列の要素数?
};
STR *afetch();
bool astore();
bool adelete();
STR *apop();
STR *ashift();
bool apush();
long alen();
ARRAY *anew();
</textarea>
</p>
<p>atbl は perl.h で typedef struct atbl ARRAY; と定義されています。</p>
<p>では配列の作成をしてるらしい anew を見ます。</p>
<p>array.c:69</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
ARRAY *
anew()
{
  register ARRAY * ar = (ARRAY *)safemalloc(sizeof(ARRAY));
　
  ar->ary_array = (STR * *) safemalloc(5 * sizeof(STR *));
  ar->ary_fill = -1;
  ar->ary_max = 4;
  bzero((char *)ar->ary_array, 5 * sizeof(STR *));
  return ar;
}
</textarea>
</p>
<p>要素のバッファを多少余分にとって確保してることがわかります。ary_max を見ると4個分？1個は末尾マーカーかな？</p>
<p>safemalloc は util.c で定義されてて、引数チェックと、メモリが確保できなかったときの異常終了をしています。bzero は perl.h で #define bzero(s,l) memset(s,0,l); されてます。</p>
<p>配列からの取得は afetch</p>
<p>array.c:16</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
STR *
afetch(ar,key)
register ARRAY *ar;
int key;
{
  if (key &lt; 0 || key > ar->ary_max)
    return Nullstr;
  return ar->ary_array[key];
}
</textarea>
</p>
<p>key が取得したい要素のインデックス番号。ここでみると数値を期待してますね。範囲外の要素は undef (Nullstr) を返すようです。</p>
<p>次、要素をいれるっぽい astore</p>
<p>array.c:26</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
bool
astore(ar,key,val)
     register ARRAY * ar;
     int key;
     STR *val;
{
  bool retval;
　
  if (key &lt; 0)
    return FALSE;
  if (key > ar->ary_max) {
    int newmax = key + ar->ary_max / 5;
　
    ar->ary_array = (STR * *)saferealloc((char *)ar->ary_array,
                                       (newmax+1) * sizeof(STR *));
    bzero((char *)&amp;ar->ary_array[ar->ary_max+1],
          (newmax - ar->ary_max) * sizeof(STR *));
    ar->ary_max = newmax;
  }
  if (key > ar->ary_fill)
    ar->ary_fill = key;
  retval = (ar->ary_array[key] != Nullstr);
  if (retval)
    str_free(ar->ary_array[key]);
  ar->ary_array[key] = val;
  return retval;
}
</textarea>
</p>
<p>オーソドックス。</p>
<p>配列の要素数以上のkeyにstoreされると、要素の枠を追加で確保して、要素数(ary_fill)、最大インデックス(ary_max)を更新した上で、上書きされる要素をstr_freeし、最後に上書きする。上書きがあった場合は1を返すようです。</p>
<p>要素枠の追加時は、既存の最大要素数の5分の1だけバッファを用意して、連続追加でもパフォーマンスが落ちないようにしてるみたいですね。</p>
<p>さて、ここまではわかりましたが、eval のなかからここまでどうやって呼ばれるんでしょう。あと配列の作成、解放のタイミングも気になります。</p>
<p>それらは奥が深そうなので、いったん気になるまま置いておいて、明日は pop / shift  の違いと foreach, デフォルト変数周り、あとざっと reverse, sort も実装を見ようと思います。</p>
]]>
</content:encoded>
</item><item>
<title>Perl の == と eq の実装の違い</title>
<link>http://coji.s9.xrea.com/article.php?id=67</link>
<pubDate>Sat, 10 May 2008 11:54:27 +0900</pubDate>
<description>「Perl学習はじめました」でハマった以下の文字列比較に eq ではなく == を使ったコードがなぜ期待したとおりに動かなかったのか、調べてみました。


use strict;
while(1) {
    my $input = ;
 ...</description>
<content:encoded>
<![CDATA[<p>「<a href="http://coji.s9.xrea.com/article.php?id=66">Perl学習はじめました</a>」でハマった以下の文字列比較に eq ではなく == を使ったコードがなぜ期待したとおりに動かなかったのか、調べてみました。</p>
<p>
<textarea name="code" class="php:nogutter:nocontrols">
use strict;
while(1) {
    my $input = <STDIN>;
    chomp $input;
    last if $input == 'quit';
    print $input;
}
</textarea>
</p>
<p>まず == は数値を期待していて、ここに文字列をわたすと Perl の文字列から数値への変換ルールで入力文字列が(だいたい) 0 になり、同様に 'quit' も数値変換されて 0 になるため 0 == 0 として必ず while を抜けるのは理解できました。</p>
<p>で、いい機会なので実装がどうなってるのかを見ようと思って Perl 5.8.8 のソースコードを見てみました。でも、O_SEQ というのが eq の opname だということ、 O_EQ というのが == の opname だということまではわかったのですが、そのバイトコードを処理する実装を見つけられませんでした。</p>
<p>そこで Perl 1.0 のソースコードなら単純だろうと当たりをつけて、このサイトから Perl 1.0 のソースコードをダウンロードして、いろいろ調べてみます。</p>
<ul>
<li>
<a href="http://dev.perl.org/perl1/dist/">perl1 Downloads</a>
</li>
</ul>
<p>でいろいろ追っかけると以下のような流れでバイトコードを実行してるみたいです。</p>
<ul>
<li>main (perly.c)</li>
<li>cmd_execute (cmd.c)</li>
<li>eval (eval.c)</li>
</ul>
<p>というわけで見つけた実装</p>
<p>まず文字列比較の eq</p>
<p>arg.c:1782
<textarea name="code" class="c:nogutter:nocontrols">
  case O_SEQ:
        tmps = str_get(sarg[1]);
        value = (double) strEQ(tmps,str_get(sarg[2]));
</textarea>
handy.h:20
<textarea name="code" class="c:nogutter:nocontrols">
 #define strEQ(s1,s2) (!strcmp(s1,s2))
</textarea>
</p>
<p>というわけで単純に strcmp してました。</p>
<p>次、数値比較の ==</p>
<p>arg.c:1508
<textarea name="code" class="c:nogutter:nocontrols">
  case O_EQ:
        value = str_gnum(sarg[1]);
        value = (double)(value == str_gnum(sarg[2]));
</textarea>
</p>
<p>perl.h:56
<textarea name="code" class="c:nogutter:nocontrols">
 #define str_gnum(str) (Str = (str), (Str->str_nok ? Str->str_nval : str_2num(Str)))
</textarea>
</p>
<p>str.c:83
<textarea name="code" class="c:nogutter:nocontrols">
double
str_2num(str)
register STR *str;
{
    if (!str)
        return 0.0;
    if (str->str_len &amp;&amp; str->str_pok)
        str->str_nval = atof(str->str_ptr);
    else
        str->str_nval = 0.0;
    str->str_nok = 1;
 #ifdef DEBUGGING
    if (debug &amp; 32)
        fprintf(stderr,"0x%lx num(%g)\n",str,str->str_nval);
 #endif
    return str->str_nval;
}
</textarea>
</p>
<p>ふむ。文字列を atof で double に変換しちゃうということで。なるほどねー</p>
<p>Perl 5.8 での実装が見つけられなかったのがちょっと悔しいけど、これからまた「はじめてのPerl」の続きをします。</p>
<p>ちなみに STR 型は str.h で定義されてました。でも最近のは utf-8 フラグとかいろいろ拡張されてるらしいので、あまり意味ないかもしれないなあ。</p>
<p>
<textarea name="code" class="c:nogutter:nocontrols">
struct string {
    char *  str_ptr;    /* pointer to malloced string * /
    double  str_nval;   /* numeric value, if any * /
    int     str_len;    /* allocated size * /
    int     str_cur;    /* length of str_ptr as a C string * /
    union {
    STR * str_next;     /* while free, link to next free str * /
    STAB * str_magic;   /* while in use, ptr to magic stab, if any * /
    } str_link;
    char    str_pok;    /* state of str_ptr * /
    char    str_nok;    /* state of str_nval * /
};
</textarea>
</p>
]]>
</content:encoded>
</item>
</channel>
</rss>