Russian Qt Forum

Программирование => С/C++ => Тема начата: jatsuk от Май 22, 2011, 06:46



Название: Разобрать исходные коды
Отправлено: jatsuk от Май 22, 2011, 06:46
Препод замучил.... нужно разобраться как работает функция feof. И не просто сказать что она возвращает, в каких случаях, а ПРЯМ в исходном коде функции показать где это выполняется.
Скачал я glibc-2.3.4 и нашел там исходный код.

Код:
#include "libioP.h"
#include "stdio.h"

int
_IO_feof (fp)
     _IO_FILE* fp;
{
  int result;
  CHECK_FILE (fp, EOF);
  _IO_flockfile (fp);
  result = _IO_feof_unlocked (fp);
  _IO_funlockfile (fp);
  return result;
}

#ifdef weak_alias
weak_alias (_IO_feof, feof)

#ifndef _IO_MTSAFE_IO
#undef feof_unlocked
weak_alias (_IO_feof, feof_unlocked)
#endif
#endif

Мне понять из этого как работает очень сложно.
Понятно только одно здесь прямо это не выполняется (возвращает не нулевой символ если конец, а если конец, то 0 вроде)
Так вопрос, а в какой вообще функции идет это сравнение , возвращение ???
я так понял  result = _IO_feof_unlocked (fp); здесь возвращается. Где тогда найти саму функцию _IO_feof_unlocked сеё исходным кодом.

А Если есть какая нибудь книжечка с полным описанием исходных кодов, подскажите ??


Название: Re: Разобрать исходные коды
Отправлено: Fat-Zer от Май 22, 2011, 13:09
_IO_feof_unlocked - это не функция, это макрос... как найти - воспользуйся поиском...
А Если есть какая нибудь книжечка с полным описанием исходных кодов, подскажите ??
есть только документация идущая с библиотекой...


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 22, 2011, 13:35
_IO_feof_unlocked искал
много раз искал, по тексту ...
находит только libio.h, feof_u.c,feof.c, stdio.h

что за документация, вроде там не было...


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 22, 2011, 14:10
всё что есть

#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)


Название: Re: Разобрать исходные коды
Отправлено: Fat-Zer от Май 22, 2011, 14:40
что за документация, вроде там не было...
папка manual, но она в ТеХе, её нужно собрать...
#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
тогда чего здесь не понятного? если флаг установлен, то возвращается труъ


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 22, 2011, 14:52
Папки мануал нет  :-[
ну да ладно

вторая функция getc, она должна возвращать EOF если конец

#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
   ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

но где тут это ?? я только понял , что сравнивает указатель чтения сейчас и конца и возвращает 0.А в конце указатель передвигается. А EOF нет (



Название: Re: Разобрать исходные коды
Отправлено: Fat-Zer от Май 22, 2011, 15:21
Папки мануал нет  :-[
ну да ладно
не заметил, что версия древняя... может там и нет... тогда можно посмотреть в онлайне на оф.сайте.

вторая функция getc, она должна возвращать EOF если конец

#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
   ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

но где тут это ?? я только понял , что сравнивает указатель чтения сейчас и конца и возвращает 0.А в конце указатель передвигается. А EOF нет (
всё же ведь написано: если указатель чтения >= вернего указателя буфера, то вызвать __uflow, которая будет делпть чёрную работу, иначе вернуть указатель на текущий символ и увеличить указатель чтения.


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 22, 2011, 16:00
Спасибо за всё. Завтра поищу новую версию...
С Eof так и не понял  :-[


Название: Re: Разобрать исходные коды
Отправлено: Fat-Zer от Май 22, 2011, 16:02
С Eof так и не понял  :-[
смотрите код __uflow()


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 24, 2011, 08:12
А что такое

  int result;
  CHECK_FILE (fp, EOF); ??????
  _IO_flockfile (fp);
  result = _IO_feof_unlocked (fp);
  _IO_funlockfile (fp);
  return result;



Название: Re: Разобрать исходные коды
Отправлено: brankovic от Май 24, 2011, 10:01
А что такое
  CHECK_FILE (fp, EOF); ??????

проверяет что fp не ноль и грубо, что он вообще валидный. Чего вы хотите-то разобраться досконально прям? Тогда всё в исходниках есть. Но ИМХО постановка (со стороны преподавателя) более чем странная.


Название: Re: Разобрать исходные коды
Отправлено: gogi от Май 24, 2011, 10:42
Скачал я glibc-2.3.4
Ничего по-ископаемее не нашёл?


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 25, 2011, 06:01
Я лично не хочу в этом разбираться   :) но приходится
Чек файла в исходниках не нашел...

А скачал, что было на серваке кафедры ;D


Название: Re: Разобрать исходные коды
Отправлено: jatsuk от Май 25, 2011, 06:13
Вот что получилось с функцией getc

Код:
 result = _IO_getc_unlocked (fp); (getc.с)

этот макрос в libio.h

Код:
#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

далее __uflow genops.c
Код:
int
__uflow (fp)
     _IO_FILE *fp;
{
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
  if (_IO_vtable_offset (fp) == 0 && _IO_fwide (fp, -1) != -1)
    [b]return EOF;[/b]
#endif

  if (fp->_mode == 0)
    _IO_fwide (fp, -11);
  if (_IO_in_put_mode (fp))
    if (INTUSE(_IO_switch_to_get_mode) (fp) == EOF)
     [b] return EOF;[/b]
  if (fp->_IO_read_ptr < fp->_IO_read_end)
    return *(unsigned char *) fp->_IO_read_ptr++;
  if (_IO_in_backup (fp))
    {
      _IO_switch_to_main_get_area (fp);
      if (fp->_IO_read_ptr < fp->_IO_read_end)
return *(unsigned char *) fp->_IO_read_ptr++;
    }
  if (_IO_have_markers (fp))
    {
      if (save_for_backup (fp, fp->_IO_read_end))
[b]return EOF;[/b]
    }
  else if (_IO_have_backup (fp))
    INTUSE(_IO_free_backup_area) (fp);
  return _IO_UFLOW (fp);
}
libc_hidden_def (__uflow)