ソフトウェア概論(MacOSX Carbon 用ライブラリ)

ヘッダーファイルが無いので直ぐには使えませんが、以下のものを使ってます。
#include <Carbon/Carbon.h> /* Text Encoding Converter */
#include <sys/stat.h> /* chmod() */

#define FOPEN fopen
#define FOPEN_READ "rb"
#define FOPEN_APPEND "a+b"
int ConvertSJIStoUTF8( ConstTextPtr strSJIS, TextPtr strUTF8, int oLen )
{
  TECObjectRef ec;
  ByteCount ail, aol = 0;
  TextEncoding hfsplusEncoding = CreateTextEncoding(kTextEncodingUnicodeV2_0, kUnicodeCanonicalDecompVariant, kUnicodeUTF8Format/*kUnicode16BitFormat*/);
  TextEncoding hfsEncoding = CreateTextEncoding(kTextEncodingMacJapanese, kMacJapaneseStandardVariant, kTextEncodingDefaultFormat);
  OSStatus status = TECCreateConverter(&ec, hfsEncoding, hfsplusEncoding);
  status = TECConvertText(ec, (ConstTextPtr)strSJIS, strlen(strSJIS), &ail, (TextPtr)strUTF8, oLen, &aol);
  strUTF8[aol] = 0;
  status = TECDisposeConverter(ec);
  return aol;
}

int ConvertUTF8toSJIS( ConstTextPtr strUTF8, TextPtr strSJIS, int oLen )
{
  TECObjectRef ec;
  ByteCount ail, aol = 0;
  TextEncoding hfsplusEncoding = CreateTextEncoding(kTextEncodingUnicodeV2_0, kUnicodeCanonicalDecompVariant, kUnicodeUTF8Format/*kUnicode16BitFormat*/);
  TextEncoding hfsEncoding = CreateTextEncoding(kTextEncodingMacJapanese, kMacJapaneseStandardVariant, kTextEncodingDefaultFormat);
  OSStatus status = TECCreateConverter(&ec, hfsplusEncoding, hfsEncoding);
  status = TECConvertText(ec, (ConstTextPtr)strUTF8, strlen(strUTF8), &ail, (TextPtr)strSJIS, oLen, &aol);
  strSJIS[aol] = 0;
  status = TECDisposeConverter(ec);
  return aol;
}

char *yGetFileNameToOpen(char *fn)
{
static UInt8 data[MAX_PATH];
  ConvertSJIStoUTF8( (ConstTextPtr)fn, (TextPtr)&data[0], sizeof(data)/sizeof(UInt8) );
  return data;
}

yocread

void yocread(char *fn, ULONG sp, char *str, int len)
{
  FILE *fh;
  fh = FOPEN(yGetFileNameToOpen(fn),FOPEN_READ);
  if( fh != NULL ) {
   if( sp > 0 )
    fseek(fh,sp,SEEK_SET);
   fread(str,sizeof(char),len,fh);
   fclose(fh);
  }
}

yfsize

ULONG yfsize( LPSTR filename )
{
  ULONG ret = 0;
  FILE *fh;
  fh = FOPEN(yGetFileNameToOpen(filename),FOPEN_READ);
  if( fh != NULL ) {
   ret = fseek(fh,0,SEEK_END);
   ret = ftell(fh);
   fclose(fh);
  }
  return ret;
}

yocwrite

void yocwrite(char *fn, ULONG sp, char *str, int len)
{
  FILE *fh;
  int ret;

  if( len <= 0 )
   len = strlen(str);
  fh = FOPEN(yGetFileNameToOpen(fn),FOPEN_APPEND); /* append binary */
  if( fh != NULL ) {
   fseek(fh,sp,SEEK_SET);
   fwrite(str,sizeof(char),len,fh);
   fclose(fh);
  }
}

YAllocMem

LPSTR YAllocMem( ULONG size )
{
  return (LPSTR)malloc(size);
}

YFreeMem

void YFreeMem( LPSTR ptr )
{
  if( ptr ) {
   free(ptr);
  }
}

Copyright(C) 2008 Y.Yonemura All rights reserved.