Changeset aca1089 in tol for toltcl/generic
- Timestamp:
- Jul 2, 2009, 1:37:55 PM (17 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- 9e3cbcf
- Parents:
- 8960892
- File:
-
- 1 edited
-
toltcl/generic/tolaccess.cpp (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
toltcl/generic/tolaccess.cpp
r8960892 raca1089 52 52 */ 53 53 54 /* #define ISFILE_IMPLEMENTED */ 54 #define ISFILE_IMPLEMENTED 55 55 56 56 typedef void (* getmethod)( const BSyntaxObject *, BText & ); … … 803 803 * {i1,i2,...,ik} 804 804 * 805 * Used by tol::forallchil 806 * 805 807 */ 806 808 … … 810 812 Tcl_Obj * obj_result) 811 813 { 812 #define ARG_SCRIPT 0813 #define ARG_GRAMMAR ARG_SCRIPT+1814 #define ARG_NAME ARG_GRAMMAR+1815 #define ARG_CONTENT ARG_NAME+1816 #define ARG_PATH ARG_CONTENT+1817 #define ARG_DESC ARG_PATH+1818 #define ARG_INDEXES ARG_DESC+1819 #define ARG_ISFILE ARG_INDEXES+1820 #define ARG_HASSUBSET ARG_ISFILE+1821 #define ARG_SUBTYPE ARG_HASSUBSET+1822 #define ARG_STRUCT ARG_SUBTYPE+1823 #define NUM_ARGS ARG_STRUCT+1824 825 814 const BSyntaxObject* container; 826 815 Tcl_DString dstr; … … 830 819 int n, index_length; 831 820 Tcl_Obj ** items; 821 Tcl_Obj ** script_header; 832 822 833 823 int length = 0; … … 837 827 return TCL_ERROR; 838 828 } 839 if (length<2) { 840 Tcl_AppendStringsToObj(obj_result, 841 "invalid object reference '", 842 Tcl_GetString(objv[0]), 843 "must be {TYPE ?name? i1 i2 ... ik}", 844 NULL); 845 return TCL_ERROR; 846 } 847 848 if (!(container=Tol_ResolveObject(interp, objv[0], obj_result))) { 849 return TCL_ERROR; 850 } 851 BSet *set = ContainerGetSet(container); 829 if ( length < 2 ) { 830 Tcl_AppendStringsToObj( obj_result, 831 "invalid object reference '", 832 Tcl_GetString(objv[0]), 833 "must be {TYPE ?name? i1 i2 ... ik}", 834 NULL ); 835 return TCL_ERROR; 836 } 837 838 /* expand header of script */ 839 tcl_code = Tcl_ListObjGetElements( interp, objv[ 1 ], 840 &length, &script_header ); 841 if ( tcl_code != TCL_OK ) { 842 Tcl_AppendObjToObj( obj_result, Tcl_GetObjResult( interp ) ); 843 return TCL_ERROR; 844 } 845 846 if ( !length ) { 847 Tcl_AppendStringsToObj( obj_result, 848 "invalid script argument of length 0", 849 NULL ); 850 return TCL_ERROR; 851 } 852 int ARG_SCRIPT = length - 1; 853 int ARG_GRAMMAR = ARG_SCRIPT + 1; 854 int ARG_NAME = ARG_GRAMMAR + 1; 855 int ARG_CONTENT = ARG_NAME + 1; 856 int ARG_PATH = ARG_CONTENT + 1; 857 int ARG_DESC = ARG_PATH + 1; 858 int ARG_INDEXES = ARG_DESC + 1; 859 int ARG_ISFILE = ARG_INDEXES + 1; 860 int ARG_HASSUBSET = ARG_ISFILE + 1; 861 int ARG_SUBTYPE = ARG_HASSUBSET + 1; 862 int ARG_STRUCT = ARG_SUBTYPE + 1; 863 int NUM_ARGS = ARG_STRUCT + 1; 864 865 if ( !( container=Tol_ResolveObject( interp, objv[0], obj_result ) ) ) { 866 return TCL_ERROR; 867 } 868 BSet *set = ContainerGetSet( container ); 852 869 if (!set) { 853 870 Tcl_AppendStringsToObj(obj_result, … … 862 879 863 880 int datac; 864 Tcl_Obj * datav[NUM_ARGS]; 881 Tcl_Obj ** datav = new ( Tcl_Obj* [ NUM_ARGS ] ); 882 865 883 // is ok to ask for a list 866 Tcl_ListObjGetElements( interp,objv[0],&n,&items);884 Tcl_ListObjGetElements( interp, objv[ 0 ], &n, &items ); 867 885 868 886 if (strcmp(Tcl_GetString(items[0]),"Console")) { … … 878 896 } 879 897 880 datav[ARG_SCRIPT] = objv[1]; 898 for( i = 0; i < ARG_GRAMMAR; ++i ) { 899 datav[ i ] = script_header[ i ]; 900 } 881 901 882 902 datav[ARG_GRAMMAR] = Tcl_NewObj(); … … 893 913 datav[ARG_SUBTYPE] = Tcl_NewObj(); 894 914 datav[ARG_STRUCT] = Tcl_NewObj(); 895 for (i=ARG_GRAMMAR; i<NUM_ARGS; ++i) 896 Tcl_IncrRefCount(datav[i]); 915 for ( i = 0; i < NUM_ARGS; ++i ) { 916 Tcl_IncrRefCount( datav[i] ); 917 } 897 918 898 919 BSyntaxObject *syn_i; … … 902 923 Tcl_DStringInit(&dstr); 903 924 BText btxt; 904 905 925 906 for ( i=1; i<=card; ++i) {926 for ( i = 1; i <= card; ++i ) { 907 927 syn_i = (*set)[i]; 908 928 909 929 /* read the grammar */ 910 911 930 btxt = syn_i->Grammar()->Name(); 912 931 Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr); … … 920 939 921 940 /* read the name */ 922 923 941 //btxt = syn_i->Identify(); 924 942 GetName( syn_i, btxt ); … … 933 951 934 952 /* read the content */ 935 936 953 btxt = syn_i->Info(); 937 954 Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr); … … 945 962 946 963 /* read the path */ 947 948 964 btxt = syn_i->SourcePath(); 949 965 Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr); … … 956 972 Tcl_DStringFree(&dstr); 957 973 958 /* read the description */ 959 974 /* read the description */ 960 975 btxt = syn_i->Description(); 961 976 Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr); … … 975 990 1, 1, &last_index); 976 991 } 977 /*978 if (Tcl_IsShared(datav[ARG_INDEXES])) {979 Tcl_DecrRefCount(datav[ARG_INDEXES]);980 datav[ARG_INDEXES] = Tcl_DuplicateObj(datav[ARG_INDEXES]);981 Tcl_IncrRefCount(datav[ARG_INDEXES]);982 Tcl_ListObjLength(NULL,datav[ARG_INDEXES],&n);983 Tcl_ListObjIndex(NULL,datav[ARG_INDEXES],n-1,&last_index);984 }985 */986 992 /* set the last value index */ 987 Tcl_SetIntObj( last_index,i);993 Tcl_SetIntObj( last_index, i ); 988 994 /* to refresh the string */ 989 Tcl_InvalidateStringRep( datav[ARG_INDEXES]);990 if ( Tcl_IsShared(datav[ARG_ISFILE])) {991 Tcl_DecrRefCount( datav[ARG_ISFILE]);995 Tcl_InvalidateStringRep( datav[ ARG_INDEXES ] ); 996 if ( Tcl_IsShared( datav[ ARG_ISFILE ] ) ) { 997 Tcl_DecrRefCount( datav[ ARG_ISFILE ] ); 992 998 #ifdef ISFILE_IMPLEMENTED 993 datav[ ARG_ISFILE] = Tcl_NewIntObj(syn_i->IsFile());999 datav[ ARG_ISFILE ] = Tcl_NewIntObj( syn_i->IsFile( ) ); 994 1000 #else 995 datav[ARG_ISFILE] = Tcl_NewIntObj( 0);1001 datav[ARG_ISFILE] = Tcl_NewIntObj( 0 ); 996 1002 #endif 997 Tcl_IncrRefCount( datav[ARG_ISFILE]);1003 Tcl_IncrRefCount( datav[ ARG_ISFILE ] ); 998 1004 } else 999 1005 #ifdef ISFILE_IMPLEMENTED 1000 Tcl_SetIntObj( datav[ARG_ISFILE],syn_i->IsFile());1006 Tcl_SetIntObj( datav[ ARG_ISFILE ], syn_i->IsFile( ) ); 1001 1007 #else 1002 Tcl_SetIntObj( datav[ARG_ISFILE],0);1008 Tcl_SetIntObj( datav[ ARG_ISFILE ], 0 ); 1003 1009 #endif 1004 1010 /* verify if has subset */ 1005 int tmpCard = set_i->Card( );1011 int tmpCard = set_i->Card( ); 1006 1012 int j; 1007 1013 for (j=1; j<=tmpCard; ++j ) 1008 if ( ContainerGetSet((*set_i)[j]))1014 if ( ContainerGetSet( ( *set_i )[ j ] ) ) 1009 1015 break; 1010 if ( Tcl_IsShared(datav[ARG_HASSUBSET])) {1011 Tcl_DecrRefCount( datav[ARG_HASSUBSET]);1012 datav[ ARG_HASSUBSET] = Tcl_NewIntObj(j<=tmpCard);1013 Tcl_IncrRefCount( datav[ARG_HASSUBSET]);1016 if ( Tcl_IsShared( datav[ ARG_HASSUBSET ] ) ) { 1017 Tcl_DecrRefCount( datav[ ARG_HASSUBSET ] ); 1018 datav[ ARG_HASSUBSET ] = Tcl_NewIntObj( j <= tmpCard ); 1019 Tcl_IncrRefCount( datav[ ARG_HASSUBSET ] ); 1014 1020 } else 1015 Tcl_SetIntObj( datav[ARG_HASSUBSET],j<=tmpCard);1021 Tcl_SetIntObj( datav[ ARG_HASSUBSET ], j <= tmpCard ); 1016 1022 1017 1023 /* subtype info */ 1018 1019 if (Tcl_IsShared(datav[ARG_SUBTYPE])) { 1020 Tcl_DecrRefCount(datav[ARG_SUBTYPE]); 1021 datav[ARG_SUBTYPE] = Tcl_NewIntObj(set_i->SubType()); 1022 Tcl_IncrRefCount(datav[ARG_SUBTYPE]); 1024 if ( Tcl_IsShared( datav[ ARG_SUBTYPE ] ) ) { 1025 Tcl_DecrRefCount( datav[ ARG_SUBTYPE ] ); 1026 datav[ ARG_SUBTYPE ] = Tcl_NewIntObj( set_i->SubType( ) ); 1027 Tcl_IncrRefCount( datav[ ARG_SUBTYPE ] ); 1023 1028 } else 1024 Tcl_SetIntObj( datav[ARG_SUBTYPE],set_i->SubType());1029 Tcl_SetIntObj( datav[ ARG_SUBTYPE ],set_i->SubType( ) ); 1025 1030 1026 1031 /* STRUCT INFO */ 1027 if ( set_i->Struct( ) ) {1028 btxt = set_i->Struct( )->Name();1029 Tcl_ExternalToUtfDString( NULL,btxt,-1,&dstr);1032 if ( set_i->Struct( ) ) { 1033 btxt = set_i->Struct( )->Name( ); 1034 Tcl_ExternalToUtfDString( NULL, btxt, -1, &dstr ); 1030 1035 } 1031 if ( Tcl_IsShared(datav[ARG_STRUCT])) {1032 Tcl_DecrRefCount( datav[ARG_STRUCT]);1033 datav[ ARG_STRUCT] = Tcl_NewStringObj(Tcl_DStringValue(&dstr),-1);1034 Tcl_IncrRefCount( datav[ARG_STRUCT]);1036 if ( Tcl_IsShared( datav[ ARG_STRUCT ] ) ) { 1037 Tcl_DecrRefCount( datav[ ARG_STRUCT ] ); 1038 datav[ ARG_STRUCT ] = Tcl_NewStringObj( Tcl_DStringValue( &dstr ),-1 ); 1039 Tcl_IncrRefCount( datav[ ARG_STRUCT ] ); 1035 1040 } else 1036 Tcl_SetStringObj( datav[ARG_STRUCT],Tcl_DStringValue(&dstr),-1);1037 Tcl_DStringFree( &dstr);1041 Tcl_SetStringObj( datav[ ARG_STRUCT ], Tcl_DStringValue( &dstr ),-1 ); 1042 Tcl_DStringFree( &dstr ); 1038 1043 datac = NUM_ARGS; 1039 1044 } else 1040 1045 datac = ARG_INDEXES; 1041 tcl_code = Tcl_EvalObjv(interp,datac,datav,TCL_EVAL_GLOBAL); 1042 if (tcl_code != TCL_OK) { 1043 /* liberar los objetos tcl */ 1044 for (i=ARG_GRAMMAR; i<NUM_ARGS; ++i) 1045 Tcl_DecrRefCount(datav[i]); 1046 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1047 return tcl_code; 1048 } 1049 /* check if break loop */ 1050 cont_loop = 1; 1051 tcl_code = Tcl_GetIntFromObj(interp,Tcl_GetObjResult(interp),&cont_loop); 1052 if (tcl_code == TCL_OK && !cont_loop) 1046 tcl_code = Tcl_EvalObjv( interp, datac, datav, TCL_EVAL_GLOBAL ); 1047 if ( tcl_code == TCL_BREAK ) { 1048 tcl_code = TCL_OK; 1053 1049 break; 1050 } 1051 if ( tcl_code == TCL_ERROR ) { 1052 Tcl_AppendObjToObj( obj_result, Tcl_GetObjResult( interp ) ); 1053 break; 1054 } 1054 1055 } 1055 1056 1056 1057 /* liberar los objetos tcl */ 1057 for (i=ARG_GRAMMAR; i<NUM_ARGS; ++i) 1058 Tcl_DecrRefCount(datav[i]); 1059 return TCL_OK; 1058 /* OJO aqui tenia ARG_GRAMMAR en lugar de 0 */ 1059 for ( i = 0; i < NUM_ARGS; ++i ) { 1060 Tcl_DecrRefCount( datav[ i ] ); 1061 } 1062 delete []datav; 1063 return tcl_code; 1060 1064 } 1061 1065 … … 1408 1412 char * pch = soInfo; 1409 1413 if (pch) pch = skipWhite(pch); 1410 else pch = "";1414 else pch = (char*)""; 1411 1415 1412 1416 Tcl_ExternalToUtfDString(NULL,pch,-1,&dstr); … … 1762 1766 1763 1767 /* GRAMMAR */ 1764 info[0] = Tcl_NewStringObj(var->Grammar()->Name().String(), -1); 1768 #ifdef ISFILE_IMPLEMENTED 1769 info[ 0 ] = Tcl_NewStringObj(var->IsFile( ) ? "File" : 1770 var->Grammar( )->Name( ).String( ), -1 ); 1771 #else 1772 info[ 0 ] = Tcl_NewStringObj( var->Grammar( )->Name( ).String( ), -1 ); 1773 #endif 1765 1774 1766 1775 /* NAME */ … … 1780 1789 /* OBJECT CONTENT */ 1781 1790 char * pch = varInfo; 1791 1782 1792 if (pch) pch = skipWhite(pch); 1783 else pch = "";1793 else pch = (char*)""; 1784 1794 1785 1795 Tcl_ExternalToUtfDString(NULL,pch,-1,&dstr); … … 1934 1944 1935 1945 /* 1946 * Fill in obj_result the string representation of the 1947 * address of the object referenced in obj_ref. 1948 */ 1949 int Tol_GetAddresFromObject( Tcl_Interp * interp, 1950 Tcl_Obj * obj_ref, 1951 Tcl_Obj * obj_result) 1952 { 1953 const BSyntaxObject *syn ; 1954 1955 #ifndef _NDEBUG 1956 #define _PRINT_ADDR_OBJREF_ 1957 #endif 1958 1959 #ifdef _PRINT_ADDR_OBJREF_ 1960 printf( "obj_ref = %s\n", Tcl_GetString( obj_ref ) ); 1961 #endif 1962 1963 if ( !( syn = Tol_ResolveObject( interp, obj_ref, obj_result ) ) ) { 1964 return TCL_ERROR; 1965 } 1966 BText addr = syn->GetAddressFromObject( ); 1967 Tcl_AppendStringsToObj( obj_result, addr.Buffer( ), NULL ); 1968 return TCL_OK; 1969 } 1970 1971 /* 1936 1972 * We must be sure that the strings use 7 bit ASCII chararters. 1937 1973 * Otherwise we must take care of the Utf representation. … … 2064 2100 } 2065 2101 2066 Tcl_Obj *TolObj2TclObj(BSyntaxObject *tolObj) 2067 { 2068 const char *grammar = tolObj->Grammar()->Name().String(); 2069 2070 if (!strcmp(grammar, "Text")) { 2071 const BText &value = Text(tolObj); 2072 return Tcl_NewStringObj(value.String(),-1); 2073 } else if (!strcmp(grammar, "Real")) { 2074 const BDat &value = Dat(tolObj); 2075 return Tcl_NewDoubleObj(value.Value()); 2102 Tcl_Obj *TolObj2TclObj( BSyntaxObject *tolObj ) 2103 { 2104 const char *grammar = tolObj->Grammar( )->Name( ).String( ); 2105 2106 if ( !strcmp( grammar, "Text" ) ) { 2107 const BText &value = Text( tolObj ); 2108 return Tcl_NewStringObj( value.String( ),-1 ); 2109 } else if ( !strcmp( grammar, "Real" ) ) { 2110 const BDat &value = Dat( tolObj ); 2111 return Tcl_NewDoubleObj( value.Value( ) ); 2112 } else if ( !strcmp( grammar, "Set" ) ) { 2113 // a Tol Set maps to a Tcl list 2114 const BSet &setObj = ( ( BUserSet* )tolObj )->Contens( ); 2115 int card = setObj.Card( ); 2116 Tcl_Obj **objv = ( Tcl_Obj** )Tcl_Alloc( sizeof( Tcl_Obj* ) * card ); 2117 for( int i = 1; i <= card; i++ ) { 2118 objv[ i - 1 ] = TolObj2TclObj( setObj[ i ] ); 2119 } 2120 Tcl_Obj *listObj = Tcl_NewListObj( card, objv ); 2121 Tcl_Free( ( char* )objv ); 2122 return listObj; 2076 2123 } else { 2077 return Tcl_NewStringObj(tolObj->Dump().String(),-1); 2078 } 2079 } 2080 2081 int Tol_Tcl_EvalEx(const BSet &Args, const char ** result) 2124 // other types are not treated 2125 return Tcl_NewStringObj( tolObj->Dump( ).String( ),-1 ); 2126 } 2127 } 2128 2129 int Tol_Tcl_EvalEx( const BSet &Args, const char ** result ) 2082 2130 { 2083 2131 int status; 2084 2132 Tcl_Obj **objv; 2085 int card = Args.Card( );2086 2087 if ( !Args.Card()) {2133 int card = Args.Card( ); 2134 2135 if ( !Args.Card( ) ) { 2088 2136 *result = ""; 2089 2137 status = TCL_OK; 2090 2138 } else { 2091 objv = ( Tcl_Obj**)Tcl_Alloc(sizeof(Tcl_Obj*)*card);2092 for( int i=1; i<=card; i++) {2093 objv[ i-1] = TolObj2TclObj(Args[i]);2094 Tcl_IncrRefCount( objv[i-1]);2095 } 2096 status = Tcl_EvalObjv( TT_interp, card, objv, TCL_EVAL_GLOBAL);2097 *result = Tcl_GetStringResult( TT_interp);2098 for( int i=0; i<card; i++) {2139 objv = ( Tcl_Obj** )Tcl_Alloc( sizeof( Tcl_Obj* ) * card ); 2140 for( int i=1; i<=card; i++ ) { 2141 objv[ i-1 ] = TolObj2TclObj( Args[i] ); 2142 Tcl_IncrRefCount( objv[ i - 1 ] ); 2143 } 2144 status = Tcl_EvalObjv( TT_interp, card, objv, TCL_EVAL_GLOBAL ); 2145 *result = Tcl_GetStringResult( TT_interp ); 2146 for( int i = 0; i < card; i++ ) { 2099 2147 Tcl_DecrRefCount(objv[i]); 2100 2148 }
Note: See TracChangeset
for help on using the changeset viewer.
