사용자 도구

사이트 도구


kb:swig

SWIG

http://www.swig.org

C/C++로 쓰여진 코드를 Perl, Python과 같은 하이레벨 언어에서 사용할 수 있도록 래퍼 코드를 생성해주는 유틸리티.

설치

1. 배포본을 다운로드받아 적당한 곳에다 풀고 디렉토리 이름을 설정한다. (설치 프로그램이 따로 없다.) 이 디렉토리를 $(SWIG)라고 하자.

2. $(SWIG) 디렉토리를 패스에다 추가한다. 물론 매번 실행 파일의 패스를 지정할 것이라면 상관없다.

3. PYTHON_INCLUDE 및 PYTHON_LIB 환경 변수를 설정한다.

PYTHON_INCLUDE = C:\python23\include
PYTHON_LIB = C:\python23\libs\python23.lib

샘플

레포트로 냈던 것…

Template2doc 라이브러리를 파이썬용으로 포팅하기.

다음의 테스트 코드를 만족하도록 template2doc.i 파일을 수정하고 실행하시오. 새로운 typemap을 정의하여야 합니다.

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')) 

template2doc.i

%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" 

링크

kb/swig.txt · 마지막으로 수정됨: 2014/11/08 13:52 (바깥 편집)