[cdev] Утилита Echo
    Grigoriy A. Sitkarev 
    sitkarev на komitex.ru
       
    Ср Мар 17 17:02:45 MSK 2010
    
    
  
Отвечу по порядку.
Карабанова Елена пишет:
> Здравствуйте, 
> спасибо большое за вашу подсказку она очень мне помогла.
Я там забыл только второй обратный слеш нарисовать в условии (*c = '\\') 
но это  вы сообразили что ошибка и поправили.
> Функцию свою я вынесла за пределы main и изменила логику программы
Это я вижу.
Но стиль у вас не в порядке. Приведите пожалуйста так чтобы было приятно 
смотреть. Отступы у вас должны быть TAB-ами (а не пробелами), редактор 
настройте так, чтобы каждый TAB показывался как 8 пробелов. Вам будет 
удобно.
В функции main() у вас должны быть отступы:
int
main(int argc, char *argv[])
{
	int flags;
	int opt;
	...
}
А у вас их нет.
Не должно быть смешанных регистров в именах функций и идентификаторов.
Print_Words - не допустимо (do_echo бы подошло).
Почему-то уехали директивы препроцессора #include вправо. Там не надо 
отступов, они пишутся сразу:
#include <unistd.h>
> на текущий момент моя утилита понимает опции -e -E -n, но только если они идут сразу после команды 
> пример: 
> если написать echo2 -e 1234\\t123 выдаст 1234     123
> если написать echo2 -e -E 1234\\t123 выдаст 1234\t123
> если написать echo2 -e -E -n 1234\\t123 выдаст 1234\t123 но не перейдёт на новую строчку
Можете не расписывать подробно что делает ваша программа. Мне достаточно 
    вашего кода для этого. Не тратьте силы зря.
> а вот стандартная утилита echo если написать echo 1234 -e 5678 так и выведет 1234 -e 5678
> а моя утилита выведет 1234 5678
Не вижу в поведении вашей утилиты нарушения Open Group спецификации. ))
> не работает команда "\\" выдает ошибку если написать echo2 -e \\
> ORBIT_SOCKETDIR=/tmp/orbit-Elena
Она работает. Вам надо четыре обратных слеша потому что bash его 
использует как ESC-символ (два раза).
$ echo -e \\\\
\
> 
> не работает команда "\\с" проблема с реализацией 
В спецификации Open Group говорится что \c должна подавлять вывод 
символа новой строки \n. Все символы после \c должны игнорироваться. В 
чём проблема реализовать?
По умолчанию, у вас должен быть символ конца строки в выводе. Если 
встретится \c, то вы не должны его выводить. Так как вы пользуетесь 
форматированным вводом-выводом, то в конце должны делать fflush(3) на 
дескрипторе потока (хотя libc и флюшит все потоки при exit(1)).
Я бы сделал очень просто.
static int with_newline = 1; /* Enabled by default. */
...
while ((opt = getopt(...)) {
	switch (opt) {
	...
	case 'n':
		/* Disable output of newline. */
		with_newline = 0;
		break;
	...
	}
}
Потом вы в выводе используете эту переменную и если она не нулевая, то 
выводите символ новой строки.
	while (*c) {
        		if (*c == '\\') {
			c++;
                  	switch (*c) {
                  	case '\\':
				...
			case '\c':
				with_newline = 1;
				goto flush;
			}
		}
		...
	}
flush:
	if (with_newline)
		putc('\n');
	fflush(stdout);
	return;
Если вам встретилась команда '\c' то вы просто устанавливаете 
with_newline = 1 и немедленно переходите к метке flush (или обзовите её 
как считаете нужным) через goto.
Или изобразите нечто похожее, это не догма, так - мысли в слух.
> я вам посылаю исходный код, и откомпиллированный файл
> 
> у меня стоит Fedora12, а писала я программу в KDevelop: С/С++
> пробовала откомпиллировать исходный код в терминале, используя gcc откомпиллировалось успешно
Если в KDevelop компилируется то проверять отдельно "в терминале" не 
обязательно. KDevelop это только оболочка над gcc, binutils, gdb и т.д. 
Он на самом деле их запускает "в терминале" вы даже можете видеть их вывод.
--
Г.А.
    
    
Подробная информация о списке рассылки cdev