From: Jorge G. <cl...@us...> - 2007-05-31 00:03:43
|
Update of /cvsroot/easycalc/easycalc/mlib In directory sc8-pr-cvs17:/tmp/cvs-serv21040 Modified Files: cmatrix.c funcs.c matrix.c slist.c Log Message: improved list and matrix use referring: -------------- - list[i] (or list[i:i]) returns the i-th element of a list - list[i:k] (k!=i) returns a list with the elements from i to k of a list - matrix[m:n] returns the element of the m-th row and n-th column of matrix - matrix[m:.] (or matrix[m:0]) returns a list with the m-th row of a matrix - matrix[.:n] (or matrix[0:n]) returns a list with the n-th column of a matrix assignmet: -------------- - list[i]=val (or list[i:i]=val) assigns a value to the i-th element of a list andd returns the list - list[i:k]=list2 (k!=i) assigns the elements of a list2 to the elements from i to k of a list and returns the list - matrix[m:n]=val assigns a value to the (m,n) element of matrix and returns the matrix - matrix[m:.]=list (or matrix[m:0]=list) assignts the elements of a list to the m-th row of a matrix and returns the matrix - matrix[.:n]=list (or matrix[m:0]=list) assignts the elements of a list to the n-th column of a matrix and returns the matrix Index: cmatrix.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/cmatrix.c,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** cmatrix.c 28 Sep 2006 13:24:20 -0000 1.28 --- cmatrix.c 31 May 2007 00:03:37 -0000 1.29 *************** *** 1221,1239 **** cmatrix_item(Functype *func, CodeStack *stack) { - UInt32 row,col; CError err; - Complex result; CMatrix *m; ! if (func->paramcount == 3){ ! err = stack_get_val(stack, &col, integer); ! if (err) ! return err; ! } ! else{ ! if (func->paramcount != 2) ! return c_badargcount; ! col=1; ! } err = stack_get_val(stack, &row, integer); --- 1221,1234 ---- cmatrix_item(Functype *func, CodeStack *stack) { CError err; CMatrix *m; + UInt32 row,col; ! if (func->paramcount != 3) ! return c_badargcount; ! ! err = stack_get_val(stack, &col, integer); ! if (err) ! return err; err = stack_get_val(stack, &row, integer); *************** *** 1245,1274 **** return err; ! if (col > m->cols || row > m->rows || col == 0 || row == 0){ cmatrix_delete(m); return c_baddim; } ! if (func->paramcount == 2){ ! List *lresult; ! int i; ! ! lresult = list_new(m->cols); ! if(!lresult){ ! cmatrix_delete(m); ! return c_memory; ! } ! ! for(i=0;i<m->cols;i++){ ! lresult->item[i] = MATRIX(m,row-1,i); ! } ! err = stack_add_val(stack,&lresult,list); ! list_delete(lresult); ! } else{ ! result = MATRIX(m,row-1,col-1); ! err = stack_add_val(stack, &result, complex); } ! cmatrix_delete(m); return err; --- 1240,1274 ---- return err; ! if ( row > m->rows || col > m->cols || (col == 0 && row==0)){ cmatrix_delete(m); return c_baddim; } ! if(col && row) ! err = stack_add_val(stack,&MATRIX(m,row-1,col-1),complex); else{ ! Int16 i; ! List *lst; ! if(row==0){ ! lst=list_new(m->rows); ! if(!lst){ ! cmatrix_delete(m); ! return c_memory; ! } ! for(i=0;i<m->rows;i++) ! lst->item[i]=MATRIX(m,i,col-1); ! }else{ ! lst=list_new(m->cols); ! if(!lst){ ! cmatrix_delete(m); ! return c_memory; ! } ! for(i=0;i<m->cols;i++) ! lst->item[i]=MATRIX(m,row-1,i); ! } ! err = stack_add_val(stack,&lst,list); ! list_delete(lst); } ! cmatrix_delete(m); return err; Index: slist.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/slist.c,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** slist.c 28 Sep 2006 13:36:31 -0000 1.36 --- slist.c 31 May 2007 00:03:37 -0000 1.37 *************** *** 735,758 **** list_item(Functype *func, CodeStack *stack) { - List *lst; CError err; ! UInt32 intarg; ! Complex result; ! err = stack_get_val(stack,&intarg,integer); ! if (err) return err; ! err = stack_get_val(stack,&lst,list); ! if (err) return err; ! if (intarg == 0 || intarg > lst->size){ list_delete(lst); return c_baddim; } ! ! result = lst->item[intarg-1]; ! err = stack_add_val(stack,&result,complex); list_delete(lst); --- 735,781 ---- list_item(Functype *func, CodeStack *stack) { CError err; ! List *lst; ! UInt32 ini,end; ! if (func->paramcount != 3) ! return c_badargcount; ! ! err = stack_get_val(stack, &end, integer); ! if (err) return err; ! err = stack_get_val(stack, &ini, integer); ! if (err) ! return err; ! ! err = stack_get_val(stack, &lst, list); ! if (err) return err; ! if ( ini==0 || end == 0 || ini > lst->size || end > lst->size){ list_delete(lst); return c_baddim; } ! ! if(ini==end){ ! if (lst->item[end-1].imag == 0.0) ! err = stack_add_val(stack,&lst->item[end-1].real,real); ! else ! err = stack_add_val(stack,&lst->item[end-1],complex); ! }else{ ! Int16 i,dif=end-ini; ! List *lst2=list_new(abs(dif)+1); ! if(!lst2){ ! list_delete(lst); ! return c_memory; ! } ! for(i=0;i<lst2->size;i++){ ! lst2->item[i]=lst->item[ini-1]; ! ini+=sgn(dif); ! } ! err = stack_add_val(stack,&lst2,list); ! list_delete(lst2); ! } list_delete(lst); Index: matrix.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/matrix.c,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** matrix.c 28 Sep 2006 13:24:20 -0000 1.32 --- matrix.c 31 May 2007 00:03:37 -0000 1.33 *************** *** 889,907 **** matrix_item(Functype *func, CodeStack *stack) { - UInt32 row,col; CError err; - double result; Matrix *m; ! if (func->paramcount == 3){ ! err = stack_get_val(stack, &col, integer); ! if (err) ! return err; ! } ! else{ ! if (func->paramcount != 2) ! return c_badargcount; ! col=1; ! } err = stack_get_val(stack, &row, integer); --- 889,902 ---- matrix_item(Functype *func, CodeStack *stack) { CError err; Matrix *m; + UInt32 row,col; ! if (func->paramcount != 3) ! return c_badargcount; ! ! err = stack_get_val(stack, &col, integer); ! if (err) ! return err; err = stack_get_val(stack, &row, integer); *************** *** 913,943 **** return err; ! if (col > m->cols || row > m->rows || col == 0 || row == 0){ matrix_delete(m); return c_baddim; } ! if (func->paramcount == 2){ ! List *lresult; ! int i; ! ! lresult = list_new(m->cols); ! if(!lresult){ ! matrix_delete(m); ! return c_memory; ! } ! ! for(i=0;i<m->cols;i++){ ! lresult->item[i].real = MATRIX(m,row-1,i); ! lresult->item[i].imag = 0.0; ! } ! err = stack_add_val(stack,&lresult,list); ! list_delete(lresult); ! } else{ ! result = MATRIX(m,row-1,col-1); ! err = stack_add_val(stack, &result, real); } ! matrix_delete(m); return err; --- 908,946 ---- return err; ! if ( row > m->rows || col > m->cols || (col == 0 && row==0)){ matrix_delete(m); return c_baddim; } ! if(col && row) ! err = stack_add_val(stack,&MATRIX(m,row-1,col-1),real); else{ ! Int16 i; ! List *lst; ! if(row==0){ ! lst=list_new(m->rows); ! if(!lst){ ! matrix_delete(m); ! return c_memory; ! } ! for(i=0;i<m->rows;i++){ ! lst->item[i].real=MATRIX(m,i,col-1); ! lst->item[i].imag=0.0; ! } ! }else{ ! lst=list_new(m->cols); ! if(!lst){ ! matrix_delete(m); ! return c_memory; ! } ! for(i=0;i<m->cols;i++){ ! lst->item[i].real=MATRIX(m,row-1,i); ! lst->item[i].imag=0.0; ! } ! } ! err = stack_add_val(stack,&lst,list); ! list_delete(lst); } ! matrix_delete(m); return err; Index: funcs.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/funcs.c,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** funcs.c 4 Oct 2006 00:39:17 -0000 1.51 --- funcs.c 31 May 2007 00:03:37 -0000 1.52 *************** *** 222,273 **** } else if (source.type == litem) { CodeStack *tstack; ! Int16 col = source.u.litemval.col; ! Int16 row = source.u.litemval.row; ! tmp = db_read_variable(source.u.litemval.name,&err); if (err) return err; ! tstack = stack_new(1); ! ! if (tmp.type == list) { ! List *lst = tmp.u.listval; ! ! if (row != 0) ! err = c_badargcount; ! else if (col == 0 || col > lst->size) ! err = c_badarg; ! else { ! if (lst->item[col-1].imag == 0.0) ! err = stack_add_val(tstack,&lst->item[col-1].real,real); ! else ! err = stack_add_val(tstack,&lst->item[col-1],complex); ! if (!err) ! *dest = stack_pop(tstack); ! } ! } else if (tmp.type == matrix) { ! Matrix *m = tmp.u.matrixval; ! ! if (row == 0 || col == 0 || ! row > m->rows || col > m->cols) ! err = c_baddim; ! else { ! err = stack_add_val(tstack,&MATRIX(m,row-1,col-1),real); ! if (!err) ! *dest = stack_pop(tstack); ! } ! } else if (tmp.type == cmatrix) { ! CMatrix *m = tmp.u.cmatrixval; ! ! if (row == 0 || col == 0 || ! row > m->rows || col > m->cols) ! err = c_baddim; ! else { ! err = stack_add_val(tstack,&MATRIX(m,row-1,col-1),complex); ! if (!err) ! *dest = stack_pop(tstack); ! } ! } else err = c_badarg; stack_delete(tstack); rpn_delete(tmp); --- 222,261 ---- } else if (source.type == litem) { CodeStack *tstack; ! Functype *func=MemPtrNew(sizeof(*func)); ! UInt32 row=source.u.litemval.row; ! UInt32 col=source.u.litemval.col; ! tmp = db_read_variable(source.u.litemval.name,&err); if (err) return err; ! ! func->paramcount=3; ! tstack = stack_new(3); ! ! if(tmp.type==list) ! err = stack_add_val(tstack,&tmp.u.listval,list); ! else if(tmp.type==matrix) ! err = stack_add_val(tstack,&tmp.u.matrixval,matrix); ! else if(tmp.type==cmatrix) ! err = stack_add_val(tstack,&tmp.u.cmatrixval,cmatrix); ! else err = c_badarg; + + if(!err) + err = stack_add_val(tstack,&row,integer); + err = stack_add_val(tstack,&col,integer); + + if(!err){ + if(tmp.type==list) + err = list_item(func,tstack); + else if(tmp.type==matrix) + err = matrix_item(func,tstack); + else + err = cmatrix_item(func,tstack); + } + if(!err) + *dest = stack_pop(tstack); + MemPtrFree(func); stack_delete(tstack); rpn_delete(tmp); *************** *** 474,524 **** Int16 col = item2.u.litemval.col; CodeStack *tstack; ! tstack = stack_new(1); stack_push(tstack,item1); ! tmp = db_read_variable(item2.u.litemval.name,&err); if (!err) { if (tmp.type == list) { List *lst = tmp.u.listval; ! if (row != 0 || col == 0 || col > lst->size) err = c_baddim; ! else { err = stack_get_val(tstack,&lst->item[col-1],complex); ! if (!err) ! db_write_variable(item2.u.litemval.name,tmp); } } else if (tmp.type == matrix) { Matrix *m = tmp.u.matrixval; ! if (row == 0 || col == 0 || ! col > m->cols || row > m->rows) err = c_baddim; ! else { ! err = stack_get_val(tstack,&MATRIX(m,row-1,col-1), ! real); ! if (!err) ! db_write_variable(item2.u.litemval.name,tmp); } } else if (tmp.type == cmatrix) { CMatrix *m = tmp.u.cmatrixval; ! if (row == 0 || col == 0 || ! col > m->cols || row > m->rows) err = c_baddim; ! else { ! err = stack_get_val(tstack,&MATRIX(m,row-1,col-1), ! complex); ! if (!err) ! db_write_variable(item2.u.litemval.name,tmp); } } else err = c_badarg; ! rpn_delete(tmp); } stack_delete(tstack); ! ! if (!err) ! stack_push(stack,item2); ! else ! rpn_delete(item2); return err; } else if (item2.type == variable) { --- 462,563 ---- Int16 col = item2.u.litemval.col; CodeStack *tstack; ! tstack = stack_new(1); stack_push(tstack,item1); ! tmp = db_read_variable(item2.u.litemval.name,&err); if (!err) { if (tmp.type == list) { List *lst = tmp.u.listval; ! if ( row==0 || col == 0 || row > lst->size || col > lst->size) err = c_baddim; ! else if(row==col){ err = stack_get_val(tstack,&lst->item[col-1],complex); ! }else{ ! List *lst2; ! err = stack_get_val(tstack,&lst2,list); ! if(!err){ ! Int16 i,dif=col-row; ! if(lst2->size != abs(dif)+1) ! err = c_baddim; ! else for(i=0;i<lst2->size;i++){ ! lst->item[row-1]=lst2->item[i]; ! row+=sgn(dif); ! } ! list_delete(lst2); ! } } + if (!err) + db_write_variable(item2.u.litemval.name,tmp); } else if (tmp.type == matrix) { Matrix *m = tmp.u.matrixval; ! if ( row > m->rows || col > m->cols || (col == 0 && row==0)) err = c_baddim; ! else if(col && row) ! err = stack_get_val(tstack,&MATRIX(m,row-1,col-1),real); ! else{ ! List *lst; ! err = stack_get_val(tstack,&lst,list); ! if(!err){ ! Int16 i; ! if(row==0){ ! if(lst->size != m->rows) ! err = c_baddim; ! for(i=0;(!err && i<m->rows);i++){ ! if(!IS_ZERO(lst->item[i].imag)) ! err = c_badarg; ! MATRIX(m,i,col-1)=lst->item[i].real; ! } ! }else{ ! if(lst->size != m->cols) ! err = c_baddim; ! for(i=0;(!err && i<m->cols);i++){ ! if(!IS_ZERO(lst->item[i].imag)) ! err = c_badarg; ! MATRIX(m,row-1,i)=lst->item[i].real; ! } ! } ! list_delete(lst); ! } } + if (!err) + db_write_variable(item2.u.litemval.name,tmp); } else if (tmp.type == cmatrix) { CMatrix *m = tmp.u.cmatrixval; ! if ( row > m->rows || col > m->cols || (col == 0 && row==0)) err = c_baddim; ! else if(col && row) ! err = stack_get_val(tstack,&MATRIX(m,row-1,col-1),complex); ! else{ ! List *lst; ! err = stack_get_val(tstack,&lst,list); ! if(!err){ ! Int16 i; ! if(row==0){ ! if(lst->size != m->rows) ! err = c_baddim; ! else for(i=0;i<m->rows;i++) ! MATRIX(m,i,col-1)=lst->item[i]; ! }else{ ! if(lst->size != m->cols) ! err = c_baddim; ! else for(i=0;i<m->cols;i++) ! MATRIX(m,row-1,i)=lst->item[i]; ! } ! list_delete(lst); ! } } + if (!err) + db_write_variable(item2.u.litemval.name,tmp); } else err = c_badarg; ! if(!err) ! /* Return all the list/matrix, not only the element(s) */ ! stack_push(stack,tmp); ! else ! rpn_delete(tmp); } stack_delete(tstack); ! rpn_delete(item2); return err; } else if (item2.type == variable) { *************** *** 1042,1069 **** func_item(Functype *func, CodeStack *stack) { ! rpntype type; CError err; ! if (func->paramcount == 2) ! err = stack_item_type(stack,&type,1); ! else if (func->paramcount == 3) ! err = stack_item_type(stack,&type,2); else err = c_badargcount; if (err) return err; ! ! switch (type){ ! case list: ! return list_item(func,stack); ! case matrix: ! return matrix_item(func,stack); ! case cmatrix: ! return cmatrix_item(func,stack); ! default: ! return c_badarg; } ! } #else /* Not specfun enabled */ CError --- 1081,1135 ---- func_item(Functype *func, CodeStack *stack) { ! rpntype type1,type2; CError err; ! err = stack_item_type(stack,&type2,(func->paramcount-1)); ! if (err) ! return err; ! ! if (func->paramcount==2 && type2==list) ! err = stack_item_type_nr(stack,&type1,1); ! else if (func->paramcount==3) ! err = stack_item_type_nr(stack,&type1,2); else err = c_badargcount; if (err) return err; ! ! if (type1 == variable) { ! UInt32 arg1=0,arg2=0; ! Trpn item,ritem; ! ! err = stack_get_val(stack,&arg2,integer); ! if (err) ! return err; ! if (func->paramcount == 3) { ! err = stack_get_val(stack,&arg1,integer); ! if (err) ! return err; ! }else ! arg1=arg2; ! ! item = stack_pop(stack); ! ritem.allocsize = 0; ! ritem.type = litem; ! StrCopy(ritem.u.litemval.name,item.u.varname); ! ritem.u.litemval.row = arg1; ! ritem.u.litemval.col = arg2; ! stack_push(stack,ritem); ! rpn_delete(item); ! } else switch (type2){ ! case list: ! return list_item(func,stack); ! case matrix: ! return matrix_item(func,stack); ! case cmatrix: ! return cmatrix_item(func,stack); ! default: ! return c_badarg; } ! return c_noerror; } + #else /* Not specfun enabled */ CError |