Git Product home page Git Product logo

Comments (2)

bab2min avatar bab2min commented on September 27, 2024

안녕하세요, @mrchypark
해당 콜백 함수에 대해 문서화가 부족했던 것 같습니다.
테스트 코드에서 사용례를 찾아보실 수 있는데요,

Kiwi/test/test_c.cpp

Lines 41 to 48 in d3fa22f

int mt_reader(int idx, char* buf, void* user)
{
auto& data = *(std::vector<std::string>*)user;
if (idx >= data.size()) return 0;
if (buf == nullptr) return data[idx].size() + 1;
std::memcpy(buf, data[idx].c_str(), data[idx].size() + 1);
return 0;
}

한 라인에 대해 콜백함수는 총 두번 호출됩니다. 첫번째 호출에서는 콜백함수는 읽어들인 문자열의 총 길이를 반환하면 되며, 두번째 호출에서는 읽어들인 문자열을 주어진 버퍼로 복사하면 됩니다. 만약 첫번째 호출에서 0을 반환한 경우 모든 라인을 읽어들인 것으로 간주하여 반복을 중단합니다. (필요에 따라서 처음으로 돌아가 0번 라인부터 다시 읽어들일 수도 있습니다.)

  • int idx는 0부터 시작하는 인덱스 번호로 현재 읽어들이는 라인이 몇번째 라인인지 가리키는 값입니다.
  • char* buf는 실제 결과값을 써 넣어야할 버퍼의 포인터인데요, 처음에는 nullptr로 넘어옵니다. 이 경우 현재 써넣을 문자열의 길이(바이트 단위)를 리턴해주면 됩니다. 다음에는 이 값으로 nullptr가 아닌 유효한 포인터가 넘어오는데 이 경우는 실제로 읽어들인 문자열을 해당 포인터로 복사해 넣으면 됩니다.
  • void* user는 콜백함수와 함께 넘겨주었던 사용자 전용 포인터입니다. 필요에 맞게 쓰시면 되겠습니다.
  • 반환값: char* buf에서 설명했듯, buf == nullptr인 경우 읽어들인 문자열의 길이를 반환해야 합니다. 만약 0을 반환할 경우 문자열 읽어들이기가 끝났다고 처리됩니다. buf != nullptr인 경우 0을 반환하면 됩니다.

콜백함수와 kiwi와의 상호작용을 차례대로 정리해보면 다음과 같습니다.

kiwi: reader(0, nullptr, user) 호출
reader: 첫번째 라인을 읽어들임. 총 길이가 100바이트였음. 100을 반환
kiwi: 내부적으로 buffer에 100바이트를 할당 후 reader(0, buffer, user) 호출
reader: 읽어들인 문자열을 buffer에 복사해넣음
kiwi: reader(1, nullptr, user) 호출
reader: 두번째 라인을 읽어들임. 총 길이가 200바이트였음. 200을 반환
kiwi: buffer에 200바이트를 할당 후 reader(1, buffer, user) 호출
reader: 읽어들인 문자열을 buffer에 복사해넣음
kiwi: reader(2, nullptr, user) 호출
reader: 세번째 라인을 읽어들이려 했으나 EOF에 도달하였음. 0을 반환
kiwi: 모든 문자열을 읽어들인 것을 확인하고 처리를 진행

주의할 사항은 extract_word 계열 함수에서는 전체 텍스트를 읽어들이는 과정이 여러번 진행될 수 있다는 것입니다. 즉, reader(0, ...)부터 reader(N, ...)까지 호출된 이후, 다시 reader(0, ...)이 호출될 수 있습니다. 이 경우 reader(0, ...)이 호출되었을때 첫번째 라인을 동일하게 반환해야 합니다. 만약 파일에서부터 결과를 읽어들이는 경우라면 reader(N, ...)까지 읽은 후 EOF에 도달할 것이므로 reader(0, ...)이 다시 호출되었을때 파일을 rewind하여 처음부터 다시 읽어내도록 처리해야합니다.

from kiwi.

mrchypark avatar mrchypark commented on September 27, 2024

감사합니다. 살펴보고 혹 이해 안되는게 있으면 질문 드리겠습니다.
테스트 코드 보는건 또 놓치고 있었네요.

다시 한번 감사드립니다. :)

from kiwi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.