Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
$ <b>ed -p '> ' sayings</b> /* Запуск ed, '> ' используется как приглашение */sayings: No such file or directory> <b>a</b> /* Добавить текст */Hello, worldDon't panic<b>^C</b> /* Сгенерировать SIGINT */? /* Сообщение об ошибке ''один размер подходит всем'' */> <b>1,$p</b> /* ed возвращается в командную строку */Hello, world /* '1,$p' prints all the lines */Don't panic> <b>w</b> /* Сохранить файл */25> <b>q</b> /* Все сделано */Внутри себя
ed12.5.1. Использование стандартных функций:
setjmp()longjmp()Нелокальные переходы осуществляются с помощью функций
setjmp()longjmp()#include <setjmp.h> /* ISO С */int setjmp(jmp_buf env);void longjmp(jmp_buf env, int val);Тип
jmp_buftypedef<setjmp.h>setjmp()envenvsetjmp()jmp_bufjmp_bufsetjmp()jmp_bufjmp_buf command_loop; /* На глобальном уровне *//* ... затем в main() ... */if (setjmp(command_loop) == 0) /* Состояние сохранено, продолжить */ ;else /* Мы попадаем сюда через нелокальный переход */ printf("?n"); /* ed's famous message *//* ... теперь начать цикл команд ... */longjmp()jmp_bufsetjmp()setjmp()Стандарт С утверждает, что даже если
longjmp()setjmp()Возможность передать целое значение и вернуться обратно из
setjmp()gawkbreakcontinuewhiledo-whileforbreakcontinuesetjmp()eval.cgawk507 case Node_K_while:508 PUSH_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);509510 stable_tree = tree;511 while (eval_condition(stable_tree->lnode)) {512 INCREMENT(stable_tree->exec_count);513 switch (setjmp(loop_tag)) {514 case 0: /* обычный не переход */515 (void)interpret(stable_tree->rnode);516 break;517 case TAG_CONTINUE: /* оператор continue */518 break;519 case TAG_BREAK: /* оператор break */520 RESTORE_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);521 return 1;522 default:523 cant_happen();524 }525 }526 RESTORE_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);527 break;Этот фрагмент кода представляет цикл
whilejmp_bufwhilewhileswitchsetjmp()setjmp()TAG_BREAKTAG_CONTINUEswitch