📄 feval.c
字号:
*value = (long)fasi_line_errors(); break; case FIridet: *value = (long)fasi_rings_detected(); break; case FIbrdet: *value = (long)fasi_breaks_detected(); break;#else case FIfasi: *value = 0; break;#endif case FInice: *value = (long)nice(0) + 20; erc = 0; break; case FIuid: *value = (long)getuid(); erc = 0; break; case FIgid: *value = (long)getgid(); erc = 0; break; default: erc = eInvalidFunction; } /* end of keyword lookup erc switch statement */RETURN: if(tesd1) esdfree(tesd1); if(tesd2) esdfree(tesd2); return(erc);} /* end of feval_int() *//*+------------------------------------------------------------------ strfunc_left(param,&scratch_esd,&result_esd)-------------------------------------------------------------------*/intstrfunc_left(param,scratch_esd,result_esd)ESD *param;ESD *scratch_esd;ESD *result_esd;{register erc;int itmp;long ltmp; if(erc = skip_paren(param,1)) return(erc); if(erc = gstr(param,scratch_esd,1)) return(erc); if(erc = skip_comma(param)) return(erc); if(erc = gint(param,<mp)) return(erc); itmp = (int)ltmp; if(itmp < 0) return(eBadParameter); if(erc = skip_paren(param,0)) return(erc); /* take min of param and .cb */ itmp = (itmp < scratch_esd->cb) ? itmp : scratch_esd->cb; if(itmp > (result_esd->maxcb - result_esd->cb) ) return(eBufferTooSmall); memcpy(&result_esd->pb[result_esd->cb], scratch_esd->pb,itmp); result_esd->cb += itmp; return(erc);} /* end of strfunc_left() *//*+------------------------------------------------------------------------- erc = strfunc_right(param,&scratch_esd,&result_esd)--------------------------------------------------------------------------*/intstrfunc_right(param,scratch_esd,result_esd)ESD *param;ESD *scratch_esd;ESD *result_esd;{register erc;int itmp;long ltmp; if(erc = skip_paren(param,1)) return(erc); if(erc = gstr(param,scratch_esd,1)) return(erc); if(erc = skip_comma(param)) return(erc); if(erc = gint(param,<mp)) return(erc); itmp = (int)ltmp; if(itmp < 0) return(eBadParameter); if(erc = skip_paren(param,0)) return(erc);/* take min of param and .cb */ itmp = (itmp < scratch_esd->cb) ? itmp : scratch_esd->cb; if(itmp > (result_esd->maxcb - result_esd->cb) ) return(eBufferTooSmall); memcpy(&result_esd->pb[result_esd->cb], &scratch_esd->pb[scratch_esd->cb - itmp],itmp); result_esd->cb += itmp; return(0);} /* end of strfunc_right() *//*+------------------------------------------------------------------------- erc = feval_str(param,&esd_to_be_plugged); results are APPENDED to 'result_esd'--------------------------------------------------------------------------*/feval_str(param,result_esd)ESD *param;ESD *result_esd;{register erc;register itmp;int int1,int2;char s64[64];char *cptr;long ltmp;long ltmp2;long ltmp3;ESD *tesd1;ESD *tesd2 = (ESD *)0;char *get_ttyname();char *getenv();char *cuserid();char *get_elapsed_time();char *mode_map(); if(!(tesd1 = esdalloc(128))) return(eNoMemory); if(erc = get_alphanum_zstr(param,s64,sizeof(s64)-1)) { esdfree(tesd1); return(eInvalidFunction); } erc = 0; itmp=keyword_lookup(feval_str_tbl,s64); switch(itmp) {/* LEFT($S0,$I0) return leftmost $I0 characters of $S0 */ case FSleft: erc = strfunc_left(param,tesd1,result_esd); break;/* RIGHT($S0,$I0) return rightmost $I0 characters of $S0 */ case FSright: erc = strfunc_right(param,tesd1,result_esd); break;/* MID($S0,$I0,$I1) return middle $I1 chars of $S0 starting at $I0 */ case FSmid: if(erc = skip_paren(param,1)) break; if(erc = gstr(param,tesd1,1)) break; if(erc = skip_comma(param)) break; if(erc = gint(param,<mp)) break; int1 = (int)ltmp; if(int1 < 0) { erc = eBadParameter; break; } if(erc = skip_cmd_break(param)) break; if(param->pb[param->index] == ')') /* if we find a ')' instead of ... */ { /* 2nd int param, default to max */ ++param->index; int2 = 256; } else { if(erc = skip_comma(param)) break; if(erc = gint(param,<mp)) break; int2 = (int)ltmp; if(int2 < 0) { erc = eBadParameter; break; } if(erc = skip_paren(param,0)) break; } if(int1 >= tesd1->cb) /* if initial index past end of string */ break; itmp = tesd1->cb - int1; itmp = (int2 < itmp) ? int2 : itmp; cptr = tesd1->pb + int1; goto CPTR_ITMP_COMMON;/* ARGV($I0) */ case FSargv: if(!proc_level) { pputs("not executing procedure\n"); erc = eFATAL_ALREADY; break; } if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; if(erc = skip_paren(param,0)) break; itmp = (long)pcb_stack[proc_level - 1]->argc; /* arg count */ if((int)ltmp > itmp - 1) { if(proctrace) { pprintf("WARNING: %%argc=%d, %%argv(%ld) null\n", itmp,ltmp); } break; } cptr = (pcb_stack[proc_level - 1])->argv[(int)ltmp]; itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FSdir: cptr = curr_dir; itmp = strlen(curr_dir); goto CPTR_ITMP_COMMON; case FSetime: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; if(erc = skip_paren(param,0)) break; cptr = get_elapsed_time(ltmp); itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FSerrstr: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; if(erc = skip_paren(param,0)) break; cptr = errno_text((int)ltmp); itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FSenvvar: if(erc = skip_paren(param,1)) break; if(erc = gstr(param,tesd1,1)) break; if(erc = skip_paren(param,0)) break; if(!(cptr = getenv(tesd1->pb))) break; itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FSlogname: if(!(cptr = cuserid((char *)0))) break; itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FSfmodestr: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; if(erc = skip_paren(param,0)) break; cptr = mode_map((ushort)ltmp,(char *)0); itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FStty: cptr = get_ttyname(); itmp = strlen(cptr); goto CPTR_ITMP_COMMON; case FSuname: { struct utsname utsn;#ifdef M_SYSV /* SCO */ FILE *fp = fopen("/etc/systemid","r"); if(fp) { s64[0] = 0; fgets(s64,sizeof(s64),fp); fclose(fp); if(itmp = strlen(s64)) { if(*(cptr = s64 + itmp - 1) == '\n') *cptr = 0,itmp--; strip_trail_break(s64); cptr = s64; itmp = strlen(cptr); goto CPTR_ITMP_COMMON; } }#endif if(uname(&utsn) == -1) { pperror("uname"); erc = eFATAL_ALREADY; break; } cptr = utsn.sysname; itmp = strlen(cptr); goto CPTR_ITMP_COMMON; } /* end of case FSuname */ case FSrname: if(!shm->Lconnected) break; cptr = shm->Lrname; itmp = strlen(shm->Lrname); goto CPTR_ITMP_COMMON; case FSrdesc: if(!shm->Lconnected) break; cptr = shm->Ldescr; itmp = strlen(shm->Ldescr); goto CPTR_ITMP_COMMON; case FSrtel: if(!shm->Lconnected) break; cptr = shm->Ltelno; itmp = strlen(shm->Ltelno); goto CPTR_ITMP_COMMON; case FSline: cptr = shm->Lline; itmp = strlen(shm->Lline); goto CPTR_ITMP_COMMON; case FSmonth: case FSmonthz: cptr = &month_name_list[(get_month(itmp == FSmonthz) - 1) * 3]; itmp = 3; goto CPTR_ITMP_COMMON; case FSday: case FSdayz: cptr = &day_of_week_list[get_day(itmp == FSdayz) * 3]; itmp = 3; goto CPTR_ITMP_COMMON; case FSscreen: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) /* y */ break; if(ltmp > 42) { erc = eBadParameter; break; } if(erc = skip_comma(param)) break; if(erc = gint(param,<mp2)) /* x */ break; if(ltmp2 > 79) { erc = eBadParameter; break; } if(erc = skip_comma(param)) break; if(erc = gint(param,<mp3)) /* len */ break; if(erc = skip_paren(param,0)) break; int1 = ((int)ltmp * 80) + (int)ltmp2; /* screen position */ itmp = (int)ltmp3; /* length */ int2 = sizeof(shm->screen) - int1; /* size from y,x to end */ if(itmp > int2) itmp = int2; cptr = ((char *)shm->screen) + int1; goto CPTR_ITMP_COMMON; case FSbasename: if(!(tesd2 = esdalloc(32))) return(eNoMemory); if(erc = skip_paren(param,1)) break; if(erc = gstr(param,tesd1,1)) break; if(erc = skip_comma(param)) break; if(erc = gstr(param,tesd2,1)) break; if(erc = skip_paren(param,0)) break; cptr = tesd1->pb; itmp = tesd1->cb; if((tesd1->cb >= tesd2->cb) && !strcmp(cptr + tesd1->cb - tesd2->cb,tesd2->pb)) { itmp -= tesd2->cb; } goto CPTR_ITMP_COMMON; case FSdirpart: if(erc = skip_paren(param,1)) break; if(erc = gstr(param,tesd1,1)) break; if(erc = skip_paren(param,0)) break; if(cptr = strrchr(tesd1->pb,'/')) itmp = cptr - tesd1->pb; else itmp = tesd1->cb; cptr = tesd1->pb; goto CPTR_ITMP_COMMON; case FSfilepart: if(erc = skip_paren(param,1)) break; if(erc = gstr(param,tesd1,1)) break; if(erc = skip_paren(param,0)) break; if(cptr = strrchr(tesd1->pb,'/')) itmp = strlen(++cptr); else { cptr = tesd1->pb; itmp = tesd1->cb; } goto CPTR_ITMP_COMMON;#if defined(FASI) case FSmsrtext: cptr = msr_text(fasi_msr()); itmp = strlen(cptr); goto CPTR_ITMP_COMMON;#endifCPTR_ITMP_COMMON: if( itmp > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } memcpy(&result_esd->pb[result_esd->cb],cptr,itmp); result_esd->cb += itmp; break; case FSedate: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; if(erc = skip_paren(param,0)) break; if(19 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } epoch_secs_to_str(ltmp,3,&result_esd->pb[result_esd->cb]); result_esd->cb += 19; break; case FStime: if(5 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } get_tod(0,&result_esd->pb[result_esd->cb]); result_esd->cb += 5; break; case FStimes: if(8 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } get_tod(1,&result_esd->pb[result_esd->cb]); result_esd->cb += 8; break; case FStimez: if(5 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } get_tod(6,&result_esd->pb[result_esd->cb]); result_esd->cb += 5; break; case FStimezs: if(8 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } get_tod(7,&result_esd->pb[result_esd->cb]); result_esd->cb += 8; break; case FSdate: if(10 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } get_tod(5,&result_esd->pb[result_esd->cb]); result_esd->cb += 10; break; case FSdatez: if(10 > (result_esd->maxcb - result_esd->cb)) { erc = eBufferTooSmall; break; } get_tod(8,&result_esd->pb[result_esd->cb]); result_esd->cb += 10; break; case FScgets: erc = ttygets_esd(result_esd,TG_CRLF,1); break; case FScgetc: if(result_esd->cb == result_esd->maxcb) { erc = eBufferTooSmall; break; } result_esd->pb[result_esd->cb] = ttygetc(0); result_esd->cb++; break; case FSchr: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; if(!ltmp) { pputs("cannot use %chr(0)\n"); return(eFATAL_ALREADY); } if(erc = skip_paren(param,0)) break; if(result_esd->cb == result_esd->maxcb ) { erc = eBufferTooSmall; break; } result_esd->pb[result_esd->cb] = (char)ltmp; result_esd->cb++; break; case FSitos: if(erc = skip_paren(param,1)) break; if(erc = gint(param,<mp)) break; s64[0] = 0; if(!skip_comma(param)) { if(erc = get_numeric_zstr(param,s64 + 1,sizeof(s64) - 4)) strcpy(s64 + 1,"1"); if(((itmp = atoi(s64 + 1)) < 0) || (itmp > (result_esd->maxcb - result_esd->cb))) { erc = eBufferTooSmall; break; } s64[0] = '%'; if(ulindex(param->pb + param->index,"x") == 0) { param->index++; strcat(s64,"lx"); } else if(ulindex(param->pb + param->index,"o") == 0) { param->index++; strcat(s64,"lo"); } else if(ulindex(param->pb + param->index,"d") == 0) { param->index++; strcat(s64,"ld"); } else if(erc) break; else strcat(s64,"ld"); } if(erc = skip_paren(param,0)) break; sprintf(tesd1->pb,s64[0] ? s64 : "%ld",ltmp); tesd1->cb = strlen(tesd1->pb); if(result_esd->maxcb - result_esd->cb < tesd1->cb) { erc = eBufferTooSmall; break; } strcpy(&result_esd->pb[result_esd->cb],tesd1->pb); result_esd->cb += tesd1->cb; break; default: erc = eInvalidFunction; break; } /* end of keyword lookup erc switch statement */ esd_null_terminate(result_esd); esdfree(tesd1); if(tesd2) esdfree(tesd2); return(erc);} /* end of feval_str() *//* vi: set tabstop=4 shiftwidth=4: *//* end of feval.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -