2011-11-11 3 views
3

일부 C 구조체에 대해 하스켈 FFI 바인딩을 작성하려고합니다. 예는 다음과 같습니다 :C 재귀 구조체 및 공용 구조체에 대한 하스켈 FFI

typedef struct s0{int a; 
        union{unsigned char b; 
         struct s0*c; 
         struct{unsigned char d[1]; 
         }; };}*S; 

내 질문 또는 HSC (에 대한 hsc2hs) 형식 (c2hs에 대한) CHS에서 그것을 위해 바인딩을 작성하는 방법입니까? 나는 c2hs에 대한 자습서를 들었으나 충분한 정보를 얻지 못했거나 그런 식으로 이해하지 못했다. 위의 정의를 위해 chs 파일을 작성하는 데 도움이되었을 것이다.

내가 HSFFIG 도구를 사용하여 하스켈 바인딩을 생성 할 수 있지만 바인딩을 정의하는 사용자 정의 액세스 방법 HSFFIG.FieldAccess.FieldAccess을 사용합니다. 써드 파티 라이브러리가 아닌 코어 haskell FFI 라이브러리를 사용하는 바인딩을 작성하는 것을 선호합니다.

따라서, HSC 형식으로 위의 재귀 구조체에 대한 바인딩을 작성하거나 단지 핵심 FFI 라이브러리를 사용 CHS 포맷하는 방법에 대한이 질문에.

실제 정의는 더 복잡하다,하지만 난 c2hs 또는 hsc2hs 도구 구조체 정의 위에 작성하는 방법을 파악하면, 나는 거기에서 갈 수 있습니다. 저장 가능한 인스턴스는 내부 공용체와 구조체에 대해 정의해야하지만 위와 같은 재귀 적 정의를위한 래퍼를 작성하는 방법을 알지 못합니다. 특히 struct 내부에서 struct/union 내부에 어떻게 접근합니까? HSFFIG 정의를 살펴 보았지만, 액세스 메소드는 HSFFIG 정의 된 액세스 메소드입니다. 그래서 핵심 FFI 라이브러리 만 사용하는 chs 정의로 변환하는 방법을 알아낼 수 없었습니다.

I에 유래에서 본 질문은 간단 정의에 대한 것으로 보인다. 다른 곳에서 비슷한 대답이 있다면, 나는 포인터를 고맙게 생각합니다.

+0

실제로 데이터를 가지고 무엇인가를해야합니까? void 데이터 형식을 사용할 수 있습니다. – alternative

+0

예, 데이터를 처리해야합니다. 위의 구조체에 대한 포인터는 인수 중 하나 인 다른 FFI C 함수에 전달되고 해당 함수는 구조체 값을 반환합니다. – Sal

+0

은 데이터에 신경 쓰지 않는 것처럼 들립니다. – alternative

답변

1

당신이 중 하나 c2hs 또는 hsc2hs 최대하지 마법 당량 데이터 구조 할 수 있습니다. 그러나 으로 약간의 작업만으로 c2hs에서 마샬링을 수행 할 수 있습니다.

data MyType = Next MyType | MyChar Char | MyString String | MyEnd 

그런 다음합니다 MyType (예. S0)에 대한 포인터를 선언 hsc2hs 'newtype은 포인터 기능을 사용합니다. 그런 다음, hsc2hs의 접근자를 사용하여 명시 적 함수를 작성하여 재귀 적으로 구조를 걷고 Haskell 구조를 구축하십시오. 각 단계에서 널 포인터를 눌렀는지 테스트하고, 그렇다면 MyEnd를 리턴합니다 (또는 데이터 인코딩에 따라, 공용체의 유형을 나타내는 int가 음수인지 여부를 확인하십시오). 그렇지 않으면 구문 분석을 계속하십시오 당신이 가지고있는 것은 무엇이든, 그리고 그것이 포인터라면, 재귀 적으로 진행하십시오.

당신은뿐만 아니라 hsc2hs과 거의 같은 일을 할 수 있습니다.

관련 문제