Перевод из Shell в Си: проблема с условием

Тема в разделе "WASM.HEAP", создана пользователем device, 18 дек 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Решаю задачку о переводе скрипта Shell (UNIX4) в прогу на си.
    Все вроде нормально, пока не увидел такую конструкцию:

    Код (Text):
    1. if test условие then что-то сделать
    Как это реализовать на си, чтоб было по короче?
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Что-то я не вкурил вопроса...

     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    nester7

    там

    if test

    То есть идет обращение к test. Одной строкой можно проверить наличие чего-то в системе, проверить файл на запускаемость или даже проверить заголовок файла (Определить формат).

    Test - это почти ключевая операция. Есть ли в си ее аналог? А если нет, то как выполнить тот или иной стандартный системный тест наиболее коротким способом?
     
  4. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Собсно, тогда никак :)
    Можно написать функцию, аналог test и реализовать
    в ней условия, которые проверяются в твоем скрипте.
    (Исходники test в помощь? :)

    Кстати, а что такое "стандартный системный тест"?

    В общем, я понял что нужно - я пас.
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Код (Text):
    1. ...
    2. struct utsname uts;
    3.  
    4. uname (&uts);
    5.  
    6. printf ("%s","checking for your environment is SANE\n");
    7.  
    8. printf ("checking for hostname.....%s\n",uts.nodename); // имя хоста
    9. printf ("checking for CPU type....%s\n", uts.machine); // тип процессора
    10. printf ("checking for terminal you are using....%s\n", getenv("TERM")); //Какой терминал используется
    11.  
    12. // checking for... бла бла бла
    13.  
    14. ...
     
  6. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Ну, назвать это стандартным системным тестом у меня язык не повернется :)
    Это просто аналог GetSystemInfo() из мира Windows.
    В unix общую информацию выдает uname, в Windows - systeminfo.


    Её для того и написали, чтобы не гемороиться на Си :)
     
  7. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    есть вариант связаться с аклокалом и выполнить AC_CHECK_что-то (char *как-то, char *зачем-то);

    только как?
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    а компромисс в виде
    Код (Text):
    1. if (!system("test ..."))
    не подходит?
     
  9. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Уже рассматривал....
    Как крайний вариант - можно.


    Щас думаю на тему Aclocal:

    Код (Text):
    1. char *file_to_check;
    2. int is_exists = @FILE_EXISTS@;
    3. if (is_exists !=-1){
    4.  
    5. file_to_check=@FILENAME@;
    6.  
    7. }
    Конструкции - ужас, но зато все работает:)
     
  10. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    а на что проверяется в test'ом в скрипте???
     
  11. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Не понял вопроса:)
     
  12. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    скрипт покажи, что проверяет ветка if test ...
     
  13. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Ну, например, есть ли header.h в системе:

    Код (Text):
    1. if test -s header.h
    2.  then;
    3. echo ЕСТЬ
    4. fi;
     
  14. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    более понятный код:
    Код (Text):
    1. if test ! -r $srcdir/$ac_unique_file; then
    2.   if test "$ac_srcdir_defaulted" = yes; then
    3.     { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
    4.    { (exit 1); exit 1; }; }
    5.   else
    6.     { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    7.    { (exit 1); exit 1; }; }
    8.   fi
    9. fi
    10. (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
    11.   { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
    12.    { (exit 1); exit 1; }; }
     
  15. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    а что в Си нет функции типа?:
    Код (Text):
    1. if (FileExist())
    2. {
    3. ...
    4. }
     
  16. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://www.ss64.com/bash/test.html
     
  17. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Товарищ NoBodyZZZ правильную ссылку дал. Почти все тесты нужно выполнить.

    Лучший вариант - #9, но некоторорые тесты можно как предложил KInder
     
  18. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    в любом случае вернется TRUE, так как test будет успешно запущена.
     
  19. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Короче, скачал пакет Confix - и больше ниче не надо.
    Все тесты, какие можно + отладка и все это на си.
    Заодно читаю исходник компилятора:)
     
  20. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    хмм, а разве нет никакого способа в *NIX системах узнать код/флаг результата запущенной/отработанной тулзы? того же "test" к примеру.