📄 feval.c
字号:
/*+------------------------------------------------------------------------- feval.c - integer and string function evaluation wht@n4hgf.Mt-Park.GA.US feval_int(param,&int_returned) where 'int' here means long ECU $i int feval_str(param,&esd_to_be_plugged) These routines are called with param.index as follows: !nnnnn nnn is name of function ^ | Defined functions: feval_int(param,value) feval_str(param,result_esd) strfunc_left(param,scratch_esd,result_esd) strfunc_right(param,scratch_esd,result_esd)--------------------------------------------------------------------------*//*+:EDITS:*//*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 *//*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA *//*:05-07-1992-15:04-wht@n4hgf-bug in FIconn code *//*:04-25-1992-14:28-wht@n4hgf-%conn returns -1 if no line open *//*:04-25-1992-13:19-wht@n4hgf-%line succeeds even if line not open *//*:03-01-1992-13:28-wht@n4hgf-come up to modern times ... enum for FI/FS *//*:02-14-1992-16:37-wht@n4hgf-add uname *//*:07-25-1991-12:58-wht@n4hgf-ECU release 3.10 *//*:07-14-1991-18:18-wht@n4hgf-new ttygets functions *//*:06-29-1991-16:33-wht@n4hgf-use cuserid() instead of getlogin() *//*:03-16-1991-15:23-wht@n4hgf-add %nice *//*:01-31-1991-16:10-wht@n4hgf-was freeing tesd1 twice in feval_str *//*:12-24-1990-04:31-wht@n4hgf-experimental fasi driver functions *//*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */#include "ecu.h"#include "ecuerror.h"#include "esd.h"#include "proc.h"#include "var.h"#include "ecutty.h"#include <sys/utsname.h>#if defined(FASI)char *msr_text();#endifenum FI_codes{ FIZERO, FIargc, FIbaud, FIbrdet, FIcolors, FIcols, FIconn, FIcsec, FIctoi, FIcurx, FIcury, FIesecs, FIfasi, FIfatime, FIfmode, FIfmtime, FIfsize, FIftell, FIgid, FIinstr, FIisalnum, FIisalpha, FIisascii, FIischr, FIiscntrl, FIisdigit, FIisdir, FIisgraph, FIislower, FIisprint, FIispunct, FIisreg, FIisspace, FIisupper, FIisxdigit, FIlen, FIlgetc, FIlines, FIlnerr, FImatch, FImhack, FImsr, FInice, FIpid, FIrchr, FIrchrc, FIridet, FIrinstr, FIshmid, FIstoi, FIuid, FIxchr, FIxchrc, FI____end};KEYTAB feval_int_tbl[] ={ {"argc",FIargc}, {"baud",FIbaud},#if defined(FASI) {"brdet",FIbrdet},#endif {"colors",FIcolors}, {"cols",FIcols}, {"conn",FIconn}, {"csec",FIcsec}, {"ctoi",FIctoi}, {"curx",FIcurx}, {"cury",FIcury}, {"esecs",FIesecs}, {"fasi",FIfasi}, {"fatime",FIfatime}, {"fmode",FIfmode}, {"fmtime",FIfmtime}, {"fsize",FIfsize}, {"ftell",FIftell}, {"gid",FIgid}, {"instr",FIinstr}, {"isalnum",FIisalnum}, {"isalpha",FIisalpha}, {"isalpha",FIisalpha}, {"isascii",FIisascii}, {"ischr",FIischr}, {"iscntrl",FIiscntrl}, {"isdigit",FIisdigit}, {"isdir",FIisdir}, {"isgraph",FIisgraph}, {"islower",FIislower}, {"isprint",FIisprint}, {"ispunct",FIispunct}, {"isreg",FIisreg}, {"isspace",FIisspace}, {"isupper",FIisupper}, {"isxdigit",FIisxdigit}, {"len",FIlen},#if defined(FASI) {"lnerr",FIlnerr},#endif {"lgetc",FIlgetc}, {"lines",FIlines}, {"match",FImatch}, {"mhack",FImhack},#if defined(FASI) {"msr",FImsr},#endif {"nice",FInice}, {"pid",FIpid}, {"rchr",FIrchr}, {"rchrc",FIrchrc},#if defined(FASI) {"ridet",FIridet},#endif {"rinstr",FIrinstr}, {"shmid",FIshmid}, {"stoi",FIstoi}, {"uid",FIuid}, {"xchr",FIxchr}, {"xchrc",FIxchrc}, {(char *)0,0}};enum FS_codes{ FSZERO, FSargv, FSbasename, FScgetc, FScgets, FSchr, FSdate, FSdatez, FSday, FSdayz, FSdir, FSdirpart, FSedate, FSenvvar, FSerrstr, FSetime, FSfilepart, FSfmodestr, FSitos, FSleft, FSline, FSlogname, FSmid, FSmonth, FSmonthz, FSmsrtext, FSrdesc, FSright, FSrname, FSrtel, FSscreen, FStime, FStimes, FStimez, FStimezs, FStty, FSuname, FS____end};KEYTAB feval_str_tbl[] ={ {"argv",FSargv}, {"basename",FSbasename}, {"cgetc",FScgetc}, {"cgets",FScgets}, {"chr",FSchr}, {"date",FSdate}, {"datez",FSdatez}, {"day",FSday}, {"dir",FSdir}, {"dirpart",FSdirpart}, {"edate",FSedate}, {"envvar",FSenvvar}, {"errstr",FSerrstr}, {"etime",FSetime}, {"filepart",FSfilepart}, {"fmodestr",FSfmodestr}, {"getenv",FSenvvar}, {"itos",FSitos}, {"left",FSleft}, {"line",FSline}, {"logname",FSlogname}, {"mid",FSmid}, {"month",FSmonth},#if defined(FASI) {"msrtext",FSmsrtext},#endif {"rdesc",FSrdesc}, {"right",FSright}, {"rname",FSrname}, {"rtelno",FSrtel}, {"screen",FSscreen}, {"time",FStime}, {"times",FStimes}, {"timez",FStimez}, {"timezs",FStimezs}, {"tty",FStty}, {"uname",FSuname}, {(char *)0,0}};extern char curr_dir[];extern int proctrace;extern PCB *pcb_stack[];extern struct timeb starting_timeb;extern uint tcap_LINES;extern uint tcap_COLS;extern int shm_shmid;char *day_of_week_list = "SunMonTueWedThuFriSat";char *month_name_list = "JanFebMarAprMayJunJulAugSepOctNovDec";/*+------------------------------------------------------------------------- erc = feval_int(param,&int_returned);Functions (parameter types are expressed by the usage of variables)--------------------------------------------------------------------------*/feval_int(param,value)ESD *param;long *value;{register erc;register keyword_token;ESD *tesd1 = (ESD *)0;ESD *tesd2 = (ESD *)0;ulong int1;char s32[32];struct timeb now_timeb;int nice(); if(erc = get_alphanum_zstr(param,s32,sizeof(s32))) { erc = eInvalidFunction; goto RETURN; } keyword_token = keyword_lookup(feval_int_tbl,s32); switch(keyword_token) {/* LEN($S0) length of $S0 */ case FIlen: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; *value = (long)tesd1->cb; break;/* INSTR($S0,$S1) index of first occurrence of $S1 in $S0, -1 if none */ case FIinstr: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(!(tesd2 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_comma(param)) goto RETURN; if(erc = gstr(param,tesd2,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; *value = (long)ulindex(tesd1->pb,tesd2->pb); break;/* RINSTR($S0,$S1) index of last occurrence of $S1 in $S0, -1 if none */ case FIrinstr: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(!(tesd2 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_comma(param)) goto RETURN; if(erc = gstr(param,tesd2,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; *value = (long)ulrindex(tesd1->pb,tesd2->pb); break; case FImatch: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(!(tesd2 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_comma(param)) goto RETURN; if(erc = gstr(param,tesd2,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; erc = regexp_operation(tesd1->pb,tesd2->pb,value); break; case FImhack: ftime(&now_timeb); *value = ((now_timeb.time - starting_timeb.time) * 1000) + (now_timeb.millitm - starting_timeb.millitm); erc = 0; break; case FIesecs: ftime(&now_timeb); *value = now_timeb.time; erc = 0; break; case FIargc: if(!proc_level) { pputs("not executing procedure\n"); erc = eFATAL_ALREADY; break; } *value = (long)pcb_stack[proc_level - 1]->argc; break; case FIcolors: if(erc = ifunc_colors(value)) goto RETURN; break; case FIftell: if(erc = ifunc_ftell(param,value)) goto RETURN; break; case FIfmode: if(erc = ifunc_fmode(param,value)) goto RETURN; break; case FIfsize: if(erc = ifunc_fsize(param,value)) goto RETURN; break; case FIfmtime: if(erc = ifunc_fmtime(param,value)) goto RETURN; break; case FIfatime: if(erc = ifunc_fatime(param,value)) goto RETURN; break; case FIischr: if(erc = ifunc_ischr(param,value)) goto RETURN; break; case FIisdir: if(erc = ifunc_isdir(param,value)) goto RETURN; break; case FIisreg: if(erc = ifunc_isreg(param,value)) goto RETURN; break; case FIbaud: *value = (long)shm->Lbaud; erc = 0; break; case FIpid: *value = (long)getpid(); erc = 0; break; case FIcsec: *value = (shm->Lconnected) ? shm->Loff_hook_time : -1; erc = 0; break; case FIconn: if(shm->Liofd < 0) *value = -1; else *value = (long)(shm->Lconnected) ? (long)shm->Liofd : 0; erc = 0; break; case FIxchr: *value = shm->xmit_chars; erc = 0; break; case FIxchrc: *value = shm->xmit_chars_this_connect; erc = 0; break; case FIrchr: *value = shm->rcvd_chars; erc = 0; break; case FIrchrc: *value = shm->rcvd_chars_this_connect; erc = 0; break;/* LGETC($I0) get char from line, waiting for $I0 msecreturns character read or -1 if none read in time */ case FIlgetc: if(erc = skip_paren(param,1)) goto RETURN; if(erc = gint(param,&int1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; *value = (long)lgetc_timeout(int1); if(zero_length_read_detected) { zero_length_read_detected = 0; erc = eProcAttn_DCDloss; } break; case FIctoi: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; if(tesd1->cb == 0) *value = -1; else *value = (long)((unsigned)0xFF & (unsigned)tesd1->pb[0]); break; case FIstoi: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; tesd1->index = 0; skip_cmd_break(tesd1); *value = 0; gint_constant(tesd1,value); break; case FIcurx: *value = (long)shm->cursor_x; break; case FIcury: *value = (long)shm->cursor_y; break; case FIshmid: *value = (long)shm_shmid; break; case FIisalpha: case FIisupper: case FIislower: case FIisdigit: case FIisxdigit: case FIisspace: case FIispunct: case FIisalnum: case FIisprint: case FIisgraph: case FIiscntrl: case FIisascii: if(!(tesd1 = esdalloc(256))) { erc = eNoMemory; goto RETURN; } if(erc = skip_paren(param,1)) goto RETURN; if(erc = gstr(param,tesd1,1)) goto RETURN; if(erc = skip_paren(param,0)) goto RETURN; if(!tesd1->cb) { *value = 0; goto RETURN; } switch(keyword_token) { case FIisalpha: *value = !!isalpha(*tesd1->pb); break; case FIisupper: *value = !!isupper(*tesd1->pb); break; case FIislower: *value = !!islower(*tesd1->pb); break; case FIisdigit: *value = !!isdigit(*tesd1->pb); break; case FIisxdigit: *value = !!isxdigit(*tesd1->pb); break; case FIisspace: *value = !!isspace(*tesd1->pb); break; case FIispunct: *value = !!ispunct(*tesd1->pb); break; case FIisalnum: *value = !!isalnum(*tesd1->pb); break; case FIisprint: *value = !!isprint(*tesd1->pb); break; case FIisgraph: *value = !!isgraph(*tesd1->pb); break; case FIiscntrl: *value = !!iscntrl(*tesd1->pb); break; case FIisascii: *value = !!isascii(*tesd1->pb); break; } break; case FIlines: *value = (long)tcap_LINES; break; case FIcols: *value = (long)tcap_COLS; break;#if defined(FASI) case FIfasi: *value = 1; break; case FImsr: *value = (long)fasi_msr(); break; case FIlnerr:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -