Программа командной строки C для Swift

У меня есть исходный код командной строки C game, который ждет пользователя stdin и выводит stdout. Я хочу дать ввод из текстового поля через main этого кода C и взять вывод в поле текстовой области, например.

int mainer(int argc, char **argv) {
    int i;
    int hitme;
    char ch;
    prelim();

    if (argc > 1) { // look for -f option
        if (strcmp(argv[1], "-f")== 0) {
            coordfixed = 1;
            argc--;
            argv++;
        }
    }


    if (argc > 1) {
        fromcommandline = 1;
        line[0] = '\0';
        while (--argc > 0) {
            strcat(line, *(++argv));
            strcat(line, " ");
        }
    }
    else fromcommandline = 0;
 // some other code

}

Из примера здесь, я должен сделать следующее:

let args = [" ", "regular", "short", ""]

var cargs = args.map { strdup($0) }
let result = mainer(Int32(args.count), &cargs)
for ptr in cargs { free(ptr) }

Как я могу вызвать main function и сохранить его в живых и продолжать давать ему аргументы, чтобы заставить его действовать как command line.

Ответы

Ответ 1

Я бы установил ваше приложение с TextArea и TextField и предоставил альтернативы printf и scanf, которые либо добавляют текст в текстовую область, либо отправляют текст из текстового поля (возможно, с помощью "Enter" UIButton). Затем вы можете скомпилировать код C и вызвать его из Swift. Объект C на самом деле C под крышками, поэтому вы должны иметь возможность запускать это с небольшим изменением.

Чтобы получить код для запуска, вам, вероятно, придется сделать этот код запущенным в нем собственным потоком и проскочить через некоторые обручи, чтобы заставить эти вызовы правильно вести себя, но это должно быть выполнимо.

Ответ 2

Я не думаю, что это подходящее место для этого. Основной целью является, по сути, запуск приложения, а затем контроль доступа к делегату приложения и оттуда оттуда. Из документации яблок: "За некоторыми исключениями вы никогда не должны изменять реализацию основной функции, предоставляемой Xcode". https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

Есть другие способы смешивания C с Objective-C. Если вам нужно позвонить в C, лучшим местом, скорее всего, будет просмотр, где эти данные необходимы. Эти ссылки могут помочь: Смешивание функций C в классе Objective-C,

Ответ 3

Не вызывайте эту функцию в своем процессе.

Вместо этого выполните свою командную строку как отдельный процесс, чтобы вы могли подключить stdin/stdout к трубам. Затем вы можете отправить содержимое текстового поля в один канал и прочитать результат от другого.

Посмотрите, например. http://practicalswift.com/2014/06/25/how-to-execute-shell-commands-from-swift/.