ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのC言語でINI解析やら、yaml解析やら、XMLやら、

  • mixiチェック
  • このエントリーをはてなブックマークに追加
現在の環境は
Linux(centos4)で、
gcc バージョン 3.4.4で、
本当はc++で開発したいのですが、
いじってるソースが、opensshなので、c言語でかかれてしまってるので、
c言語で、、。

u513
g513
WHOLE_ALLOW_PATH
/home/aiueo.txt
CHROOT_PATH
/home/kaki
/www/domain/htdocs
/www/domain/CLASS
ONLYBASE
\.(view|view.mb)$
BAN
.(svn)$

sftpサーバーにファイル別の表示非表示機能をつけるのに
こんな感じのINIファイル等で定義化を行いたいのですが。

c言語でyamlとかそういうファイルを配列に読み込める関数等ないでしょうか?

もう、あれこれ考えるよりfopenで
char **WHOLE_ALLOW_PATH;
char **CHROOT_PATH;
char **ONLYBASE
とかに各各
自分でロジック作って
文字列一次元配列に読み込んだ方が早いのですが、

そういうことが可能な関数があればそれを使う方がはやいのと

ライブラリの使い回しなどを考えると、
配列定義ファイルを読み込むという、機能の関数を作成すべきではないかということも考えにあります。

自分で例えば文字列の2次元配列を定義した場合は
char ***aiueoとなり
int **wwとかで、配列サイズも格納しなくてはならない気がします。

phpだと、配列が強力なので
array(
513=>
array("WHOLE_ALLOW_PATH"=>array("/home/aiueo.txt"),
CHROOT_PATH=>array("/home/kaki")
);
);
なんて、xmlみたいな多次元配列を定義できるのですが・・・

コメント(24)

/etc/ssh/sshd_configは
こんなん感じになってたりしますが、

# Logging
#obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#SyslogFacility LOCAL3
#LogLevel INFO
LogLevel DEBUG3

Subsystem sftp internal-sftp -l DEBUG3 -f LOCAL3

#Match User kaki
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand internal-sftp

Match User hoge
ChrootDirectory /home/hoge
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

どうやって解析してるんでしょうか・・。
ソース多すぎて、解析してるとこが分かりません。
http://sourceforge.jp/magazine/03/10/07/1427238
libxml2なるものがあるようですが、、、
これを、解析結果として、変数に保存する場合は、

char ***aiueoとなり
int **wwとかで、配列サイズも格納しなくてはならない気がします。

となるのでしょうか?
なんども走るしょりになるので、
なるべく高速に動作させるために
最初に解析させて、
いちいちxml解析させるわけには、いかず。。

xml形式だと定義ファイルを書くのが大変そうですが、、、
Cの場合、「関数」ではなく「ライブラリ」を調査すべきですね。

xmlだとlibxmlてのを使ったことがありますが、重いので結局自前でパーサを書きました。
自分の設定ファイル仕様に必要な処理だけ書けばいいので、そんなに困ることはないと思いますが。
>結局自前でパーサを書きました
独自仕様の設定ファイルと
その解析プログラムってことですか?

XMLパーサの
自作したってことではないですよね。
(XMLパーサなんて自分で作れるような代物じゃないですよね・・・
?('◇'*)!?
>結局自前でパーサを書きました
独自仕様の設定ファイルと
その解析プログラムってことですか?

XMLパーサの
自作したってことではないですよね。
(XMLパーサなんて自分で作れるような代物じゃないですよね・・・
?('◇'*)!?
>オミさん

何やりたいのかちゃんと書いてないので話が散乱してますね。

1.sshd_config に自前のエントリを追加したい
2..iniとかxmlとかの読み込み方を知りたい

のどっちなんでしょ?

ところで、
>XMLパーサなんて自分で作れるような代物じゃないですよね・・
そんなことはないとおもいますけど・・・
なんでそう思うんでしょ?
>ぶちをさん
設定を外部ファイル化して、
読み込むようにしたいです。
xmlパーサや、yamlとかは外部ファイル化したかったのの一つの方法として。。

1.sshd_config に自前のエントリを追加したい
ではないです。
2..iniとかxmlとかの読み込み方を知りたい
これはちょっとだけあってます。

最初に下記のような設定ファイルを読み込んで、
以降、変数から参照したいのですが、
char ****WHOLE
int ***whole_num
みたいなのによみこんだ方が汎用性は高そうですが、
char **CHROOT_PATH
int **chroot_num
のほうが、簡単な気も、、。

*mixiだと半角スペースが効かないようなので、
 全角スペースになおしました。
=====================
u513 ユーザーに対してのファイル閲覧設定
 
g513 グループに対してのファイル閲覧設定
 WHOLE_ALLOW_PATH
  /home/aiueo.txt
 CHROOT_PATH
  /home/kaki
  /www/domain/htdocs
  /www/domain/CLASS
 ONLYBASE
  \.(view|view.mb)$
 BAN
  .(svn)$
=====================
fgets()ででも読み込んで、str***()やatoi()なんかで値を取って、必要に応じてmalloc/reallocでバッファを作る。
基本はそれだけです。肝心なのは文字列比較でしょう。

自分のファイルを読み込むだけなら、大げさに考えることはないです(異常系を厳密にする必要はないので)。
速度と汎用性は基本的にトレードオフなので、どちらが欲しいのか、最初に決めましょう。
完璧なパーサを書くのはかなり面倒ですし、時間もかかります。
素直にできあいのものを使うが吉です。
>6ぶちをさん
返信忘れてました。。
>XMLパーサなんて自分で作れるような代物じゃないですよね・・
>そんなことはないとおもいますけど・・・
>なんでそう思うんでしょ?
無限構造なので、再起とかつかわなければいけなさそうだし、
まったく想像つかず、
一筋縄にいきそうにないので。
>9 団子さん
いいの紹介してもらってどうもです。
ロジック短くて、自分でも理解できそうです。

自分ではこんなの見つけたんですが、関係ないファイルも入ってるみたいで理解できませんでした。
http://www.sage-p.com/ml2/gokui07.htm

※INIファイルだととかになっちゃいますが、
g513.ini
[WHOLE_ALLOW_PATH]
ac1=/home/aiueo.txt
[CHROOT_PATH]
ac1=/home/kaki
ac2=/www/domain/htdocs
ac3=/www/domain/CLASS
>10 mioさん

>str***()でもって、
やっぱ、int**みたいに配列数も
どっかに格納してないと、処理できないですよねf^^;?
配列数はstrlen()みたいなので、動的に取得できないですよね?


>肝心なのは文字列比較でしょう。
パースするときに\のエスケープとか
char c;とか定義して
if (c==0){とかの比較ですか?


>速度と汎用性は基本的にトレードオフなので
最初にまとめて読み込むようにできれば、
速度的には汎用的なものをつかっても、
問題ないです。

>素直にできあいのものを使うが吉です。
確かに。。
ちょうどそう考えてました。。。
学習コストもかかるので。
ただ、前からc言語でこういう、連想配列を外部ファイルでまとめて定義できないかなとは考えていたところがあったので。。
パーサそのものは,ssscanfとかstrtokとかを使って書いても良いし,ちょっとおおげさだけどflex/bisonで書いても良いけど,もはやルーチンワークです.

問題はパーサの出力をどういうデータ構造に格納するかはってことの方かな.
>saitohさん
fgetsして、一文字ずつループしていこうかと。

>問題はパーサの出力をどういうデータ構造に格納するかはってことの方かな
c言語の場合、多次元配列を扱うのは難しそうなので、
char **CHROOT_PATH ←文字配列
int chroot_num ←配列数
に格納していくのが、最善の方法かなと思われます・・
---------------------------------
libyamlを見つけたんですが、
emitter やら 使い方がよくわかりませんでした。。。
http://pyyaml.org/wiki/LibYAML
---------------------------------
saitoh さん

一応・・・わかります。。
PHPのC言語ソースみたときも
変数がstructや、unionで定義されてました

自分で抽象化変数作ろうとしたことあったので。
unionは定義の仕方はstructに似てるけど、
メモリを効率的に使う仕組みで・・・。
char **とかだと,格納することだけには支障がないけど,あとで参照するときに面倒でしょ.
プログラム中でどう参照するつもりか知らないけど,普通はこのどちらかでは?

・structXXXを定義してそれに入れる
・設定ファイルを読み取ってわかった設定項目をどこかに記憶.文字列データとしてのファイル内容は保管せずに捨てる
>あとで参照するときに面倒でしょ
確かに。。

値がN個で特定できない場合は

 CHROOT_PATH
  /home/kaki
  /www/domain/htdocs
  /www/domain/CLASS

配列を使うしか。。

struct settei_config{
  char **
}
とかでも良いと思いますが。
20>
パス名と自己参照ポインタをメンバ持つ構造体を作って
ファイルから各行読みながら線形リストにつなげていけば?
>21
そんな方法があるんですか!!(゜◇゜)

C言語だと線形リストとか使ったりするんですね。
データベースみたいに親ID持たせる感じで、雰囲気はわかるのですが、

配列数とか格納しなくても、ポインタが0(NULL)なら終了ってやれば、
よさそうですね。

char配列どっちが、コードが見やすいかな・・・。
「Cだと線形リストを使う」という理解は改めた方がよいかと。
どう処理するかと、どの言語で書くかは、関係ないでしょ。
データ構造と言語とは(いちおう)無関係です。
オブジェクト指向言語などでは、線形リストみたいな実装をカプセル化して見えなくしたクラスライブラリを使ったりするかもしれないけど、見えないだけで線形リストが使われていないわけじゃない。

今回のような key-valueペア(同一キーに対して複数valueあり、orderd)だったら、keyが事前に固定されているなら何らかの配列(unionの配列とか)、どのようなkeyあり得るかわからない場合は、ハッシュとかツリーとかリストですかねぇ。

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング