📄 sescript.c
字号:
/* * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M. * Saggaf. All rights reserved. * * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full * statement of rights and permissions for this program. */#include <time.h>#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include "seyon.h"#include "SeDecl.h"#ifdef SUNOS_3#include <setjmp.h>#endif#define MAX_PATH 256#define MAX_LINE 128extern int MdmTimedReadChar();extern FILE *tfp;extern char scriptDirectory[REG_BUF];static FILE *cf;int waitfor_time = 0, if_flag = 0, waitflag = 0;Boolean tty_flag = True, echo_flag = False, captflag = True;jmp_buf here;void k_debug(), k_echo(), k_flush(), k_hangup(), k_purge(), k_send_break(), k_shell(), k_waitfor(), k_when(), k_transmit(), k_pause(), k_exit(), k_quit(), k_if(), k_goto(), k_else(), k_endif(), k_redial(), k_dial(), s_set(), k_tty(), k_capture();/* globals */int linkflag = 0;static struct kw kw[] ={ {"debug", k_debug}, {"echo", k_echo}, {"flush", k_flush}, {"hangup", k_hangup}, {"purge", k_purge}, {"send_break", k_send_break}, {"shell", k_shell}, {"waitfor", k_waitfor}, {"when", k_when}, {"transmit", k_transmit}, {"pause", k_pause}, {"exit", k_exit}, {"if", k_if}, {"else", k_else}, {"endif", k_endif}, {"goto", k_goto}, {"dial", k_dial}, {"redial", k_redial}, {"quit", k_quit}, {"set", s_set}, {"capture", k_capture}, {"tty", k_tty}, {NULL, NULL}};Booleando_script(scriptFileName) String scriptFileName;{ char *scriptDir, buf[REG_BUF]; FILE *scriptFP; if (qres.scriptDirectory) scriptDir = qres.scriptDirectory; else scriptDir = qres.defaultDirectory; strcpy(buf, scriptFileName); if ((scriptFP = open_file(buf, scriptDir)) == NULL) return False; exec_close_script(scriptFP); return True;}voidexec_close_script(script_fp) FILE *script_fp;{ if_flag = 0; echo_flag = False; captflag = False; tty_flag = True; eof_flag = 0; if (linkflag == 2) linkflag = 0; while (!eof_flag) get_line(script_fp); fclose(script_fp); if (captflag) fclose(cf); eof_flag = 0; lptr = strcpy(line, ""); k_when(); linkflag = 0; return;}static char wf[MAX_LINE];voidget_line(script_fp) FILE *script_fp;{ int i; getline(script_fp); if (eof_flag) return; getword(); if (echo_flag) { if (strcmp(word, "transmit")) show(line); else show("TRANSMIT..."); } if (word[0] == '\0') /* Ignore blank lines */ return; if (word[0] == '#') /* Ignore comments */ return; if (word[strlen(word) - 1] == ':') /* Ignore labels */ return; if (if_flag == -1) { if (strcmp(word, "else") && strcmp(word, "endif")) return; } for (i = 0; kw[i].keyword != NULL; i++) if (strcmp(kw[i].keyword, word) == 0) { (*kw[i].rtn) (script_fp); return; } fprintf(tfp, "UNDEFINED COMMAND: \"%s\"\r\n", word); eof_flag = 1; return;}struct _when { String expect; String send; String ptr;};struct _when when[MAX_ENT] ={ {NULL, NULL, NULL}};voidk_waitfor(){ long t; char *ptr = wf, c; struct _when *whenPtr; GETTEST_ARG("waitfor"); strcpy(wf, word); GET_ARG(); for (whenPtr = when; whenPtr->expect; whenPtr++) whenPtr->ptr = whenPtr->expect; if (word[0]) waitfor_time = atoi(word); else waitfor_time = 30; t = time(NULL) + waitfor_time; while (t != time(NULL) && !eof_flag) { if (MdmTimedReadChar(&c, 1) < 0) continue; if (tty_flag) fputc(c, tfp); if (captflag) fputc(c, cf); if ((char)c != *ptr) ptr = wf; else if (*++ptr == '\0') { waitflag = 1; return; } for (whenPtr = when; whenPtr->expect; whenPtr++) { if ((char)c != *(whenPtr->ptr)) whenPtr->ptr = whenPtr->expect; else if (*++(whenPtr->ptr) == '\0') MdmPutString(whenPtr->send); } } waitflag = 0;}voidk_when(){ struct _when *whenPtr; GET_ARG(); if (word[0] == '\0') { for (whenPtr = when; whenPtr->expect; whenPtr++) { XtFree(whenPtr->expect); XtFree(whenPtr->send); } when[0].expect = NULL; return; } for (whenPtr = when; whenPtr->expect; whenPtr++); whenPtr->expect = XtNewString(word); (whenPtr + 1)->expect = NULL; GETTEST_ARG("when"); whenPtr->send = XtNewString(word);}voidk_transmit(){ getword(); if (eof_flag) return; if (word[0] == '\0') { fprintf(tfp, "No argument to TRANSMIT command\r\n"); eof_flag = 1; return; } MdmPutString(word);}voidk_pause(){ int pause_time; getword(); if (eof_flag) return; if (word[0] == '\0') pause_time = 5; else pause_time = atoi(word); sleep(pause_time);}voidk_quit(){ write_child_info(child_pipe, EXIT_PROGRAM, ""); k_exit();}voidk_exit(){ eof_flag = 1;}static char label[WBSIZE];voidk_goto(script_fp) FILE *script_fp;{ int found = 0, i; getword(); if (word[0] == '\0') { fprintf(tfp, "No argument for GOTO: %s\r\n", line); eof_flag++; return; } strcpy(label, word); rewind(script_fp); while (!found) { getline(script_fp); if (eof_flag) break; getword(); if (word[0] == '\0' || word[0] == '#') continue; if (word[i = (strlen(word) - 1)] != ':') continue; word[i] = '\0'; found = (strcmp(word, label) == 0); } if (eof_flag) { fprintf(tfp, "Label %s not found\r\n", label); eof_flag++; return; } if_flag = 0; /* reset IF flag */}static if_negate = 0;static intif_test(cond) int cond;{ if (if_negate) cond = !cond; if (cond) return 1; else return -1;}voidk_if(){ char *ptr; if (if_flag) { fprintf(tfp, "Nested IF statements not allowed\r\n"); eof_flag++; return; } if_negate = 0; getword(); if (word[0] == '\0') { fprintf(tfp, "No condition on IF statement\r\n"); eof_flag++; return; } if (strcmp(word, "not") == 0) { if_negate = 1; getword(); if (word[0] == '\0') { fprintf(tfp, "No condition on IF statement\r\n"); eof_flag++; return; } } if (word[0] == '!') { if_negate = 1; ptr = word + 1; } else ptr = word; if (strcmp(ptr, "waitfor") == 0) { if_flag = if_test(waitflag); return; } if (strcmp(ptr, "linked") == 0) { if_flag = if_test(linkflag); return; } fprintf(tfp, "Undefined IF condition %s\r\n", ptr); eof_flag++; return;}voidk_else(){ if (!if_flag) { fprintf(tfp, "ELSE not within IF\r\n"); eof_flag++; return; } if_flag = -if_flag;}voidk_endif(){ if (!if_flag) { fprintf(tfp, "ENDIF not wihtin IF\r\n"); eof_flag++; return; } if_flag = 0;}voidk_dial(){ getword(); if (word[0] == '\0') { fprintf(tfp, "DIAL command must have an argument\r\n"); eof_flag++; return; } dial(word);}voidk_redial(){ if (redial(NULL)) { eof_flag++; return; }}voidk_debug(){ set_onoff(&echo_flag); return;}voidk_echo(){ GET_ARG(); show(word);}voidk_flush(){ MdmIFlush();}voidk_hangup(){ MdmHangup();}voidk_purge(){ MdmPurge();}voidk_send_break(){ send_break();}voidk_shell(){ GETTEST_ARG("shell"); ExecShellCommand(word, 0);}voidk_capture(){ Boolean val = captflag; set_onoff(&captflag); if (eof_flag) return; if (val == captflag) return; if (captflag == False) fclose(cf); else { if ((cf = fopen(captureFile, "a")) == NULL) { fprintf(tfp, "Cannot open capture file %s\r\n", captureFile); eof_flag++; return; } }}voidk_tty(){ set_onoff(&tty_flag); return;}/* * Dial a phone number, using proper format and delay. */static char *last_nbr = NULL;voiddial(s) char *s;{ if (last_nbr) XtFree(last_nbr); last_nbr = XtNewString(s); mprintf("\r%s %s%s", qres.dialPrefix, s, qres.dialSuffix);}intredial(last_nbr) char *last_nbr;{ char *s; if (last_nbr == NULL) { show("REDIAL FAILURE"); return 1; } s = XtNewString(last_nbr); dial(s); XtFree(s); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -