Замена функций файла Carbon функциями stdio.h - PullRequest
0 голосов
/ 30 июня 2011

Я пытаюсь преобразовать старый кусок кода, содержащий устаревшие функции Carbon FSWrite, FSRead и т. Д. Один из экспериментов, который мы хотим попробовать, - заменить их их эквивалентами POSIX, функциями, определенными в stdio.h, например, заменяя FSRead () на fread (). Но я не уверен, что делать с первым аргументом, данным для функций Carbon:

SetFPos(gFormatRecord->dataFork, fsFromStart, 0);

gFormatRecord - указатель на FormatRecord. Является ли dataFork простым обычным дескриптором файла Unixy, пригодным для вставки в fread (), fprintf () и тому подобное? (Я не знаю много о файловых "вилках" в любом случае.)

(Это продолжение моего предыдущего вопроса, На Mac, где определены FSRead, FSWrite, SetFPos и ​​др., И мне вообще их использовать? )

1 Ответ

2 голосов
/ 30 июня 2011

Начиная с gFormatRecord->dataFork, похоже, что вы пытаетесь написать плагин для Photoshop.Это не будет работать так хорошо.

Photoshop (и, вероятно, большинство программного обеспечения Mac Adobe) полон много кода углерода, который был разработан, чтобы быть в значительной степени идентичным существующим API-интерфейсам 8.5, в то время кактакже совместимость API / ABI с OS X (я не знаю, была ли / когда поддержка CFM Carbon прекращена).

Согласно документации, вы должны использовать вместо этого FSSetForkPosition (), что, вероятно, заканчиваетсядо того же вызова функции в конце.Вы почти наверняка не можете использовать fseek() / fsetpos() / fseeko(), который ожидает FILE *, в то время как дескриптор файла Carbon выглядит как SInt16 согласно моему заголовку (веб-документы говорят, что это FSIORefNum).[1]

Также обратите внимание, что fopen() и друзья не POSIX;они стандартные C. Функции POSIX, как правило, одинаковы без начального f, за исключением поиска, который равен lseek().[2] POSIX «дескриптор файла» - это дескриптор файла, который представляет собой int.

Теперь, если вам повезет невероятно , FSIORefNum будет просто файломдескриптор, который вы можете передать read() / write() / lseek().Но это в конечном итоге для небольшой выгоды;если Photoshop все еще построен на Carbon, какой смысл?


Сноски!

  1. Не исключено, что специальные случаи fseek () указывают на нулевую страницу, но я не понимаюНе думаю, что они загрязнят libc этим.)
  2. В Linux / x86 вам потребуется #define __FILE_OFFSET_BITS 64 или около того, чтобы получить поддержку больших файлов, что легко забыть.Позор, это не так легко сделать универсально ...
...