사용자 도구

사이트 도구


kb:swig

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:swig [2014/11/08 13:52] (현재)
줄 1: 줄 1:
 +====== SWIG ======
 +http://​www.swig.org
 +
 +C/C++로 쓰여진 코드를 Perl, Python과 같은 하이레벨 언어에서 사용할 수 있도록 래퍼 코드를 생성해주는 유틸리티.
 +
 +
 +====== 설치 ======
 +1. [[http://​sourceforge.net/​project/​showfiles.php?​group_id=1645 | 배포본]]을 다운로드받아 적당한 곳에다 풀고 디렉토리 이름을 설정한다. (설치 프로그램이 따로 없다.) 이 디렉토리를 $(SWIG)라고 하자.
 +
 +2. $(SWIG) 디렉토리를 패스에다 추가한다. 물론 매번 실행 파일의 패스를 지정할 것이라면 상관없다.
 +
 +3. PYTHON_INCLUDE 및 PYTHON_LIB 환경 변수를 설정한다.
 +<​code>​
 +PYTHON_INCLUDE = C:​\python23\include
 +PYTHON_LIB = C:​\python23\libs\python23.lib
 +</​code>​
 +
 +====== 샘플 ======
 +레포트로 냈던 것...
 +
 +[[http://​www.algonet.se/​~thunberg/​template2doc/​ | Template2doc]] 라이브러리를 파이썬용으로 포팅하기.
 +
 +다음의 테스트 코드를 만족하도록 template2doc.i 파일을 수정하고 실행하시오. 새로운 typemap을 정의하여야 합니다. ​
 +<code python>
 +import unittest ​
 +import template2doc as t2d 
 +
 +class ReplaceWordsTestCase(unittest.TestCase): ​
 +   def test_simple_case(self): ​
 +       s = t2d.replaceWords("​My name is $NAME",​ ["​$NAME"​],​ ["Gang Seong Lee"​]) ​
 +       ​self.assertEquals(s,​ "My name is Gang Seong Lee"​) ​
 +
 +   def test_complicated_case(self): ​
 +       s = t2d.replaceWords("​My name is $NAME and phone number is $PHONE.",​ ["​$NAME",​ "​$PHONE"​],​ ["Gang Seong Lee", "​02-940-5284"​]) ​
 +       ​self.assertEquals(s,​ "My name is Gang Seong Lee and phone number is 02-940-5284."​) ​
 +
 +   def test_when_size_does_not_match(self): ​
 +       s = t2d.replaceWords("​My name is $NAME and phone number is $PHONE.",​ ["​$NAME",​ "​$PHONE",​ "​$GARBAGE"​],​ ["Gang Seong Lee", "​02-940-5284"​]) ​
 +       ​self.assertEquals(s,​ "My name is Gang Seong Lee and phone number is 02-940-5284."​) ​
 +
 +   def test_when_size_does_not_match_02(self): ​
 +       s = t2d.replaceWords("​My name is $NAME and phone number is $PHONE.",​ ["​$NAME"​],​ ["Gang Seong Lee", "​02-940-5284"​]) ​
 +       ​self.assertEquals(s,​ "My name is Gang Seong Lee and phone number is $PHONE."​) ​
 +
 +   def test_when_no_keyword(self): ​
 +       s = t2d.replaceWords("​My name is $NAME and phone number is $PHONE.",​ ["​$NAME"​],​ ["Gang Seong Lee"​]) ​
 +       ​self.assertEquals(s,​ "My name is Gang Seong Lee and phone number is $PHONE."​) ​
 +
 +class InsertTableDataTestCase(unittest.TestCase): ​
 +   def test_simple_case(self): ​
 +       ​template = """ ​
 +       ​$DATA ​
 +       ​... ​
 +       $NAME $EMAIL ​
 +       $NAME $EMAIL ​
 +       ​... ​
 +       ​$DATA ​
 +       """ ​
 +       ​out_template = """ ​
 +       ​... ​
 +       Gang Seong Lee gslee@mail.kw.ac.kr ​
 +       ​... ​
 +       """ ​
 +       ​fieldMarker = ["​$NAME",​ "​$EMAIL"​] ​
 +       ​tableData = ( 
 +           ​("​Gang Seong Lee", "​gslee@mail.kw.ac.kr"​), ​
 +       ​) ​
 +       s = t2d.insertTableData(template,​ "​$DATA",​ fieldMarker,​ tableData) ​
 +       ​self.assertEquals(s.split(),​ out_template.split()) ​
 +
 +   def test_more_data(self): ​
 +       ​template = """ ​
 +       ​$DATA ​
 +       ​... ​
 +       $NAME $EMAIL ​
 +       $NAME $EMAIL ​
 +       ​... ​
 +       ​$DATA ​
 +       """ ​
 +       ​out_template = """ ​
 +       ​... ​
 +       Gang Seong Lee gslee@mail.kw.ac.kr ​
 +       Sunny gslee@mail.kw.ac.kr ​
 +       Sora gslee@mail.kw.ac.kr ​
 +       Bada gslee@mail.kw.ac.kr ​
 +       ​... ​
 +       """ ​
 +       ​fieldMarker = ["​$NAME",​ "​$EMAIL"​] ​
 +       ​tableData = ( 
 +           ​("​Gang Seong Lee", "​gslee@mail.kw.ac.kr"​), ​
 +           ​("​Sunny",​ "​gslee@mail.kw.ac.kr"​), ​
 +           ​("​Sora",​ "​gslee@mail.kw.ac.kr"​), ​
 +           ​("​Bada",​ "​gslee@mail.kw.ac.kr"​), ​
 +       ​) ​
 +       s = t2d.insertTableData(template,​ "​$DATA",​ fieldMarker,​ tableData) ​
 +       ​self.assertEquals(s.split(),​ out_template.split()) ​
 +
 +class TestAllTestCase(unittest.TestCase): ​
 +   def test_more_data(self): ​
 +       ​template = """ ​
 +       ​$DATA ​
 +       ​... ​
 +       $NAME $EMAIL ​
 +       $NAME $EMAIL ​
 +       ​... ​
 +       ​$DATA ​
 +
 +       ​$COPYRIGHT ​
 +       """ ​
 +       ​out_template = """ ​
 +       ​... ​
 +       Gang Seong Lee gslee@mail.kw.ac.kr ​
 +       Sunny gslee@mail.kw.ac.kr ​
 +       Sora gslee@mail.kw.ac.kr ​
 +       Bada gslee@mail.kw.ac.kr ​
 +       ​... ​
 +
 +       ​Copyright (C) gslee 
 +       """ ​
 +
 +       ​template2 = t2d.replaceWords(template,​ ["​$COPYRIGHT"​],​ ["​Copyright (C) gslee"​]) ​
 +
 +       ​fieldMarker = ["​$NAME",​ "​$EMAIL"​] ​
 +       ​tableData = ( 
 +           ​("​Gang Seong Lee", "​gslee@mail.kw.ac.kr"​), ​
 +           ​("​Sunny",​ "​gslee@mail.kw.ac.kr"​), ​
 +           ​("​Sora",​ "​gslee@mail.kw.ac.kr"​), ​
 +           ​("​Bada",​ "​gslee@mail.kw.ac.kr"​), ​
 +       ​) ​
 +       s = t2d.insertTableData(template2,​ "​$DATA",​ fieldMarker,​ tableData) ​
 +       ​self.assertEquals(s.split(),​ out_template.split()) ​
 +
 +if __name__ == '​__main__': ​
 +   ​unittest.main(argv=('',​ '​-v'​)) ​
 +</​code> ​
 +
 +**template2doc.i**
 +<​code>​
 +%module template2doc ​
 +
 +%{ 
 +#include "​template2doc.h" ​
 +#include "​smartalloc.h" ​
 +%} 
 +
 +%{ 
 +int i; 
 +int j; 
 +%} 
 +
 +%typemap(in) char ** { 
 +   if (!PySequence_Check($input)) { 
 +       ​PyErr_SetString(PyExc_TypeError,​ "not a sequence"​); ​
 +       ​return NULL; 
 +   ​} ​
 +   $1 = (char **)malloc((PySequence_Size($input)+1) * sizeof(char*)); ​
 +   for (i=0; i < PySequence_Size($input);​ i++) { 
 +       ​PyObject* o = PySequence_GetItem($input,​ i); 
 +       if (!PyString_Check(o)) { 
 +           ​PyErr_SetString(PyExc_TypeError,​ "not a string"​); ​
 +           ​return NULL; 
 +       ​} ​
 +       $1[i] = PyString_AsString(o); ​
 +   ​} ​
 +   $1[i] = NULL; 
 +
 +
 +// Free the list 
 +%typemap(freearg) char ** { 
 +      free($1); ​
 +
 +
 +%typemap(in) char *** { 
 +   if (!PySequence_Check($input)) { 
 +       ​PyErr_SetString(PyExc_TypeError,​ "not a sequence"​); ​
 +       ​return NULL; 
 +   ​} ​
 +   $1 = (char ***)malloc((PySequence_Size($input)+1) * sizeof(char**)); ​
 +   for (i=0; i < PySequence_Size($input);​ i++) 
 +   ​{ ​
 +       ​PyObject* o1 = PySequence_GetItem($input,​ i); 
 +       if (!PySequence_Check(o1)) { 
 +           ​PyErr_SetString(PyExc_TypeError,​ "not a sequence"​); ​
 +           ​return NULL; 
 +       ​} ​
 +
 +       $1[i] = (char **)malloc((PySequence_Size(o1)+1) * sizeof(char*)); ​
 +       for (j=0; j < PySequence_Size(o1);​ j++) 
 +       ​{ ​
 +           ​PyObject* o2 = PySequence_GetItem(o1,​ j); 
 +           if (!PyString_Check(o2)) ​
 +           ​{ ​
 +               ​PyErr_SetString(PyExc_TypeError,​ "not a string"​); ​
 +               ​return NULL; 
 +           ​} ​
 +           ​$1[i][j] = PyString_AsString(o2); ​
 +       ​} ​
 +       ​$1[i][j] = NULL; 
 +   ​} ​
 +   $1[i] = NULL; 
 +
 +
 +// Free the list 
 +%typemap(freearg) char *** { 
 +      free($1); ​
 +
 +
 +%include "​template2doc.h" ​
 +%include "​smartalloc.h" ​
 +</​code>​
 +
 +====== 링크 ======
 +  * [[http://​www.geocities.com/​foetsch/​python/​extending_python.htm | Python Extensions In C++ Using SWIG]]
 +
 +----
 +  * see also [[PythonCppBinding]]
  
kb/swig.txt · 마지막으로 수정됨: 2014/11/08 13:52 (바깥 편집)