CFStringRefをSVに変換

追記: id:tokuhirom先生に添削してもらった。

  • malloc使うべからず -> NewXX()系でアロケート、SafeFree()で解放すべし(そういえばid:hirose31さんも言ってた)
  • newSVpvの第二引数(STRLEN)は明示的に指定すべし -> 0で自動計算は\0 終端前提
SV * getString(CFStringRef var) {
    char *buf;
    SV *sv;
    CFIndex len = CFStringGetLength(val);
    CFIndex max = CFStringGetMaximumSizeForEncoding(len, kCFStringEncodingUTF8);
    buf = Newxz(max + 1);
    CFStringGetCString(val, buf, max + 1, kCFStringEncodingUTF8);
    CFRelease(val);
    sv = newSVpv(buf, max);
    SafeFree(buf);
    return sv;
}