Annotation of capa/capa51/pProj/capaFunction.c, revision 1.1
1.1 ! albertel 1:
! 2: /* =||>>================================================================<<||= */
! 3: /* 45678901234567890123456789012345678901234567890123456789012345678901234567 */
! 4: /* copyrighted by Isaac Tsai, 1996, 1997, 1998, 1999, 2000 */
! 5: /* =||>>================================================================<<||= */
! 6:
! 7: #include <stdlib.h>
! 8: #include <string.h>
! 9: #include <math.h>
! 10:
! 11: #include "capaParser.h" /* Symbol_p */
! 12: #include "capaFunction.h" /* RANDOM_F etc. */
! 13: #include "capaToken.h"
! 14: #include "capaCommon.h"
! 15: #include "ranlib.h"
! 16:
! 17:
! 18: char Parse_class[QUARTER_K];
! 19: int Parse_set;
! 20: int Parse_section;
! 21: char Parse_student_number[MAX_STUDENT_NUMBER+1];
! 22: char Parse_name[MAX_NAME_CHAR+1];
! 23: long capaid_plus_gen;
! 24:
! 25: extern int Parsemode_f;
! 26:
! 27: extern int Lexi_qnum;
! 28: extern char Opened_filename[MAX_OPENED_FILE][QUARTER_K];
! 29: extern int Input_idx;
! 30: extern int Current_line[MAX_OPENED_FILE];
! 31:
! 32: extern int Func_idx;
! 33: extern Symbol FuncStack[MAX_FUNC_NEST];
! 34:
! 35: /* --------------------------------------------------------------------------- */
! 36: int
! 37: match_function(func, argc) char *func; int argc;
! 38: {
! 39: if( !strcmp(func,"random") ) return (((argc==2 || argc==3)? RANDOM_F : MIS_ARG_COUNT));
! 40: if( !strcmp(func,"choose") ) return (CHOOSE_F);
! 41: if( !strcmp(func,"tex") ) return (((argc==2)? TEX_F: MIS_ARG_COUNT));
! 42: if( !strcmp(func,"var_in_tex") ) return (VAR_IN_TEX_F);
! 43: if( !strcmp(func,"html") ) return (((argc==1)? HTML_F: MIS_ARG_COUNT));
! 44: if( !strcmp(func,"web") ) return (((argc==3)? WEB_F: MIS_ARG_COUNT));
! 45: if( !strcmp(func,"pin") ) return (((argc<2)? PIN_F: MIS_ARG_COUNT));
! 46: if( !strcmp(func,"capa_id") ) return (((argc<2)? PIN_F: MIS_ARG_COUNT));
! 47: if( !strcmp(func,"class") ) return (((argc==0)? CLASS_F: MIS_ARG_COUNT));
! 48: if( !strcmp(func,"section") ) return (((argc==0)? SECTION_F: MIS_ARG_COUNT));
! 49: if( !strcmp(func,"set") ) return (((argc==0)? SET_F: MIS_ARG_COUNT));
! 50: if( !strcmp(func,"problem") ) return (((argc==0)? PROBLEM_F: MIS_ARG_COUNT));
! 51: if( !strcmp(func,"name") ) return (((argc==0)? NAME_F: MIS_ARG_COUNT));
! 52: if( !strcmp(func,"student_number") ) return (((argc==0)? SNUMBER_F: MIS_ARG_COUNT));
! 53: if( !strcmp(func,"due_date") ) return (((argc<2)? DUE_DATE_F: MIS_ARG_COUNT));
! 54: if( !strcmp(func,"due_day") ) return (((argc<2)? DUE_DAY_F: MIS_ARG_COUNT));
! 55: if( !strcmp(func,"open_date") ) return (((argc<2)? OPEN_DATE_F: MIS_ARG_COUNT));
! 56: if( !strcmp(func,"answer_date") ) return (((argc<2)? ANSWER_DATE_F: MIS_ARG_COUNT));
! 57: if( !strcmp(func,"to_string") ) return (((argc==1 || argc==2)? TO_STRING_F: MIS_ARG_COUNT));
! 58: if( !strcmp(func,"sub_string") ) return (((argc==2 || argc==3)? SUB_STRING_F: MIS_ARG_COUNT));
! 59: if( !strcmp(func,"strlen") ) return (((argc==1)? STRLEN_F: MIS_ARG_COUNT));
! 60: if( !strcmp(func,"get_seed") ) return (((argc==0)? GET_SEED_F: MIS_ARG_COUNT));
! 61: if( !strcmp(func,"set_seed") ) return (((argc==1)? SET_SEED_F: MIS_ARG_COUNT));
! 62: if( !strcmp(func,"array_index") ) return (((argc==1)? ARRAY_INDEX_F: MIS_ARG_COUNT));
! 63: if( !strcmp(func,"array_sorted_index") ) return (((argc==2)? ARRAY_SORTED_INDEX_F: MIS_ARG_COUNT));
! 64: if( !strcmp(func,"array_max") ) return (((argc==1)? ARRAY_MAX_F: MIS_ARG_COUNT));
! 65: if( !strcmp(func,"array_min") ) return (((argc==1)? ARRAY_MIN_F: MIS_ARG_COUNT));
! 66: if( !strcmp(func,"array_moments") ) return (((argc==2)? ARRAY_MOMENTS_F: MIS_ARG_COUNT));
! 67: if( !strcmp(func,"array_var") ) return (((argc==1)? ARRAY_VARIANCE_F: MIS_ARG_COUNT));
! 68: if( !strcmp(func,"array_std_dev") ) return (((argc==1)? ARRAY_STD_DEV_F: MIS_ARG_COUNT));
! 69: if( !strcmp(func,"array_skewness") ) return (((argc==1)? ARRAY_SKEWNESS_F: MIS_ARG_COUNT));
! 70: if( !strcmp(func,"to_int") ) return (((argc==1)? TO_INT_F: MIS_ARG_COUNT));
! 71: if( !strcmp(func,"format") ) return (FORMAT_F);
! 72: if( !strcmp(func,"pick") ) return (((argc> 1)? PICK_F: MIS_ARG_COUNT));
! 73: if( !strcmp(func,"sin") ) return (((argc==1)? SIN_F: MIS_ARG_COUNT));
! 74: if( !strcmp(func,"cos") ) return (((argc==1)? COS_F: MIS_ARG_COUNT));
! 75: if( !strcmp(func,"tan") ) return (((argc==1)? TAN_F: MIS_ARG_COUNT));
! 76: if( !strcmp(func,"asin") ) return (((argc==1)? ASIN_F: MIS_ARG_COUNT));
! 77: if( !strcmp(func,"acos") ) return (((argc==1)? ACOS_F: MIS_ARG_COUNT));
! 78: if( !strcmp(func,"atan") ) return (((argc==1)? ATAN_F: MIS_ARG_COUNT));
! 79: if( !strcmp(func,"sinh") ) return (((argc==1)? SINH_F: MIS_ARG_COUNT));
! 80: if( !strcmp(func,"cosh") ) return (((argc==1)? COSH_F: MIS_ARG_COUNT));
! 81: if( !strcmp(func,"tanh") ) return (((argc==1)? TANH_F: MIS_ARG_COUNT));
! 82: if( !strcmp(func,"asinh") ) return (((argc==1)? ASINH_F: MIS_ARG_COUNT));
! 83: if( !strcmp(func,"acosh") ) return (((argc==1)? ACOSH_F: MIS_ARG_COUNT));
! 84: if( !strcmp(func,"atanh") ) return (((argc==1)? ATANH_F: MIS_ARG_COUNT));
! 85: if( !strcmp(func,"atan2") ) return (((argc==2)? ATANTWO_F: MIS_ARG_COUNT));
! 86: if( !strcmp(func,"j0") ) return (((argc==1)? J_ZERO_F: MIS_ARG_COUNT));
! 87: if( !strcmp(func,"j1") ) return (((argc==1)? J_ONE_F: MIS_ARG_COUNT));
! 88: if( !strcmp(func,"jn") ) return (((argc==2)? J_N_F: MIS_ARG_COUNT));
! 89: if( !strcmp(func,"y0") ) return (((argc==1)? Y_ZERO_F: MIS_ARG_COUNT));
! 90: if( !strcmp(func,"y1") ) return (((argc==1)? Y_ONE_F: MIS_ARG_COUNT));
! 91: if( !strcmp(func,"yn") ) return (((argc==2)? Y_N_F: MIS_ARG_COUNT));
! 92: if( !strcmp(func,"log") ) return (((argc==1)? LOG_F: MIS_ARG_COUNT));
! 93: if( !strcmp(func,"log10") ) return (((argc==1)? LOG_TEN_F: MIS_ARG_COUNT));
! 94: if( !strcmp(func,"exp") ) return (((argc==1)? EXP_F: MIS_ARG_COUNT));
! 95: if( !strcmp(func,"pow") ) return (((argc==2)? POW_F: MIS_ARG_COUNT));
! 96: if( !strcmp(func,"erf") ) return (((argc==1)? ERF_F: MIS_ARG_COUNT));
! 97: if( !strcmp(func,"erfc") ) return (((argc==1)? ERFC_F: MIS_ARG_COUNT));
! 98: if( !strcmp(func,"sqrt") ) return (((argc==1)? SQRT_F: MIS_ARG_COUNT));
! 99: if( !strcmp(func,"min") ) return (MIN_F);
! 100: if( !strcmp(func,"max") ) return (MAX_F);
! 101: if( !strcmp(func,"abs") ) return (((argc==1)? ABS_F: MIS_ARG_COUNT));
! 102: if( !strcmp(func,"floor") ) return (((argc==1)? FLOOR_F: MIS_ARG_COUNT));
! 103: if( !strcmp(func,"ceil") ) return (((argc==1)? CEIL_F: MIS_ARG_COUNT));
! 104: if( !strcmp(func,"sgn") ) return (((argc==1)? SGN_F: MIS_ARG_COUNT));
! 105: if( !strcmp(func,"mod") ) return (((argc==2)? MOD_F: MIS_ARG_COUNT));
! 106: if( !strcmp(func,"remainder") ) return (((argc==2)? REMAINDER_F: MIS_ARG_COUNT));
! 107: if( !strcmp(func,"factorial") ) return (((argc==1)? FACTORIAL_F: MIS_ARG_COUNT));
! 108: if( !strcmp(func,"roundto") ) return (((argc==2)? ROUNDTO_F: MIS_ARG_COUNT));
! 109: if( !strcmp(func,"eval_formula") ) return (((argc==3)? EVALUATE_F: MIS_ARG_COUNT));
! 110: if( !strcmp(func,"capa_id_plus") ) return (((argc==1 || argc==2)? CAPAID_PLUS: MIS_ARG_COUNT));
! 111: if( !strcmp(func,"seat_number") ) return (((argc <2)? SEAT_NUMBER: MIS_ARG_COUNT));
! 112: if( !strcmp(func,"duration") ) return (((argc==0)? DURATION: MIS_ARG_COUNT));
! 113: if( !strcmp(func,"is_open") ) return (((argc <2)? IS_OPEN_F: MIS_ARG_COUNT));
! 114: if( !strcmp(func,"is_due") ) return (((argc <2)? IS_DUE_F: MIS_ARG_COUNT));
! 115: if( !strcmp(func,"is_answer") ) return (((argc <2)? IS_ANSWER_F: MIS_ARG_COUNT));
! 116: return (UNKNOWN_F);
! 117: }
! 118:
! 119: /**********************************************************/
! 120:
! 121:
! 122: #ifdef SGN
! 123: #undef SGN
! 124: #endif
! 125: #define SGN(xx) ( (xx) > 0 ? 1 : ( (xx) == 0 ? 0 : -1) )
! 126:
! 127:
! 128: #define MAX_DOUBLE 1.7976931348623157E+308
! 129: #define MIN_DOUBLE 2.2250738585072014E-308
! 130:
! 131: #define INT_DIV 0
! 132: #define REAL_DIV 1
! 133: #define INT_LOWER 0
! 134: #define REAL_LOWER 2
! 135: #define INT_UPPER 0
! 136: #define REAL_UPPER 4
! 137:
! 138: #define ALL_INTEGER 0
! 139:
! 140: int which_set(argc,argp,resultp)
! 141: int argc;
! 142: ArgNode_t *argp;
! 143: Symbol *resultp;
! 144: {
! 145: char aline[MAX_BUFFER_SIZE], tmpS[MAX_BUFFER_SIZE];
! 146: int result=Parse_set;
! 147: if( argc == 1 ) {
! 148: if( (FIRST_ARGTYPE(argp) == S_VAR ) ||
! 149: (FIRST_ARGTYPE(argp) == S_CONSTANT ) ) {
! 150: sprintf(aline,"<<ARG TYPE MISMATCH>>");
! 151: resultp->s_type = S_CONSTANT;
! 152: resultp->s_str = strsave(aline);
! 153: sprintf(tmpS, "function %s() cannot accept string as argument.\n",
! 154: FuncStack[Func_idx].s_name);
! 155: capa_msg(MESSAGE_ERROR,tmpS);
! 156: result=-1;
! 157: } else {
! 158: if( (FIRST_ARGTYPE(argp) == I_VAR ) ||
! 159: (FIRST_ARGTYPE(argp) == I_CONSTANT ) ) {
! 160: result = FIRST_ARGINT(argp);
! 161: } else {
! 162: result = FIRST_ARGREAL(argp);
! 163: }
! 164: }
! 165: }
! 166: return result;
! 167: }
! 168:
! 169: Symbol *
! 170: do_function(func,argc,argp)
! 171: int func;
! 172: int argc;
! 173: ArgNode_t *argp;
! 174: {
! 175: Symbol *resultp;
! 176: ArgNode_t *tmpArgp;
! 177: char aline[MAX_BUFFER_SIZE], tmpS[MAX_BUFFER_SIZE], fmt_str[FORMAT_STRING_LENG];
! 178: char num_str[SMALL_LINE_BUFFER],date_str[SMALL_LINE_BUFFER];
! 179: double tmpA=0.0, tmpB=0.0;
! 180: int slots, noError, errCode, mo, yy, dd, hh, mm, tmpInt;
! 181: long rout;
! 182: char *wday[9] = {"Sat,", "Sun,", "Mon,", "Tue,", "Wed,", "Thr,", "Fri,", "Sat,", "\0"};
! 183: char *month[SIXTEEN] = { "UNKNOWN", "Jan", "Feb", "Mar", "Apr", "May", "Jun",
! 184: "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "UNKNOWN", "UNKNOWN", "\0"};
! 185:
! 186: resultp = (Symbol *)capa_malloc(1,sizeof(Symbol));
! 187:
! 188: switch(func) {
! 189: case RANDOM_F: { int type_flag=0;
! 190: double r_lower=0.0, r_upper=1.0, r_division=1.0;
! 191:
! 192: errCode = 0; rout = ignlgi();
! 193: switch( FIRST_ARGTYPE(argp) ) {
! 194: case I_VAR: case I_CONSTANT: break;
! 195: case R_VAR: case R_CONSTANT: type_flag = (type_flag | 1); break;
! 196: case S_VAR: case S_CONSTANT: errCode = 1; break;
! 197: }
! 198: switch( SECOND_ARGTYPE(argp) ) {
! 199: case I_VAR: case I_CONSTANT: break;
! 200: case R_VAR: case R_CONSTANT: type_flag = (type_flag | 2); break;
! 201: case S_VAR: case S_CONSTANT: errCode = 2; break;
! 202: }
! 203: if( argc == 3 ) {
! 204: switch( THIRD_ARGTYPE(argp) ) {
! 205: case I_VAR: case I_CONSTANT: break;
! 206: case R_VAR: case R_CONSTANT: type_flag = (type_flag | 4); break;
! 207: case S_VAR: case S_CONSTANT: errCode = 4; break;
! 208: }
! 209: }
! 210: if( errCode == 0 ) {
! 211: if( argc == 3 ) {
! 212: switch(type_flag) {
! 213: case 0: r_division = (double)FIRST_ARGINT(argp);
! 214: r_upper = (double)SECOND_ARGINT(argp);
! 215: r_lower = (double)THIRD_ARGINT(argp); break;
! 216: case 2: r_division = (double)FIRST_ARGINT(argp);
! 217: r_upper = SECOND_ARGREAL(argp);
! 218: r_lower = (double)THIRD_ARGINT(argp); break;
! 219: case 4: r_division = (double)FIRST_ARGINT(argp);
! 220: r_upper = (double)SECOND_ARGINT(argp);
! 221: r_lower = THIRD_ARGREAL(argp); break;
! 222: case 6: r_division = (double)FIRST_ARGINT(argp);
! 223: r_upper = SECOND_ARGREAL(argp);
! 224: r_lower = THIRD_ARGREAL(argp); break;
! 225: case 1: r_division = FIRST_ARGREAL(argp);
! 226: r_upper = (double)SECOND_ARGINT(argp);
! 227: r_lower = (double)THIRD_ARGINT(argp); break;
! 228: case 3: r_division = FIRST_ARGREAL(argp);
! 229: r_upper = SECOND_ARGREAL(argp);
! 230: r_lower = (double)THIRD_ARGINT(argp); break;
! 231: case 5: r_division = FIRST_ARGREAL(argp);
! 232: r_upper = (double)SECOND_ARGINT(argp);
! 233: r_lower = THIRD_ARGREAL(argp); break;
! 234: case 7: r_division = FIRST_ARGREAL(argp);
! 235: r_upper = SECOND_ARGREAL(argp);
! 236: r_lower = THIRD_ARGREAL(argp); break;
! 237: }
! 238: } else { /* two args */
! 239: switch(type_flag) {
! 240: case 0: r_upper = (double)FIRST_ARGINT(argp);
! 241: r_lower = (double)SECOND_ARGINT(argp); break;
! 242: case 1: r_upper = FIRST_ARGREAL(argp);
! 243: r_lower = (double)SECOND_ARGINT(argp); break;
! 244: case 2: r_upper = (double)FIRST_ARGINT(argp);
! 245: r_lower = SECOND_ARGREAL(argp); break;
! 246: case 3: r_upper = FIRST_ARGREAL(argp);
! 247: r_lower = SECOND_ARGREAL(argp); break;
! 248: }
! 249: r_division = 1.0;
! 250: }
! 251: if( r_upper >= r_lower ) {
! 252: slots = 1 + (int)floor( (r_upper - r_lower)/r_division );
! 253: if( type_flag == 0 ) {
! 254: resultp->s_type = I_CONSTANT;
! 255: resultp->s_int = (int)r_lower + ((int)r_division)*(rout % slots );
! 256: } else {
! 257: resultp->s_type = R_CONSTANT;
! 258: resultp->s_real = r_lower + r_division*(double)(rout % slots );
! 259: }
! 260: } else {
! 261: resultp->s_type = S_CONSTANT;
! 262: resultp->s_str = strsave("<<2ND ARG MUST .GE. 1ST ARG>>");
! 263: sprintf(tmpS,"random()'s second arg. must be greater than the first arg.\n");
! 264: capa_msg(MESSAGE_ERROR,tmpS);
! 265: }
! 266: } else {
! 267: resultp->s_type = S_CONSTANT;
! 268: resultp->s_str = strsave("<<ARG CANNOT BE STRING>>");
! 269: sprintf(tmpS,"random() cannot accept string as argument.\n");
! 270: capa_msg(MESSAGE_ERROR,tmpS);
! 271: }
! 272: } break;
! 273: case CHOOSE_F: { int ii, pick=1;
! 274: ArgNode_t *tmpArgp;
! 275:
! 276: noError = 1;
! 277: tmpArgp = argp; ii=0;
! 278: while( ii < argc-1 ) {tmpArgp = tmpArgp->a_next; ii++; }
! 279: switch( FIRST_ARGTYPE(tmpArgp) ) {
! 280: case IDENTIFIER:
! 281: sprintf(tmpS,"The first argument to choose(): \"%s\" has not been defined yet. I will choose the first element.\n",FIRST_ARGNAME(tmpArgp));
! 282: capa_msg(MESSAGE_ERROR,tmpS);
! 283: pick = 1;
! 284: break;
! 285: case I_VAR: case I_CONSTANT:
! 286: pick = FIRST_ARGINT(tmpArgp); break;
! 287: case R_VAR: case R_CONSTANT:
! 288: pick = (int)FIRST_ARGREAL(tmpArgp);
! 289: sprintf(tmpS,"The first argument to choose() is a real number: \"%.15g\", it must be an integer, I will use %d instead.\n",FIRST_ARGREAL(tmpArgp),pick);
! 290: capa_msg(MESSAGE_ERROR,tmpS);
! 291: break;
! 292: case S_VAR: case S_CONSTANT:
! 293: resultp->s_type = S_CONSTANT;
! 294: resultp->s_str = strsave("CHOOSE: first argument must be an integer");
! 295: sprintf(tmpS,"The first argument to choose() cannot be a string, I will choose the first element.\n");
! 296: capa_msg(MESSAGE_ERROR,tmpS);
! 297: pick = 1;
! 298: break;
! 299: }
! 300: if( noError ) {
! 301: if( (pick <= 0) || (pick > argc-1) ) {
! 302: sprintf(tmpS,"The first argument to choose() is out of bounds, tt is %d, but should be in the range [1,%d].\n", pick, argc-1);
! 303: capa_msg(MESSAGE_ERROR,tmpS);
! 304: pick = argc-1;
! 305: } else { pick = argc - pick; }
! 306: for(ii=1,tmpArgp = argp;(ii < pick)&&(ii < argc-1);ii++) { tmpArgp = tmpArgp->a_next; }
! 307:
! 308: resultp->s_type = (tmpArgp->a_sp)->s_type;
! 309: switch((tmpArgp->a_sp)->s_type) {
! 310: case IDENTIFIER:
! 311: sprintf(tmpS,"The variable \"%s\" selected by choose() has not yet been defined.\n",(tmpArgp->a_sp)->s_name);
! 312: capa_msg(MESSAGE_ERROR,tmpS);
! 313: resultp->s_type = S_CONSTANT;
! 314: resultp->s_str = strsave(tmpS);
! 315: break;
! 316: case I_VAR: case I_CONSTANT:
! 317: resultp->s_type = I_CONSTANT;
! 318: resultp->s_int = (tmpArgp->a_sp)->s_int; break;
! 319: case R_VAR: case R_CONSTANT:
! 320: resultp->s_type = R_CONSTANT;
! 321: resultp->s_real = (tmpArgp->a_sp)->s_real; break;
! 322: case S_VAR: case S_CONSTANT:
! 323: resultp->s_type = S_CONSTANT;
! 324: resultp->s_str = strsave((tmpArgp->a_sp)->s_str); break; /********* */
! 325: }
! 326:
! 327: }
! 328:
! 329: } break;
! 330: case PIN_F: {
! 331: if (-1==(tmpInt=which_set(argc,argp,resultp))) break;
! 332: resultp->s_type = I_CONSTANT;
! 333: resultp->s_int=capa_PIN(Parse_student_number,tmpInt,0);
! 334: }
! 335: break;
! 336: case CLASS_F: {
! 337: resultp->s_type = S_CONSTANT;
! 338: if(strlen(Parse_class) != 0 ) {
! 339: resultp->s_str=strsave(Parse_class);
! 340: } else {
! 341: resultp->s_str=strsave("UNKNOWN");
! 342: }
! 343: }
! 344: break;
! 345: case SECTION_F:{ resultp->s_type = I_CONSTANT;
! 346: resultp->s_int = Parse_section;
! 347: } break;
! 348: case PROBLEM_F:{ resultp->s_type = I_CONSTANT;
! 349: resultp->s_int= Lexi_qnum+1;
! 350: } break;
! 351: case SET_F: { resultp->s_type = I_CONSTANT;
! 352: resultp->s_int=Parse_set;
! 353: } break;
! 354: case NAME_F: {
! 355: resultp->s_type = S_CONSTANT;
! 356: resultp->s_str=strsave(Parse_name);
! 357: } break;
! 358: case SNUMBER_F: {
! 359: resultp->s_type = S_CONSTANT;
! 360: resultp->s_str=strsave(Parse_student_number);
! 361: } break;
! 362: case IS_DUE_F:
! 363: case IS_ANSWER_F:
! 364: case IS_OPEN_F: {
! 365: int whichDate=CHECK_OPEN_DATE;
! 366: if (-1==(tmpInt=which_set(argc,argp,resultp))) break;
! 367: resultp->s_type = I_CONSTANT;
! 368: switch(func) {
! 369: case IS_OPEN_F: whichDate=CHECK_OPEN_DATE;break;
! 370: case IS_DUE_F: whichDate=CHECK_DUE_DATE;break;
! 371: case IS_ANSWER_F: whichDate=CHECK_ANS_DATE;break;
! 372: }
! 373: if( capa_check_date(whichDate,Parse_student_number,
! 374: Parse_section,tmpInt) < 0 ) {
! 375: resultp->s_int = 0;
! 376: } else {
! 377: resultp->s_int = 1;
! 378: }
! 379: } break;
! 380: case DUE_DATE_F:
! 381: { if (-1==(tmpInt=which_set(argc,argp,resultp))) break;
! 382: resultp->s_type = S_CONSTANT;
! 383: if(capa_get_date(CHECK_DUE_DATE,Parse_student_number,Parse_section,tmpInt,date_str) > 0 ) {
! 384: sscanf(date_str,"%4d/%2d/%2d %2d:%2d",&yy, &mo, &dd, &hh, &mm);
! 385: sprintf(aline, "%s %s %2d, %4d at %02d:%02d",
! 386: wday[weekday(yy,mo,dd)], month[mo], dd, yy, hh, mm);
! 387: resultp->s_str= strsave(aline);
! 388: } else {
! 389: resultp->s_str= strsave("UNKNOWN");
! 390: }
! 391: } break;
! 392: case DUE_DAY_F:
! 393: { if (-1==(tmpInt=which_set(argc,argp,resultp))) break;
! 394: resultp->s_type = S_CONSTANT;
! 395: if(capa_get_date(CHECK_DUE_DATE,Parse_student_number,Parse_section,tmpInt,date_str) > 0 ) {
! 396: sscanf(date_str,"%4d/%2d/%2d %2d:%2d",&yy, &mm, &dd, &hh, &mm);
! 397: sprintf(aline, "%s %s %2d, %4d",
! 398: wday[weekday(yy,mo,dd)], month[mo], dd, yy);
! 399: resultp->s_str= strsave(aline);
! 400: } else {
! 401: resultp->s_str= strsave("UNKNOWN");
! 402: }
! 403: } break;
! 404: case OPEN_DATE_F:
! 405: { if (-1==(tmpInt=which_set(argc,argp,resultp))) break;
! 406: resultp->s_type = S_CONSTANT;
! 407: if(capa_get_date(CHECK_OPEN_DATE,Parse_student_number,Parse_section,tmpInt,date_str) > 0 ) {
! 408: sscanf(date_str,"%4d/%2d/%2d %2d:%2d",&yy, &mm, &dd, &hh, &mm);
! 409: sprintf(aline, "%s %s %2d, %4d at %02d:%02d",
! 410: wday[weekday(yy,mo,dd)], month[mo], dd, yy, hh, mm);
! 411: resultp->s_str= strsave(aline);
! 412: } else {
! 413: resultp->s_str= strsave("UNKNOWN");
! 414: }
! 415: } break;
! 416: case ANSWER_DATE_F:
! 417: { if (-1==(tmpInt=which_set(argc,argp,resultp))) break;
! 418: resultp->s_type = S_CONSTANT;
! 419: if(capa_get_date(CHECK_ANS_DATE,Parse_student_number,Parse_section,tmpInt,date_str) > 0 ) {
! 420: sscanf(date_str,"%4d/%2d/%2d %2d:%2d",&yy, &mo, &dd, &hh, &mm);
! 421: sprintf(aline, "%s %s %2d, %4d at %02d:%02d",
! 422: wday[weekday(yy,mo,dd)], month[mo], dd, yy, hh, mm);
! 423: resultp->s_str= strsave(aline);
! 424: } else {
! 425: resultp->s_str= strsave("UNKNOWN");
! 426: }
! 427: } break;
! 428: case STRLEN_F: {
! 429: resultp->s_type = I_CONSTANT;
! 430: switch( FIRST_ARGTYPE(argp) ) {
! 431: case I_VAR:
! 432: case I_CONSTANT:
! 433: resultp->s_type = S_CONSTANT;
! 434: sprintf(tmpS,"strlen() only accepts string variable, not integer.\n");
! 435: capa_msg(MESSAGE_ERROR,tmpS);
! 436: resultp->s_str=strsave(tmpS);
! 437: break;
! 438: case R_VAR:
! 439: case R_CONSTANT:
! 440: resultp->s_type = S_CONSTANT;
! 441: sprintf(tmpS,"strlen() only accepts string variable, not float number.\n");
! 442: capa_msg(MESSAGE_ERROR,tmpS);
! 443: resultp->s_str=strsave(tmpS);
! 444: break;
! 445: case S_VAR:
! 446: case S_CONSTANT:
! 447: resultp->s_int = strlen( FIRST_ARGSTR(argp) );
! 448: break;
! 449: case IDENTIFIER:
! 450: sprintf(tmpS,"Unknown variable, %s, argument to function strlen()\n",argp->a_sp->s_name);
! 451: capa_msg(MESSAGE_ERROR,tmpS);
! 452: resultp->s_str=strsave(tmpS);
! 453: break;
! 454: }
! 455: } break;
! 456: case TO_STRING_F:
! 457: { char aline[MAX_BUFFER_SIZE],rline[MAX_BUFFER_SIZE];
! 458:
! 459: resultp->s_type = S_CONSTANT;
! 460:
! 461: if( argc == 1 ) {
! 462: switch( FIRST_ARGTYPE(argp) ) {
! 463: case I_VAR:
! 464: case I_CONSTANT:
! 465: sprintf(aline,"%ld",FIRST_ARGINT(argp));
! 466: resultp->s_str = strsave(aline); break;
! 467: case R_VAR:
! 468: case R_CONSTANT:
! 469: sprintf(aline,"%.15g",FIRST_ARGREAL(argp));
! 470: resultp->s_str = strsave(aline); break;
! 471: case S_VAR:
! 472: case S_CONSTANT:
! 473: resultp->s_str = strsave(FIRST_ARGSTR(argp)); break;
! 474: case IDENTIFIER:
! 475: sprintf(tmpS,"Unknown variable, %s, argument to function to_string()\n",argp->a_sp->s_name);
! 476: capa_msg(MESSAGE_ERROR,tmpS);
! 477: resultp->s_str=strsave(tmpS);
! 478: break;
! 479: }
! 480: } else {
! 481: switch( FIRST_ARGTYPE(argp) ) {
! 482: case I_VAR:
! 483: case I_CONSTANT:
! 484: case R_VAR:
! 485: case R_CONSTANT:
! 486: sprintf(tmpS,
! 487: "to_string()'s second arg. must be a string.\n");
! 488: capa_msg(MESSAGE_ERROR,tmpS);
! 489: sprintf(aline,"%%.15g");
! 490: break;
! 491: case S_VAR:
! 492: case S_CONSTANT:
! 493: sprintf(aline,"%%%s",FIRST_ARGSTR(argp));
! 494: break;
! 495: case IDENTIFIER:
! 496: sprintf(tmpS,"Unknown variable, %s, argument to function to_string()\n",argp->a_next->a_sp->s_name);
! 497: capa_msg(MESSAGE_ERROR,tmpS);
! 498: resultp->s_str=strsave(tmpS);
! 499: break;
! 500:
! 501: }
! 502: switch( SECOND_ARGTYPE(argp) ) {
! 503: case I_VAR:
! 504: case I_CONSTANT:
! 505: sprintf(aline,"%ld",SECOND_ARGINT(argp));
! 506: resultp->s_str = strsave(aline); break;
! 507: case R_VAR:
! 508: case R_CONSTANT:
! 509: sprintf(rline,aline,SECOND_ARGREAL(argp));
! 510: resultp->s_str = strsave(rline); break;
! 511: case S_VAR:
! 512: case S_CONSTANT:
! 513: resultp->s_str = strsave(SECOND_ARGSTR(argp));
! 514: break;
! 515: case IDENTIFIER:
! 516: sprintf(tmpS,"Unknown variable, %s, argument to function to_string()\n",argp->a_sp->s_name);
! 517: capa_msg(MESSAGE_ERROR,tmpS);
! 518: resultp->s_str=strsave(tmpS);
! 519: break;
! 520: }
! 521: }
! 522: } break;
! 523: case SUB_STRING_F: /* sub_string(str, 2), 1 is the first char */
! 524: /* sub_string(str, 3, 5) means start from the third char and take 5 chars */
! 525: { int idx=1, leng, rleng=0,ii;
! 526: char *a_str, *b_str;
! 527:
! 528: resultp->s_type = S_CONSTANT;
! 529: if( argc == 2 ) { /* two arguments format */
! 530: switch( FIRST_ARGTYPE(argp) ) {
! 531: case IDENTIFIER:
! 532: sprintf(tmpS,
! 533: "sub_string()'s second arg. must be an integer.\n");
! 534: capa_msg(MESSAGE_ERROR,tmpS);
! 535: break;
! 536: case I_VAR:
! 537: case I_CONSTANT:
! 538: idx = FIRST_ARGINT(argp);
! 539: break;
! 540: case R_VAR:
! 541: case R_CONSTANT:
! 542: idx = (int) FIRST_ARGREAL(argp);
! 543: break;
! 544: case S_VAR:
! 545: case S_CONSTANT:
! 546: sprintf(tmpS,
! 547: "sub_string()'s second arg. must be an integer.\n");
! 548: capa_msg(MESSAGE_ERROR,tmpS);
! 549: break;
! 550: }
! 551: switch( SECOND_ARGTYPE(argp) ) {
! 552: case IDENTIFIER:
! 553: sprintf(tmpS,
! 554: "sub_string()'s first arg. is not defined before use.\n");
! 555: capa_msg(MESSAGE_ERROR,tmpS);
! 556: break;
! 557: case I_VAR:
! 558: case I_CONSTANT:
! 559: sprintf(tmpS,
! 560: "sub_string()'s first arg. cannot be an integer.\n");
! 561: capa_msg(MESSAGE_ERROR,tmpS);
! 562: break;
! 563: case R_VAR:
! 564: case R_CONSTANT:
! 565: sprintf(tmpS,
! 566: "sub_string()'s first arg. cannot be a number.\n");
! 567: capa_msg(MESSAGE_ERROR,tmpS);
! 568: break;
! 569: case S_VAR:
! 570: case S_CONSTANT:
! 571: a_str = SECOND_ARGSTR(argp);
! 572: leng = strlen(a_str);
! 573: if( (idx<1) || (idx > leng) ) {
! 574: sprintf(tmpS, "sub_string()'s second arg. is out of range.\n");
! 575: capa_msg(MESSAGE_ERROR,tmpS);
! 576: idx = 1;
! 577: }
! 578: b_str = (char *)&a_str[idx-1];
! 579: resultp->s_str = strsave(b_str);
! 580:
! 581: if( SECOND_ARGTYPE(argp) == S_CONSTANT) {
! 582: /* freed in free arg_list */
! 583: /* capa_mfree((char *)SECOND_ARGSTR(argp)); */
! 584: }
! 585: break;
! 586: }
! 587: } else { /* three arguments format sub_string(string, start, length) */
! 588: switch( FIRST_ARGTYPE(argp) ) {
! 589: case IDENTIFIER:
! 590: sprintf(tmpS,
! 591: "sub_string()'s third arg. must be an integer.\n");
! 592: capa_msg(MESSAGE_ERROR,tmpS);
! 593: break;
! 594: case I_VAR:
! 595: case I_CONSTANT:
! 596: rleng = FIRST_ARGINT(argp);
! 597: break;
! 598: case R_VAR:
! 599: case R_CONSTANT:
! 600: rleng = (int) FIRST_ARGREAL(argp);
! 601: break;
! 602: case S_VAR:
! 603: case S_CONSTANT:
! 604: sprintf(tmpS,
! 605: "sub_string()'s third arg. must be an integer.\n");
! 606: capa_msg(MESSAGE_ERROR,tmpS);
! 607: break;
! 608: }
! 609: switch( SECOND_ARGTYPE(argp) ) {
! 610: case IDENTIFIER:
! 611: sprintf(tmpS,
! 612: "sub_string()'s second arg. must be an integer.\n");
! 613: capa_msg(MESSAGE_ERROR,tmpS);
! 614: break;
! 615: case I_VAR:
! 616: case I_CONSTANT:
! 617: idx = SECOND_ARGINT(argp);
! 618: break;
! 619: case R_VAR:
! 620: case R_CONSTANT:
! 621: idx = (int) SECOND_ARGREAL(argp);
! 622: break;
! 623: case S_VAR:
! 624: case S_CONSTANT:
! 625: sprintf(tmpS,
! 626: "sub_string()'s second arg. must be an integer.\n");
! 627: capa_msg(MESSAGE_ERROR,tmpS);
! 628: break;
! 629: }
! 630: switch( THIRD_ARGTYPE(argp) ) {
! 631: case IDENTIFIER:
! 632: sprintf(tmpS,
! 633: "sub_string()'s first arg. is not defined before use.\n");
! 634: capa_msg(MESSAGE_ERROR,tmpS);
! 635: break;
! 636: case I_VAR:
! 637: case I_CONSTANT:
! 638: sprintf(tmpS,
! 639: "sub_string()'s first arg. cannot be an integer.\n");
! 640: capa_msg(MESSAGE_ERROR,tmpS);
! 641: break;
! 642: case R_VAR:
! 643: case R_CONSTANT:
! 644: sprintf(tmpS,
! 645: "sub_string()'s first arg. cannot be a number.\n");
! 646: capa_msg(MESSAGE_ERROR,tmpS);
! 647: break;
! 648: case S_VAR:
! 649: case S_CONSTANT:
! 650: a_str = THIRD_ARGSTR(argp);
! 651: leng = strlen(a_str);
! 652: if( (idx < 1) || (idx > leng) ) {
! 653: sprintf(tmpS, "sub_string()'s second arg. is out of range.\n");
! 654: capa_msg(MESSAGE_ERROR,tmpS);
! 655: idx = 1;
! 656: }
! 657: if( (rleng<1) || ((rleng+idx-1) > leng)) {
! 658:
! 659: rleng = leng - idx + 1;
! 660: }
! 661: b_str = (char *)capa_malloc((rleng+1)*sizeof(char),1);
! 662: for(ii=idx-1;ii<(rleng+idx-1);ii++) {
! 663: b_str[ii-idx+1] = a_str[ii];
! 664: }
! 665: resultp->s_str = strsave(b_str);
! 666: capa_mfree(b_str);
! 667:
! 668: if( THIRD_ARGTYPE(argp) == S_CONSTANT) {
! 669: /* handled in free_arglist() */
! 670: /* capa_mfree((char *)THIRD_ARGSTR(argp)); */
! 671: }
! 672: break;
! 673: }
! 674: }
! 675: } break;
! 676: case PICK_F: { int ii, pick=1;
! 677: ArgNode_t *tmpArgp;
! 678:
! 679: noError = 1;
! 680: rout = ignlgi();
! 681: tmpArgp = argp; ii=0;
! 682: while( ii < argc-1 ) {tmpArgp = tmpArgp->a_next; ii++; }
! 683: switch( FIRST_ARGTYPE(tmpArgp) ) {
! 684: case I_VAR:
! 685: case I_CONSTANT:
! 686: pick = FIRST_ARGINT(tmpArgp);
! 687: if( (pick <= 0 ) || (pick > argc-1) ) {
! 688: noError = 0;
! 689: resultp->s_type = S_CONSTANT;
! 690: resultp->s_str = strsave("PICK: first arg out of bound.");
! 691: }
! 692: break;
! 693: case R_VAR:
! 694: case R_CONSTANT:
! 695: pick = (int)FIRST_ARGREAL(tmpArgp);
! 696: if( (pick <= 0 ) || (pick > argc-1) ) {
! 697: noError = 0;
! 698: resultp->s_type = S_CONSTANT;
! 699: resultp->s_str = strsave("PICK: first arg out of bound.");
! 700: }
! 701: break;
! 702: case S_VAR:
! 703: case S_CONSTANT: noError = 0;
! 704: resultp->s_type = S_CONSTANT;
! 705: resultp->s_str = strsave("PICK: first arg must be int");
! 706: break;
! 707: }
! 708: if( noError ) {
! 709: for( ii=0; ii< pick; ii++) {
! 710: }
! 711: }
! 712: }
! 713: break;
! 714: case GET_SEED_F:
! 715: { long seed1, seed2;
! 716: char *tmp;
! 717:
! 718: getsd(&seed1,&seed2);
! 719: tmp = (char *)capa_malloc(32,1);
! 720: sprintf(tmp,"%ld,%ld",seed1,seed2);
! 721: resultp->s_type = S_CONSTANT;
! 722: resultp->s_str = strsave(tmp);
! 723: capa_mfree(tmp);
! 724: } break;
! 725: case SET_SEED_F:
! 726: { long seed1, seed2;
! 727: int leng;
! 728:
! 729: switch( FIRST_ARGTYPE(argp) ) {
! 730: case I_VAR: case I_CONSTANT: break;
! 731: case R_VAR: case R_CONSTANT: break;
! 732: case S_VAR: case S_CONSTANT:
! 733: leng = strlen(FIRST_ARGSTR(argp));
! 734: if( (index(FIRST_ARGSTR(argp), ' ') != NULL) ) {
! 735: sscanf(FIRST_ARGSTR(argp),"%ld,%ld", &seed1, &seed2);
! 736: setall(seed1,seed2);
! 737: }
! 738:
! 739: break;
! 740: }
! 741: resultp->s_type = I_CONSTANT;
! 742: resultp->s_int = 0;
! 743: } break;
! 744: case ARRAY_MOMENTS_F: /* it */
! 745: {
! 746: char *tmp_input;
! 747: Symbol *r_p;
! 748:
! 749: switch( FIRST_ARGTYPE(argp) ) {
! 750: case I_VAR: case I_CONSTANT:
! 751: case R_VAR: case R_CONSTANT:
! 752: resultp->s_type = S_CONSTANT;
! 753: resultp->s_str = strsave("<<ARG. OF THIS FUNCTION MUST BE AN ARRAY NAME>>");
! 754: sprintf(tmpS,"array_moments()'s arg. must be a name of an array.\n");
! 755: capa_msg(MESSAGE_ERROR,tmpS);
! 756: errCode = 1;
! 757: break;
! 758: case S_VAR: case S_CONSTANT:
! 759: tmp_input = strsave(FIRST_ARGSTR(argp));
! 760: errCode = 0;
! 761: break;
! 762: case IDENTIFIER:
! 763: tmp_input = strsave(FIRST_ARGNAME(argp));
! 764: errCode = 0;
! 765: break;
! 766: }
! 767: if( errCode == 0 ) {
! 768: switch( SECOND_ARGTYPE(argp) ) {
! 769: case I_VAR: case I_CONSTANT:
! 770: case R_VAR: case R_CONSTANT:
! 771: resultp->s_type = S_CONSTANT;
! 772: resultp->s_str = strsave("<<ARG. OF THIS FUNCTION MUST BE AN ARRAY NAME>>");
! 773: sprintf(tmpS,"array_moments()'s arg. must be a name of an array.\n");
! 774: capa_msg(MESSAGE_ERROR,tmpS);
! 775: errCode = 1;
! 776: break;
! 777: case S_VAR: case S_CONSTANT:
! 778: r_p = array_moments(SECOND_ARGSTR(argp),tmp_input);
! 779: capa_mfree((char *)tmp_input);
! 780: /* fprintf(stdout,"DONE array_moments()\n"); fflush(stdout); */
! 781: break;
! 782: case IDENTIFIER:
! 783: r_p = array_moments(SECOND_ARGNAME(argp),tmp_input);
! 784: capa_mfree((char *)tmp_input);
! 785:
! 786: break;
! 787: }
! 788: if(errCode == 0 ) {
! 789: capa_mfree((char *)resultp);
! 790: resultp = r_p;
! 791: }
! 792: }
! 793:
! 794: } break;
! 795: case ARRAY_SORTED_INDEX_F: /* array_sorted_index(array_name_str, sort_type) */
! 796: {
! 797: switch( FIRST_ARGTYPE(argp) ) {
! 798: case I_VAR: case I_CONSTANT:
! 799: switch( FIRST_ARGINT(argp) ) {
! 800: case ASCEND_SORT: break;
! 801: case DESCEND_SORT: break;
! 802: case NUMERICAL_SORT: break;
! 803: default: break;
! 804: }
! 805:
! 806: break;
! 807: case R_VAR: case R_CONSTANT: break;
! 808: case S_VAR: case S_CONSTANT:
! 809:
! 810:
! 811: break;
! 812: }
! 813: resultp->s_type = S_CONSTANT;
! 814: resultp->s_str = strsave("NOT YET");
! 815: } break;
! 816:
! 817: case ARRAY_MAX_F:
! 818: case ARRAY_MIN_F:
! 819: { int min;
! 820: Symbol *r_p;
! 821:
! 822: min = ((func==ARRAY_MIN_F)? 1 : 0);
! 823: switch( FIRST_ARGTYPE(argp) ) {
! 824: case I_VAR: case I_CONSTANT:
! 825: case R_VAR: case R_CONSTANT:
! 826: resultp->s_type = S_CONSTANT;
! 827: resultp->s_str = strsave("<<ARG. OF THIS FUNCTION MUST BE AN ARRAY NAME>>");
! 828: sprintf(tmpS,"%s()'s arg. must be a name of an array.\n",(min ? "min" : "max"));
! 829: capa_msg(MESSAGE_ERROR,tmpS);
! 830: break;
! 831: case S_VAR: case S_CONSTANT: /* this allows the use of min(array[1]) which array[1]="another" */
! 832: r_p = array_min_max(FIRST_ARGSTR(argp),min);
! 833: if( r_p == NULL ) { /* array name is not in array tree */
! 834: resultp->s_type = S_CONSTANT;
! 835: resultp->s_str = strsave("<<STRING ARRAY NAME IS NOT YET DEFINED!>>");
! 836: } else {
! 837: /*
! 838: fprintf(stdout,"min_max():: STR arg. R=%g\n",r_p->s_real); fflush(stdout);
! 839: */
! 840: capa_mfree((char *)resultp);
! 841: resultp = r_p;
! 842: }
! 843: break;
! 844: case IDENTIFIER:
! 845: r_p = array_min_max(FIRST_ARGNAME(argp),min);
! 846: if( r_p == NULL ) { /* array name is not in array tree */
! 847: /* fprintf(stdout,"min_max() return NULL\n"); fflush(stdout); */
! 848: resultp->s_type = S_CONSTANT;
! 849: resultp->s_str = strsave("<<ARRAY NAME IS NOT YET DEFINED!>>");
! 850: } else {
! 851: /*
! 852: fprintf(stdout,"min_max():: ID arg. R=%g\n",r_p->s_real); fflush(stdout);
! 853: */
! 854: capa_mfree((char *)resultp);
! 855: resultp = r_p;
! 856: }
! 857: break;
! 858: }
! 859: } break;
! 860: case SIN_F:
! 861: case COS_F:
! 862: case TAN_F:
! 863: case ASIN_F:
! 864: case ACOS_F:
! 865: case ATAN_F:
! 866: case SINH_F:
! 867: case COSH_F:
! 868: case TANH_F:
! 869: case ASINH_F:
! 870: case ACOSH_F:
! 871: case ATANH_F:
! 872: case J_ZERO_F:
! 873: case J_ONE_F:
! 874: case Y_ZERO_F:
! 875: case Y_ONE_F:
! 876: case LOG_F:
! 877: case LOG_TEN_F:
! 878: case EXP_F:
! 879: case ERF_F:
! 880: case ERFC_F:
! 881: case ABS_F:
! 882: case SQRT_F:
! 883: case FLOOR_F:
! 884: case CEIL_F:
! 885: case SGN_F:{ if( (FIRST_ARGTYPE(argp) == S_VAR ) || (FIRST_ARGTYPE(argp) == S_CONSTANT ) ) {
! 886: sprintf(aline,"<<ARG TYPE MISMATCH>>");
! 887: resultp->s_type = S_CONSTANT;
! 888: resultp->s_str = strsave(aline);
! 889: sprintf(tmpS,"function %s() cannot accept string as argument.\n", FuncStack[Func_idx].s_name);
! 890: capa_msg(MESSAGE_ERROR,tmpS);
! 891: } else {
! 892: if( (FIRST_ARGTYPE(argp) == I_VAR ) || (FIRST_ARGTYPE(argp) == I_CONSTANT ) ) {
! 893: tmpA = (double)FIRST_ARGINT(argp);
! 894: } else {
! 895: tmpA = (double)FIRST_ARGREAL(argp);
! 896: }
! 897: resultp->s_type = R_CONSTANT;
! 898: switch(func) {
! 899: case SIN_F: resultp->s_real = sin(tmpA); break;
! 900: case COS_F: resultp->s_real = cos(tmpA); break;
! 901: case TAN_F: resultp->s_real = tan(tmpA); break;
! 902: case ASIN_F: if(fabs(tmpA) <= 1.0) {
! 903: resultp->s_real = asin(tmpA);
! 904: } else {
! 905: resultp->s_type = S_CONSTANT;
! 906: sprintf(aline,"<<ARG OUT OF BOUND>>");
! 907: resultp->s_str = strsave(aline);
! 908: sprintf(tmpS, "asin()'s arg. is not in the range of [-1.0,+1.0].\n");
! 909: capa_msg(MESSAGE_ERROR,tmpS);
! 910: }
! 911: break;
! 912: case ACOS_F: if(fabs(tmpA) <= 1.0) {
! 913: resultp->s_real = acos(tmpA);
! 914: } else {
! 915: resultp->s_type = S_CONSTANT;
! 916: sprintf(aline,"<<ARG OUT OF BOUND>>");
! 917: resultp->s_str = strsave(aline);
! 918: sprintf(tmpS,"acos()'s arg. is not in the range of [-1.0,+1.0].\n");
! 919: capa_msg(MESSAGE_ERROR,tmpS);
! 920: }
! 921: break;
! 922: case ATAN_F: resultp->s_real = atan(tmpA); break;
! 923: case SINH_F: resultp->s_real = sinh(tmpA); break;
! 924: case COSH_F: resultp->s_real = cosh(tmpA); break;
! 925: case TANH_F: resultp->s_real = tanh(tmpA); break;
! 926: case ASINH_F: resultp->s_real = asinh(tmpA); break;
! 927: case ACOSH_F: resultp->s_real = acosh(tmpA); break;
! 928: case ATANH_F: resultp->s_real = atanh(tmpA); break;
! 929: case J_ZERO_F: resultp->s_real = j0(tmpA); break;
! 930: case J_ONE_F: resultp->s_real = j1(tmpA); break;
! 931: case Y_ZERO_F: resultp->s_real = y0(tmpA); break;
! 932: case Y_ONE_F: resultp->s_real = y1(tmpA); break;
! 933: case LOG_F: resultp->s_real = log(tmpA); break;
! 934: case LOG_TEN_F: resultp->s_real = log10(tmpA); break;
! 935: case EXP_F: resultp->s_real = exp(tmpA); break;
! 936: case ERF_F: resultp->s_real = erf(tmpA); break;
! 937: case ERFC_F: resultp->s_real = erfc(tmpA); break;
! 938: case ABS_F: resultp->s_real = fabs(tmpA); break;
! 939: case SQRT_F: if( tmpA >= 0.0) {
! 940: resultp->s_real = sqrt(tmpA);
! 941: } else {
! 942: resultp->s_type = S_CONSTANT;
! 943: sprintf(aline,"<<ARG OUT OF BOUND>>");
! 944: resultp->s_str = strsave(aline);
! 945: sprintf(tmpS, "sqrt()'s arg. is not in the range of [0.0,+Inf].\n");
! 946: capa_msg(MESSAGE_ERROR,tmpS);
! 947: }
! 948: break;
! 949: case FLOOR_F: resultp->s_type = I_CONSTANT;
! 950: resultp->s_int = (long)floor(tmpA); break;
! 951: case CEIL_F: resultp->s_type = I_CONSTANT;
! 952: resultp->s_int = (long)ceil(tmpA); break;
! 953: case SGN_F: resultp->s_type = I_CONSTANT;
! 954: resultp->s_int = (int)SGN(tmpA); break;
! 955: }
! 956: }
! 957: }
! 958: break;
! 959: case ATANTWO_F:
! 960: case J_N_F:
! 961: case Y_N_F:
! 962: case POW_F: { noError = 1;
! 963: switch(FIRST_ARGTYPE(argp)) {
! 964: case I_VAR:
! 965: case I_CONSTANT: tmpA = (double)FIRST_ARGINT(argp); break;
! 966: case R_VAR:
! 967: case R_CONSTANT: tmpA = FIRST_ARGREAL(argp); break;
! 968: case S_VAR:
! 969: case S_CONSTANT: noError = 0;
! 970: resultp->s_str = strsave("<<MIS TYPE>>");
! 971: sprintf(tmpS,"%s()'s second arg. cannot be string.\n",FuncStack[Func_idx].s_name);
! 972: capa_msg(MESSAGE_ERROR,tmpS);
! 973: break;
! 974: }
! 975: switch(SECOND_ARGTYPE(argp)) {
! 976: case I_VAR:
! 977: case I_CONSTANT: tmpB = (double)SECOND_ARGINT(argp); break;
! 978: case R_VAR:
! 979: case R_CONSTANT: tmpB = SECOND_ARGREAL(argp); break;
! 980: case S_VAR:
! 981: case S_CONSTANT: noError = 0;
! 982: resultp->s_str = strsave("<<MIS TYPE>>");
! 983: sprintf(tmpS,"%s()'s first arg. cannot be string.\n",FuncStack[Func_idx].s_name);
! 984: capa_msg(MESSAGE_ERROR,tmpS);
! 985: break;
! 986: }
! 987: if ( POW_F == func ) {
! 988: if ((!(((double)((int)tmpA)) == tmpA)) && (tmpB < 0.0)) {
! 989: resultp->s_str = strsave("<<ARG OUT OF BOUND>>");
! 990: sprintf(tmpS,
! 991: "%s()'s arguments would result in a complex number.\n",
! 992: FuncStack[Func_idx].s_name);
! 993: capa_msg(MESSAGE_ERROR,tmpS);
! 994: noError=0;
! 995: }
! 996: }
! 997: if(noError) {
! 998: resultp->s_type = R_CONSTANT;
! 999: switch( func ) {
! 1000: case J_N_F: resultp->s_real = jn((int)tmpB, tmpA); break;
! 1001: case Y_N_F: resultp->s_real = yn((int)tmpB, tmpA); break;
! 1002: case POW_F: resultp->s_real = pow(tmpB, tmpA); break;
! 1003: case ATANTWO_F: resultp->s_real = atan2(tmpB, tmpA); break;
! 1004: }
! 1005: }else {
! 1006: resultp->s_type = S_CONSTANT;
! 1007: }
! 1008:
! 1009: }
! 1010: break;
! 1011: case TEX_F: { if (Parsemode_f != TeX_MODE) {
! 1012: resultp->s_type = FIRST_ARGTYPE(argp);
! 1013: switch(FIRST_ARGTYPE(argp)) {
! 1014: case I_VAR:
! 1015: case I_CONSTANT: resultp->s_int = FIRST_ARGINT(argp); break;
! 1016: case R_VAR:
! 1017: case R_CONSTANT: resultp->s_real = FIRST_ARGREAL(argp); break;
! 1018: case S_VAR:
! 1019: case S_CONSTANT: resultp->s_str = strsave(FIRST_ARGSTR(argp)); break;
! 1020: }
! 1021: } else {
! 1022: resultp->s_type = SECOND_ARGTYPE(argp);
! 1023: switch(SECOND_ARGTYPE(argp)) {
! 1024: case I_VAR:
! 1025: case I_CONSTANT: resultp->s_int = SECOND_ARGINT(argp); break;
! 1026: case R_VAR:
! 1027: case R_CONSTANT: resultp->s_real = SECOND_ARGREAL(argp); break;
! 1028: case S_VAR:
! 1029: case S_CONSTANT: resultp->s_str = strsave(SECOND_ARGSTR(argp)); break;
! 1030: }
! 1031: }
! 1032: } break;
! 1033: case VAR_IN_TEX_F:{
! 1034:
! 1035: if (Parsemode_f == TeX_MODE) {
! 1036: resultp->s_type = FIRST_ARGTYPE(argp);
! 1037:
! 1038: switch(FIRST_ARGTYPE(argp)) {
! 1039: case I_VAR:
! 1040: case I_CONSTANT: resultp->s_int = FIRST_ARGINT(argp); break;
! 1041: case R_VAR:
! 1042: case R_CONSTANT: resultp->s_real = FIRST_ARGREAL(argp); break;
! 1043: case S_VAR:
! 1044: case S_CONSTANT: resultp->s_str = strsave(FIRST_ARGSTR(argp)); break;
! 1045: }
! 1046: } else {
! 1047: resultp->s_type = S_CONSTANT;
! 1048: resultp->s_str = strsave("");
! 1049:
! 1050: }
! 1051: } break;
! 1052: case HTML_F: { if (Parsemode_f == HTML_MODE) {
! 1053: resultp->s_type = FIRST_ARGTYPE(argp);
! 1054: switch(FIRST_ARGTYPE(argp)) {
! 1055: case I_VAR:
! 1056: case I_CONSTANT: resultp->s_int = FIRST_ARGINT(argp); break;
! 1057: case R_VAR:
! 1058: case R_CONSTANT: resultp->s_real = FIRST_ARGREAL(argp); break;
! 1059: case S_VAR:
! 1060: case S_CONSTANT: resultp->s_str = strsave(FIRST_ARGSTR(argp)); break;
! 1061: }
! 1062: } else {
! 1063: resultp->s_type = S_CONSTANT;
! 1064: resultp->s_str = strsave("");
! 1065: }
! 1066: /* printf("HTML:%s\n",resultp->s_str); */
! 1067: } break;
! 1068: case WEB_F:
! 1069: case FORMAT_F: { /* web(ASCII,TeX,HTML) */
! 1070: if( argc == 3 ) {
! 1071: switch(Parsemode_f) {
! 1072: case HTML_MODE: {
! 1073: resultp->s_type = FIRST_ARGTYPE(argp);
! 1074: switch(FIRST_ARGTYPE(argp)) {
! 1075: case I_VAR:
! 1076: case I_CONSTANT: resultp->s_int = FIRST_ARGINT(argp); break;
! 1077: case R_VAR:
! 1078: case R_CONSTANT: resultp->s_real = FIRST_ARGREAL(argp); break;
! 1079: case S_VAR:
! 1080: case S_CONSTANT: resultp->s_str = strsave(FIRST_ARGSTR(argp)); break;
! 1081: }
! 1082: } break;
! 1083: case TeX_MODE: {
! 1084: resultp->s_type = SECOND_ARGTYPE(argp);
! 1085: switch(SECOND_ARGTYPE(argp)) {
! 1086: case I_VAR:
! 1087: case I_CONSTANT: resultp->s_int = SECOND_ARGINT(argp); break;
! 1088: case R_VAR:
! 1089: case R_CONSTANT: resultp->s_real = SECOND_ARGREAL(argp); break;
! 1090: case S_VAR:
! 1091: case S_CONSTANT: resultp->s_str = strsave(SECOND_ARGSTR(argp)); break;
! 1092: }
! 1093: } break;
! 1094: default: {
! 1095: resultp->s_type = THIRD_ARGTYPE(argp);
! 1096: switch(THIRD_ARGTYPE(argp)) {
! 1097: case I_VAR:
! 1098: case I_CONSTANT: resultp->s_int = THIRD_ARGINT(argp); break;
! 1099: case R_VAR:
! 1100: case R_CONSTANT: resultp->s_real = THIRD_ARGREAL(argp); break;
! 1101: case S_VAR:
! 1102: case S_CONSTANT: resultp->s_str = strsave(THIRD_ARGSTR(argp)); break;
! 1103: }
! 1104: } break;
! 1105: }
! 1106: } else { /* argc == 2 */
! 1107: switch(Parsemode_f) {
! 1108: case TeX_MODE: {
! 1109: resultp->s_type = FIRST_ARGTYPE(argp);
! 1110: switch(FIRST_ARGTYPE(argp)) {
! 1111: case I_VAR:
! 1112: case I_CONSTANT: resultp->s_int = FIRST_ARGINT(argp); break;
! 1113: case R_VAR:
! 1114: case R_CONSTANT: resultp->s_real = FIRST_ARGREAL(argp); break;
! 1115: case S_VAR:
! 1116: case S_CONSTANT: resultp->s_str = strsave(FIRST_ARGSTR(argp)); break;
! 1117: }
! 1118: } break;
! 1119: default : {
! 1120: resultp->s_type = SECOND_ARGTYPE(argp);
! 1121: switch(SECOND_ARGTYPE(argp)) {
! 1122: case I_VAR:
! 1123: case I_CONSTANT: resultp->s_int = SECOND_ARGINT(argp); break;
! 1124: case R_VAR:
! 1125: case R_CONSTANT: resultp->s_real = SECOND_ARGREAL(argp); break;
! 1126: case S_VAR:
! 1127: case S_CONSTANT: resultp->s_str = strsave(SECOND_ARGSTR(argp)); break;
! 1128: }
! 1129: } break;
! 1130: }
! 1131: }
! 1132: } break;
! 1133: case FACTORIAL_F: {
! 1134: int ii;
! 1135: unsigned long long l_fac;
! 1136: double d_fac;
! 1137:
! 1138: switch(FIRST_ARGTYPE(argp)) {
! 1139: case I_VAR:
! 1140: case I_CONSTANT: {
! 1141: if( FIRST_ARGINT(argp) < 0 ) {
! 1142: sprintf(aline,"<<FACTORIAL ERROR>>");
! 1143: resultp->s_type = S_CONSTANT;
! 1144: resultp->s_str = strsave(aline);
! 1145: sprintf(tmpS,"%s()'s arg. cannot be less than zero.\n",FuncStack[Func_idx].s_name);
! 1146: capa_msg(MESSAGE_ERROR,tmpS);
! 1147: } else {
! 1148: if( FIRST_ARGINT(argp) <= 20 ) {
! 1149: resultp->s_type = I_CONSTANT;
! 1150: l_fac = 1;
! 1151: for(ii=2; ii <= FIRST_ARGINT(argp); ii++) { l_fac *= ii; }
! 1152: resultp->s_int = l_fac;
! 1153: } else {
! 1154: resultp->s_type = R_CONSTANT;
! 1155: d_fac = 362880.0;
! 1156: for(ii=10; ii <= FIRST_ARGINT(argp); ii++) { d_fac *= ii; }
! 1157: resultp->s_real = d_fac;
! 1158: }
! 1159: }
! 1160: }
! 1161: break;
! 1162: case R_VAR:
! 1163: case R_CONSTANT: {
! 1164: if( FIRST_ARGREAL(argp) < 0.0 ) {
! 1165: sprintf(aline,"<<FACTORIAL ERROR>>");
! 1166: resultp->s_type = S_CONSTANT;
! 1167: resultp->s_str = strsave(aline);
! 1168: sprintf(tmpS,"%s()'s arg. cannot be less than zero.\n", FuncStack[Func_idx].s_name);
! 1169: capa_msg(MESSAGE_ERROR,tmpS);
! 1170: } else {
! 1171: if( FIRST_ARGREAL(argp) <= 20.0 ) {
! 1172: resultp->s_type = I_CONSTANT;
! 1173: l_fac = 1;
! 1174: for(ii=2; ii <= FIRST_ARGREAL(argp); ii++) { l_fac *= ii; }
! 1175: resultp->s_int = l_fac;
! 1176: } else {
! 1177: resultp->s_type = R_CONSTANT;
! 1178: d_fac = 362880.0;
! 1179: for(ii=10; ii <= FIRST_ARGREAL(argp); ii++) { d_fac *= ii; }
! 1180: resultp->s_real = d_fac;
! 1181: }
! 1182: }
! 1183: }
! 1184: break;
! 1185: case S_VAR:
! 1186: case S_CONSTANT: {
! 1187: sprintf(aline,"<<FACTORIAL ERROR>>");
! 1188: resultp->s_type = S_CONSTANT;
! 1189: resultp->s_str = strsave(aline);
! 1190: sprintf(tmpS,"%s()'s arg. cannot be of string type.\n",FuncStack[Func_idx].s_name);
! 1191: capa_msg(MESSAGE_ERROR,tmpS);
! 1192: }
! 1193: break;
! 1194: }
! 1195: } break;
! 1196: case MOD_F: break;
! 1197: case REMAINDER_F: break;
! 1198: case MAX_F:
! 1199: case MIN_F: { int ii, idx, type;
! 1200:
! 1201: tmpArgp = argp;
! 1202: tmpA = ((func == MIN_F)? MAX_DOUBLE : - MAX_DOUBLE);
! 1203: type = R_CONSTANT; idx = -1;
! 1204: noError = 1;
! 1205: for(ii = 0; (ii < argc)&&(noError); ii++) {
! 1206: switch (FIRST_ARGTYPE(tmpArgp)) {
! 1207: case I_VAR:
! 1208: case I_CONSTANT:
! 1209: if( type == S_CONSTANT) {
! 1210: sprintf(aline,"<<ARG TYPE>>");
! 1211: resultp->s_type = S_CONSTANT;
! 1212: resultp->s_str = strsave(aline);
! 1213: sprintf(tmpS,"%s()'s arg. type cannot mix string with int or real.\n",FuncStack[Func_idx].s_name);
! 1214: capa_msg(MESSAGE_ERROR,tmpS);
! 1215: noError = 0;
! 1216: } else {
! 1217: switch(func) {
! 1218: case MIN_F:
! 1219: if( tmpA <= FIRST_ARGINT(tmpArgp) ) {
! 1220: } else {
! 1221: idx = ii; type = I_CONSTANT;
! 1222: tmpA = (double)FIRST_ARGINT(tmpArgp);
! 1223: }
! 1224: break;
! 1225: case MAX_F:
! 1226: if( tmpA >= FIRST_ARGINT(tmpArgp) ) {
! 1227: } else {
! 1228: idx = ii; type = I_CONSTANT;
! 1229: tmpA = (double)FIRST_ARGINT(tmpArgp);
! 1230: }
! 1231: break;
! 1232: }
! 1233: }
! 1234: break;
! 1235: case R_VAR:
! 1236: case R_CONSTANT:
! 1237: if( type == S_CONSTANT ) {
! 1238: sprintf(aline,"<<ARG TYPE>>");
! 1239: resultp->s_type = S_CONSTANT;
! 1240: resultp->s_str = strsave(aline);
! 1241: sprintf(tmpS,"%s()'s arg. type cannot mix string with int or real.\n",FuncStack[Func_idx].s_name);
! 1242: capa_msg(MESSAGE_ERROR,tmpS);
! 1243: noError = 0;
! 1244: } else {
! 1245: switch(func) {
! 1246: case MIN_F:
! 1247: if( tmpA <= FIRST_ARGREAL(tmpArgp) ) {
! 1248: } else {
! 1249: idx = ii; type = R_CONSTANT;
! 1250: tmpA = FIRST_ARGREAL(tmpArgp);
! 1251: }
! 1252: break;
! 1253: case MAX_F:
! 1254: if( tmpA >= FIRST_ARGREAL(tmpArgp) ) {
! 1255: } else {
! 1256: idx = ii; type = R_CONSTANT;
! 1257: tmpA = FIRST_ARGREAL(tmpArgp);
! 1258: }
! 1259: break;
! 1260: }
! 1261: }
! 1262: break;
! 1263: case S_VAR:
! 1264: case S_CONSTANT:
! 1265: if( (ii != 0)&&(type != S_CONSTANT) ) {
! 1266: sprintf(aline,"<<ARG TYPE>>");
! 1267: resultp->s_type = S_CONSTANT;
! 1268: resultp->s_str = strsave(aline);
! 1269: sprintf(tmpS," %s()'s arg. type cannot mix string with int or real.\n",FuncStack[Func_idx].s_name);
! 1270: capa_msg(MESSAGE_ERROR,tmpS);
! 1271: noError = 0;
! 1272: } else {
! 1273: if( ii == 0 ) { idx = 0; strcpy(tmpS, FIRST_ARGSTR(tmpArgp)); }
! 1274: type = S_CONSTANT;
! 1275: switch( func) {
! 1276: case MIN_F:
! 1277: if( strcmp(tmpS, FIRST_ARGSTR(tmpArgp)) <= 0 ) {
! 1278: } else {
! 1279: idx = ii;
! 1280: strcpy(tmpS, FIRST_ARGSTR(tmpArgp));
! 1281: }
! 1282: break;
! 1283: case MAX_F:
! 1284: if( strcmp(tmpS, FIRST_ARGSTR(tmpArgp)) >= 0 ) {
! 1285: } else {
! 1286: idx = ii;
! 1287: strcpy(tmpS, FIRST_ARGSTR(tmpArgp));
! 1288: }
! 1289: break;
! 1290: }
! 1291: }
! 1292: break;
! 1293: }
! 1294: tmpArgp = tmpArgp->a_next;
! 1295: }
! 1296: if( noError ) {
! 1297: for(tmpArgp=argp,ii=0; ii<idx; ii++) { tmpArgp=tmpArgp->a_next; }
! 1298: resultp->s_type = type;
! 1299: switch(type) {
! 1300: case I_CONSTANT: resultp->s_int = (tmpArgp->a_sp)->s_int;
! 1301: break;
! 1302: case R_CONSTANT: resultp->s_real = (tmpArgp->a_sp)->s_real;
! 1303: break;
! 1304: case S_CONSTANT: resultp->s_str = strsave((tmpArgp->a_sp)->s_str);
! 1305: break;
! 1306: }
! 1307: }
! 1308:
! 1309: }
! 1310: break;
! 1311: case ROUNDTO_F: {
! 1312: noError = 1; hh = 0; /* reuse integer hh and mm */
! 1313: switch(FIRST_ARGTYPE(argp)) {
! 1314: case I_VAR:
! 1315: case I_CONSTANT: mm = FIRST_ARGINT(argp); break;
! 1316: case R_VAR:
! 1317: case R_CONSTANT: mm = (int)FIRST_ARGREAL(argp); break;
! 1318: case S_VAR:
! 1319: case S_CONSTANT: noError = 0;
! 1320: resultp->s_type = S_CONSTANT;
! 1321: resultp->s_str = strsave("<<MIS TYPE>>");
! 1322: sprintf(tmpS,
! 1323: "%s()'s second arg. cannot be string.\n",FuncStack[Func_idx].s_name);
! 1324: capa_msg(MESSAGE_ERROR,tmpS);
! 1325: break;
! 1326: }
! 1327: switch(SECOND_ARGTYPE(argp)) {
! 1328: case I_VAR:
! 1329: case I_CONSTANT: hh = SECOND_ARGINT(argp); break;
! 1330: case R_VAR:
! 1331: case R_CONSTANT: tmpA = SECOND_ARGREAL(argp); break;
! 1332: case S_VAR:
! 1333: case S_CONSTANT: noError = 0;
! 1334: resultp->s_type = S_CONSTANT;
! 1335: resultp->s_str = strsave("<<MIS TYPE>>");
! 1336: sprintf(tmpS,
! 1337: "%s()'s first arg. cannot be string.\n",
! 1338: FuncStack[Func_idx].s_name);
! 1339: capa_msg(MESSAGE_ERROR,tmpS);
! 1340: break;
! 1341: }
! 1342: if(noError) {
! 1343: resultp->s_type = R_CONSTANT;
! 1344: if( hh != 0 ) {
! 1345: resultp->s_type = I_CONSTANT;
! 1346: resultp->s_int = hh;
! 1347: } else {
! 1348: if ( mm >= 0 ) {
! 1349: sprintf(fmt_str,"%%.%df",mm);
! 1350: sprintf(num_str,fmt_str,tmpA);
! 1351: tmpB = atof(num_str);
! 1352: resultp->s_real = tmpB;
! 1353: } else {
! 1354: sprintf(tmpS,"%s()'s second arg. cannot be negative (%d).\n",
! 1355: FuncStack[Func_idx].s_name,mm);
! 1356: capa_msg(MESSAGE_ERROR,tmpS);
! 1357: resultp->s_real = tmpA; /* not changed */
! 1358: }
! 1359: }
! 1360: }
! 1361: } break;
! 1362: case EVALUATE_F: { char *f_str, *v_str, *pt_str, *out_come;
! 1363: noError = 1;
! 1364: switch(FIRST_ARGTYPE(argp)) { /* now only accepts string like "0.0,0.1,0.2,0.3,0.4,0.5" */
! 1365: case I_VAR:
! 1366: case I_CONSTANT: noError = 0;
! 1367: resultp->s_type = S_CONSTANT;
! 1368: resultp->s_str = strsave("<<Evaulate Formula: Pts TYPE incorrect>>");
! 1369: sprintf(tmpS,
! 1370: "%s()'s third arg. cannot be integer.\n",FuncStack[Func_idx].s_name);
! 1371: capa_msg(MESSAGE_ERROR,tmpS);
! 1372: break;
! 1373: case R_VAR:
! 1374: case R_CONSTANT: noError = 0;
! 1375: resultp->s_type = S_CONSTANT;
! 1376: resultp->s_str = strsave("<<Evaulate Formula: Pts TYPE incorrect>>");
! 1377: sprintf(tmpS,
! 1378: "%s()'s third arg. cannot be integer.\n",FuncStack[Func_idx].s_name);
! 1379: capa_msg(MESSAGE_ERROR,tmpS);
! 1380: break;
! 1381: case S_VAR:
! 1382: case S_CONSTANT:
! 1383: pt_str = FIRST_ARGSTR(argp);
! 1384: break;
! 1385: }
! 1386: switch(SECOND_ARGTYPE(argp)) {
! 1387: case I_VAR:
! 1388: case I_CONSTANT:
! 1389: case R_VAR:
! 1390: case R_CONSTANT: noError = 0;
! 1391: resultp->s_type = S_CONSTANT;
! 1392: resultp->s_str = strsave("<<Evaluate Formula: Var list TYPE incorrect>>");
! 1393: sprintf(tmpS,
! 1394: "%s()'s second arg. cannot be number.\n",FuncStack[Func_idx].s_name);
! 1395: capa_msg(MESSAGE_ERROR,tmpS);
! 1396: break;
! 1397:
! 1398: case S_VAR:
! 1399: case S_CONSTANT: v_str = SECOND_ARGSTR(argp);
! 1400: break;
! 1401: }
! 1402: switch(THIRD_ARGTYPE(argp)) {
! 1403: case I_VAR:
! 1404: case I_CONSTANT:
! 1405: case R_VAR:
! 1406: case R_CONSTANT: noError = 0;
! 1407: resultp->s_type = S_CONSTANT;
! 1408: resultp->s_str = strsave("<<Evaluate Formula: Formula TYPE incorrect>>");
! 1409: sprintf(tmpS,
! 1410: "%s()'s first arg. cannot be number.\n",FuncStack[Func_idx].s_name);
! 1411: capa_msg(MESSAGE_ERROR,tmpS);
! 1412: break;
! 1413: case S_VAR:
! 1414: case S_CONSTANT: f_str = THIRD_ARGSTR(argp);
! 1415: break;
! 1416: }
! 1417: if(noError) {
! 1418: resultp->s_type = S_CONSTANT;
! 1419: /* printf("EVALUATE:::%s,%s,%s\n",f_str, v_str, pt_str); */
! 1420: out_come = eval_formula_range_str(f_str, v_str, pt_str);
! 1421: if( !out_come ) {
! 1422: resultp->s_str = strsave("<<Evaluate formula:: NULL>>");
! 1423: sprintf(tmpS,
! 1424: "%s() cannot evaluate the formula correctly.\n",FuncStack[Func_idx].s_name);
! 1425: capa_msg(MESSAGE_ERROR,tmpS);
! 1426: } else {
! 1427: resultp->s_str = out_come;
! 1428: }
! 1429: }
! 1430: }
! 1431: break;
! 1432: case CAPAID_PLUS:
! 1433: {
! 1434: extern Problem_t* FirstProblem_p;
! 1435: extern Problem_t* LexiProblem_p;
! 1436: Problem_t* problem;
! 1437: int num_char,pin;
! 1438: errCode = 0;
! 1439: if (argc==1) {
! 1440: switch( FIRST_ARGTYPE(argp) ) {
! 1441: case I_VAR: case I_CONSTANT: num_char=FIRST_ARGINT(argp); break;
! 1442: case R_VAR: case R_CONSTANT: errCode = 1; break;
! 1443: case S_VAR: case S_CONSTANT: errCode = 1; break;
! 1444: }
! 1445: } else {
! 1446: switch( SECOND_ARGTYPE(argp) ) {
! 1447: case I_VAR: case I_CONSTANT: num_char=SECOND_ARGINT(argp); break;
! 1448: case R_VAR: case R_CONSTANT: errCode = 1; break;
! 1449: case S_VAR: case S_CONSTANT: errCode = 1; break;
! 1450: }
! 1451: }
! 1452:
! 1453: if( errCode == 0 ) {
! 1454: if ( FirstProblem_p ) {
! 1455: problem=FirstProblem_p;
! 1456: } else {
! 1457: problem=LexiProblem_p;
! 1458: }
! 1459: if (!(problem->capaidplus)) capa_mfree(problem->capaidplus);
! 1460: if (-1==(tmpInt=which_set(argc-1,argp,resultp))) break;
! 1461: pin=capa_PIN(Parse_student_number,tmpInt,0);
! 1462: problem->capaidplus = capa_id_plus(Parse_student_number,
! 1463: tmpInt,num_char);
! 1464: resultp->s_type = S_CONSTANT;
! 1465: resultp->s_str = strsave(problem->capaidplus);
! 1466: } else {
! 1467: resultp->s_type = S_CONSTANT;
! 1468: resultp->s_str = strsave("<<INCORRECT ARGS TO CAPAID_PLUS>>");
! 1469: }
! 1470: }
! 1471: break;
! 1472: case SEAT_NUMBER:
! 1473: {
! 1474: int filenum;
! 1475: double filedoub;
! 1476: char *filename;
! 1477: if ( argc == 1 ) {
! 1478: switch( FIRST_ARGTYPE(argp)) {
! 1479: case I_VAR: case I_CONSTANT: filenum=FIRST_ARGINT(argp);
! 1480: filename=capa_malloc(TMP_LINE_LENGTH,1);
! 1481: sprintf(filename,"%d",filenum);
! 1482: break;
! 1483: case R_VAR: case R_CONSTANT: filedoub=FIRST_ARGREAL(argp);
! 1484: filename=capa_malloc(TMP_LINE_LENGTH,1);
! 1485: sprintf(filename,"%f",filedoub);
! 1486: break;
! 1487: case S_VAR: case S_CONSTANT:
! 1488: filename=strsave(FIRST_ARGSTR(argp)); break;
! 1489: }
! 1490: } else {
! 1491: filename=NULL;
! 1492: }
! 1493: resultp->s_type = S_CONSTANT;
! 1494: resultp->s_str = capa_get_seat(Parse_student_number,filename);
! 1495: if ( filename != NULL ) capa_mfree(filename);
! 1496: break;
! 1497: }
! 1498: case DURATION: { resultp->s_type = I_CONSTANT;
! 1499: resultp->s_int=capa_get_duration(Parse_student_number,
! 1500: Parse_section,Parse_set);
! 1501: } break;
! 1502: case MIS_ARG_COUNT:
! 1503: { resultp->s_type = S_CONSTANT;
! 1504: resultp->s_str = strsave("<<ARG COUNT>>");
! 1505: sprintf(tmpS,"%s()'s arg. count is not correct.\n",FuncStack[Func_idx].s_name);
! 1506: capa_msg(MESSAGE_ERROR,tmpS);
! 1507: } break;
! 1508: case UNKNOWN_F:
! 1509: default: { resultp->s_type = S_CONSTANT;
! 1510: resultp->s_str = strsave("<<UNKNOWN FUNCTION>>");
! 1511: sprintf(tmpS,"%s() unknown.\n",FuncStack[Func_idx].s_name);
! 1512: capa_msg(MESSAGE_ERROR,tmpS);
! 1513:
! 1514: } break;
! 1515: }
! 1516:
! 1517: return (resultp);
! 1518: }
! 1519:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>