週記くらい

  • Profile

Category Archives: C言語

LuaからC言語の関数を呼び出す

Posted on 2008/08/17 by smeghead

http://d.hatena.ne.jp/smeghead/20080816/sl で、SLを書いたときにLuaにsleep関数が存在していないらしいことに驚きました。

Cと親和性が高いLuaなので、丁度いい練習になると思い、Luaから呼び出せるsleep関数を作ってみました。

lsleepモジュール

lsleepモジュールとして作成しました。ソースは下の一個だけ。とりあえず、Luaでrequireして、requireしたモジュールの関数を呼び出すことのための最小限だけを書いています。細かい話は、たいぶ省略していると思います。

lsleep.c
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <unistd.h>
/* Luaからsleepとして参照する関数 */
static int lsleep(lua_State* L)
{
int second = lua_tonumber(L, 1);
sleep(second);
return 1;
}
/* Luaからusleepとして参照する関数 */
static int lusleep(lua_State* L)
{
int microsecond = lua_tonumber(L, 1);
usleep(microsecond);
return 1;
}
/* lsleepモジュールに登録する関数のマッピング定義 */
static const struct luaL_reg lsleeplib[] = {
{"sleep", lsleep},
{"usleep", lusleep},
{NULL, NULL},
};
/* lsleepモジュール初期化関数 */
int luaopen_lsleep(lua_State* L)
{
luaL_openlib (L, "lsleep", lsleeplib, 0);
return 1;
}

Makefile

lsleep.so: lsleep.c
gcc -O -o lsleep.so -shared lsleep.c -llua
run:
        lua test.lua
clean:
        rm lsleep.so

makeすると、lsleep.soを作成します。

test.lua

lsleep.sleep(1) と lsleep.usleep(1000000) は、共に1秒間待ちます。

require "lsleep"
print('test.lua will sleep.')
lsleep.sleep(1)
print('test.lua will usleep.')
lsleep.usleep(1000000)
print('test.lua will end.')

今回、Cのsleep関数とusleep関数を呼び出しただけですが、逆にLuaとCの接合部が簡単であったのがよくわかりました。手元に、Luaの本は無かったけど、lfsというライブラリのソースとWebで調べた情報から推測しながらでもなんとか書けました。という状態なので、間違っている部分や良くない部分がありましたら、詳しい方の突っ込みお待ちしてます。

Posted in C言語, lua | 2 Comments |

yacafe

Posted on 2008/05/23 by smeghead

yacafe – Yet Another C web Application Framework for Embedded system – は、C言語のための軽量Webアプリケーションフレームワークです。各種Webサーバ上でCGIとして動作し、アプリケーションはプラグインとして動的にロードし、実行します。

ニュース: yacafe 1.00 リリース – – yacafe – SourceForge.JP

CGIとして動作し、ちゃんとテンプレート機能もあった。まだ変数置き換えだけみたいだけど。

なにせ小さいのがいい。

Cで書かれた30kほどのWebフレームワーク – kinneko@転職先募集中の日記

これは、気になる。チェックしてみたい。

Posted in C言語 | Leave a comment |

C + CGILua + Lua-Sqlite3 = ?

Posted on 2008/05/15 by smeghead

Lua で、ちょっとしたシステムを作ってみようとしていますが、まだ妄想段階です。

Luaもsqliteも組み込み系のイメージがありますが、Webアプリでも消費するリソースは少ない方がいい訳*1で、Webアプリをを、CGILua + Lua-Sqlite3で作るのは悪いアイデアではないかもと思ってます。でも、LuaのCとの親和性も活かせた方が嬉しいのかなと思ったりしてるので、CGIのエントリポイントというか入口をCでコントローラを作るのもありかもしれない。

半年くらい作ってるStrabug1(BTS)は、非常にシンプルな路線で、設計を複雑化させないことを重要視してきましたが、次に作ろうとしているのは、通常の業務でも有り得るくらい複雑な仕組みにすることもできるような仕組みを作ってみたいです。


あんまり関係ないけど、やっぱりCGIってシンプルで好きです。なんか、ごてごてしたアプリケーションサーバから逃げようとしているのかもしれない。

追記20080516

LuaSQL というのもあるらしい。LuaSQLの方が沢山のRDBMSに対応してるようなので、複雑化するようなアプリでは向いているかもしれない。

*1:地球にも優しいとか?

Posted in C言語, free, lua | Leave a comment |

C 伸長する文字列

Posted on 2008/03/11 by smeghead

C言語で、ある文字列処理をして、その結果を別のバッファに格納するような場合、バッファ溢れしないように気をつけなければなりません。cgiでは、それ程複雑な処理を行なう必要がないので、appendできて、結果の文字列が取得できれば事足ります。そこで、足りなくなったら伸びる文字列を作成しました。

使い方
#include <stdio.h>
#include "simple_string.h"
int main(int argc, char** argv)
{
String* s = string_new(10);            //この時点で、バッファの長さは10
string_append(s, "1234567890");        //20に拡張される。
string_append(s, "123");
string_append(s, "45678901234567890"); //40に拡張される。
string_append(s, "123");
string_append(s, "456");
string_append(s, "789");
string_append(s, "012");               //50に拡張される。
printf("%s\n", string_rawstr(s));
string_free(s);
return 0;
}

string_new の引数でブロックサイズを指定します。最初に指定したブロックサイズが確保され、string_appendで文字列を連結できます。バッファの長さが足りなくなったら内部でバッファの長さが伸長されます。最後に連結した結果のchar配列をstring_rawstrで取得できます。不要になったら、string_freeで開放します。

かなり機能を限定してるので、実装はシンプルです。

simple_string.h
#ifndef SIMPLE_STRING_H
#define SIMPLE_STRING_H
#include <string.h>
typedef struct _String {
char* raw_chars;
size_t block_size;
size_t buf_size;
size_t current_size;
} String;
String* string_new(size_t);
void string_append(String*, char*);
char* string_rawstr(String*);
void string_free(String*);
#endif
/* vim: set ts=4 sw=4 sts=4 expandtab fenc=utf-8: */
simple_string.c
#include <stdio.h>
#include <stdlib.h>
#include "simple_string.h"
#define STRING_DEFAULT_SIZE 10
static void* xalloc(size_t size)
{
void* p = calloc(1, size);
if (!p) {
fprintf(stderr, "memory error.");
exit(-1);
}
return p;
}
static void xfree(void* p)
{
free(p);
}
String* string_new(size_t block_size)
{
String* str = xalloc(sizeof(String));
if (block_size == 0) {
str->block_size = STRING_DEFAULT_SIZE;
} else {
str->block_size = block_size;
}
str->raw_chars = xalloc(sizeof(char) * str->block_size);
str->buf_size = str->block_size;
strcpy(str->raw_chars, "");
return str;
}
void string_append(String* str, char* addstr)
{
size_t len = strlen(addstr);
int size_needed = str->current_size + len + 1;
if (size_needed > str->buf_size) {
int new_size = str->block_size * (size_needed / str->block_size + 1);
str->raw_chars = realloc(str->raw_chars, sizeof(char) * new_size);
if (!str->raw_chars) {
fprintf(stderr, "memory error.");
exit(-1);
}
str->buf_size = new_size;
}
strcat(str->raw_chars, addstr);
str->current_size += len;
/*     printf("%d (size: %d)\n", str->current_size, str->buf_size); */
}
char* string_rawstr(String* str)
{
return str->raw_chars;
}
void string_free(String* str)
{
if (str->raw_chars)
xfree(str->raw_chars);
xfree(str);
}
size_t string_len(String* str)
{
return str->current_size;
}
/* vim: set ts=4 sw=4 sts=4 expandtab fenc=utf-8: */

追記20080312:simple_string.c の中の処理(string_append)を修正しました。

追記20080319:環境によっては害はないかもしれませんが、reallocする時のサイズ指定が間違ってました。「sizeof(char) * 」を追加

Posted in C言語 | Leave a comment |

alloc系のコーディングルール

Posted on 2008/01/29 by smeghead

Starbug1(BTS)は、Cで書いてます。10月頃から始めて、身内関連では、2つのプロジェクトで実践投入されるところまで来ました。

Cを長期的に書いていくので、個人コーディングルールとかも考えたりもしています。ちょっと前に考えたルールを書いてみます。

allocした領域を指す変数の名前は、接尾辞に _a を付ける

やはり、cで困ることは、mallocなどで確保した領域のfreeし忘れだと思います。Starbug1はcgiであるとは言え、freeし忘れはできる限り無くしたいと思っています。言語がサポートしてくれていないので、変数名の命名規則によって間違いを発見しやすくするようにしました。要するにアプリケーション ハンガリアン記法です。wikipedia

allocしたブロック内でfreeする

これは、良く言われていることだと思います。呼び先でfreeしたりしなかったりすると管理不能になるので、一貫させる。

関数呼出しの先で確保した領域を戻り値で貰うのではなく、確保した領域を引数にして、関数呼出しの先ではデータを設定してもらうだけにする必要があります。

引数が増えて面倒ですが、わかりやすくするためです。

allocとfreeはラップして直には触らない

allocは、xallocでラップして、freeは、xfreeでラップするようにします。

例

下は、イメージです。

for (i = 0; i < ITEM_COUNT; i++) {
ListItem* item_a = xalloc(sizeof(ListItem));
/* 略 */
/* 略 */
if (strlen(item_a->name) > 0) {
/* 略 */
/* 略 */
db_register_list_item(item_a);
}
xfree(item_a);
/* 略 */
/* 略 */
}
  • 対応してなければfreeし忘れ。xallocとxfreeを検索すれば(正規表現なら x(alloc|free) とかで)、対応のずれがわかりやすい。
  • 変数名が ‘_a’ で終わってる変数を使ったら後始末(xfree)が必要というのがわかる。(だから、breakとかする時にも気を付けないといけないというのもわかりやすい)

これが徹底されれば、危険なコードは危険な見た目に見えるようになるのではないかと思います。Starbug1はこんなルールで進めてみます。

例によってつっこみ歓迎です。あと、もっと良いコーディングルールを知ってたら教えてください。

Posted in C言語, starbug1 | Leave a comment |
Next Page »

Pages

  • Profile

Archives

  • March 2018
  • May 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • April 2014
  • November 2013
  • October 2013
  • July 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • February 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • December 2007
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • July 2006

Categories

  • android (35)
  • apache (1)
  • bison (1)
  • BTS (18)
  • c# (23)
  • cgi (1)
  • chrome (9)
  • chromeextention (18)
  • clclcl (9)
  • clojure (13)
  • cloudbug1 (2)
  • css (4)
  • cygwin (7)
  • C言語 (21)
  • dart (1)
  • dotnet (11)
    • vb.net (2)
  • e-hash.jp (1)
  • eclipse (2)
  • emacs (10)
  • excel (1)
  • flex (1)
  • framework (11)
  • free (92)
  • gae (4)
  • gcc (4)
  • gimmehash.in (1)
  • glipper (3)
  • golang (7)
  • howm (1)
  • html (3)
  • ikushipe (1)
  • java (47)
  • JavaScript (28)
  • linux (16)
  • lisp (92)
  • lua (34)
  • luatinycgi (2)
  • mba (1)
  • Meadow (4)
  • memo (1)
  • music (5)
  • mysql (1)
  • neta (5)
  • O/Rマッピングツール (4)
  • obj-c (6)
  • OOP (6)
  • oracle (1)
  • perl (48)
  • php (38)
    • CakePHP2 (2)
  • PostgreSQL (8)
  • PowerShell (1)
  • putty (1)
  • python (14)
  • redmine (2)
  • ruby (7)
  • s3 (1)
  • sakura (5)
  • screen (1)
  • Selenium (1)
  • SF (1)
  • SKK (4)
  • slime (6)
  • sql (8)
  • sqlite3 (4)
  • starbug1 (179)
  • tthttpd (3)
  • twitter (7)
  • ubuntu (14)
  • Uncategorized (4)
  • unix (14)
  • unkode-mania (5)
  • vba (3)
  • vim (24)
  • w3m (1)
  • Windows (16)
  • wordpress (1)
  • zsh (6)
  • 愚痴 (1)

WordPress

  • Log in
  • WordPress

Subscribe

  • Entries (RSS)
  • Comments (RSS)

Pages

  • Profile

Archives

  • March 2018
  • May 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • April 2014
  • November 2013
  • October 2013
  • July 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • February 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • December 2007
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • July 2006

Categories

  • android (35)
  • apache (1)
  • bison (1)
  • BTS (18)
  • c# (23)
  • cgi (1)
  • chrome (9)
  • chromeextention (18)
  • clclcl (9)
  • clojure (13)
  • cloudbug1 (2)
  • css (4)
  • cygwin (7)
  • C言語 (21)
  • dart (1)
  • dotnet (11)
    • vb.net (2)
  • e-hash.jp (1)
  • eclipse (2)
  • emacs (10)
  • excel (1)
  • flex (1)
  • framework (11)
  • free (92)
  • gae (4)
  • gcc (4)
  • gimmehash.in (1)
  • glipper (3)
  • golang (7)
  • howm (1)
  • html (3)
  • ikushipe (1)
  • java (47)
  • JavaScript (28)
  • linux (16)
  • lisp (92)
  • lua (34)
  • luatinycgi (2)
  • mba (1)
  • Meadow (4)
  • memo (1)
  • music (5)
  • mysql (1)
  • neta (5)
  • O/Rマッピングツール (4)
  • obj-c (6)
  • OOP (6)
  • oracle (1)
  • perl (48)
  • php (38)
    • CakePHP2 (2)
  • PostgreSQL (8)
  • PowerShell (1)
  • putty (1)
  • python (14)
  • redmine (2)
  • ruby (7)
  • s3 (1)
  • sakura (5)
  • screen (1)
  • Selenium (1)
  • SF (1)
  • SKK (4)
  • slime (6)
  • sql (8)
  • sqlite3 (4)
  • starbug1 (179)
  • tthttpd (3)
  • twitter (7)
  • ubuntu (14)
  • Uncategorized (4)
  • unix (14)
  • unkode-mania (5)
  • vba (3)
  • vim (24)
  • w3m (1)
  • Windows (16)
  • wordpress (1)
  • zsh (6)
  • 愚痴 (1)

WordPress

  • Log in
  • WordPress

CyberChimps WordPress Themes

© 週記くらい@やーづ

With Google+ plugin by Geoff Janes