Changeset 1065545 in tol for toltcl/generic
- Timestamp:
- Oct 8, 2009, 8:02:32 PM (17 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- 865a7b9d
- Parents:
- dd045c73
- Location:
- toltcl/generic
- Files:
-
- 2 edited
-
tolaccess.cpp (modified) (20 diffs)
-
toltclInt.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
toltcl/generic/tolaccess.cpp
rdd045c73 r1065545 469 469 * 470 470 */ 471 constBSyntaxObject * Tol_FindGlobalContainer(const char* Type,472 const char* obj_name,473 Tcl_Obj* obj_result)471 BSyntaxObject * Tol_FindGlobalContainer(const char* Type, 472 const char* obj_name, 473 Tcl_Obj* obj_result) 474 474 { 475 475 BGrammar *gra; … … 515 515 */ 516 516 517 constBSyntaxObject * Tol_FindChild(Tcl_Interp *interp,518 constBSyntaxObject *syn_obj,519 Tcl_Obj **indexes, int n,520 Tcl_Obj *obj_result)517 BSyntaxObject * Tol_FindChild(Tcl_Interp *interp, 518 BSyntaxObject *syn_obj, 519 Tcl_Obj **indexes, int n, 520 Tcl_Obj *obj_result) 521 521 { 522 522 int tcl_code; … … 570 570 */ 571 571 572 constBSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,573 Tcl_Obj *obj_ref,574 Tcl_Obj *obj_result)572 BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp, 573 Tcl_Obj *obj_ref, 574 Tcl_Obj *obj_result) 575 575 { 576 576 Tcl_Obj ** items; … … 587 587 588 588 // this Tcl_Obj is to leave error messages 589 constBSyntaxObject * syn = NULL;589 BSyntaxObject * syn = NULL; 590 590 591 591 if (n >= 2) { … … 666 666 { 667 667 int j; 668 constBSyntaxObject * so;668 BSyntaxObject * so; 669 669 670 670 for (j = 1; j <= ptrSet->Card(); j++) { … … 806 806 } 807 807 808 class ContainerIterator 809 { 810 public: 811 812 static ContainerIterator *New( BSyntaxObject *obj ); 813 814 enum status_t { VALID, INVALID }; 815 816 virtual ~ContainerIterator( ) { } 817 818 status_t GetStatus() const { 819 return m_status; 820 } 821 822 virtual status_t Begin( ) = 0; 823 virtual BSyntaxObject *Next( ) = 0; 824 825 protected: 826 827 ContainerIterator() : m_status( INVALID ) { } 828 829 status_t m_status; 830 }; 831 832 class SetIterator : public ContainerIterator 833 { 834 public: 835 SetIterator( BSet *set ) 836 { 837 m_set = set; 838 Begin(); 839 } 840 841 virtual ~SetIterator( ) 842 { 843 } 844 845 virtual ContainerIterator::status_t Begin() 846 { 847 m_idx = 0; 848 m_status = m_set ? VALID : INVALID; 849 return m_status; 850 } 851 852 virtual BSyntaxObject *Next() 853 { 854 BSyntaxObject *so = _next(); 855 if ( !so ) { 856 /* start over */ 857 Begin(); 858 } 859 return so; 860 } 861 862 protected: 863 864 BSyntaxObject *_next() 865 { 866 if ( m_set ) { 867 ++m_idx; 868 return ( m_idx > m_set->Card( ) ) ? NULL : ( *m_set )[ m_idx ]; 869 } 870 return NULL; 871 } 872 873 size_t m_idx; 874 BSet *m_set; 875 }; 876 877 class USetIterator : public SetIterator 878 { 879 public: 880 USetIterator( BUserSet *uset ) 881 : SetIterator( &( uset->Contens( ) ) ) 882 { 883 } 884 virtual ~USetIterator() { } 885 }; 886 887 class UNameBlockIterator : public SetIterator 888 { 889 public: 890 UNameBlockIterator( BUserNameBlock *unb ) 891 : SetIterator( &( unb->Contens( ).Set( ) ) ), 892 m_data_static( NULL ), 893 m_methods_static( NULL ), 894 m_methods_instance( NULL ), 895 m_ptr_item( NULL ) 896 { 897 const BClass *cls = unb->Contens( ).Class( ); 898 if ( cls ) { 899 m_data_static = cls->SelectStaticMembers( NULL ); 900 m_methods_static = cls->SelectStaticMethods( NULL ); 901 m_methods_instance = cls->SelectNonStaticMethods( NULL ); 902 } 903 } 904 905 virtual ~UNameBlockIterator( ) 906 { 907 DESTROY( m_data_static ); 908 DESTROY( m_methods_static ); 909 DESTROY( m_methods_instance ); 910 } 911 912 virtual status_t Begin( ) 913 { 914 SetIterator::Begin( ); 915 m_ptr_item = NULL; 916 return GetStatus( ); 917 } 918 919 virtual BSyntaxObject *Next() 920 { 921 BSyntaxObject *so; 922 923 so = _next(); 924 925 if ( so ) { 926 return so; 927 } 928 929 if ( m_ptr_item ) { 930 m_ptr_item = Cdr( m_ptr_item ); 931 } else { 932 m_ptr_item = m_methods_instance; 933 } 934 935 if ( m_ptr_item ) { 936 return (BSyntaxObject*)Car( m_ptr_item ); 937 } else { 938 // si despues de avanzar no encuentro 'obj', lo dejo listo para 939 // que de la vuelta 940 Begin( ); 941 return NULL; 942 } 943 } 944 945 private: 946 BList *m_data_static; 947 BList *m_methods_static; 948 BList *m_methods_instance; 949 BList *m_ptr_item; 950 }; 951 952 ContainerIterator *ContainerIterator::New( BSyntaxObject *obj ) 953 { 954 if ( obj->Grammar( ) == GraSet( ) ) { 955 return new USetIterator( (BUserSet*)obj ); 956 } 957 if ( obj->Grammar( ) == GraNameBlock( ) ) { 958 return new UNameBlockIterator( (BUserNameBlock*)obj ); 959 } 960 return NULL; 961 } 962 808 963 /*! Implement a foreach proc similar to the one provided in Tcl except 809 964 * that instead of iterating over the list's items it iterates over … … 816 971 Tcl_Obj * obj_result) 817 972 { 818 constBSyntaxObject* container;973 BSyntaxObject* container; 819 974 Tcl_DString dstr; 820 975 Tcl_Obj * ArgIndexes; 821 976 int tcl_code = TCL_OK; 822 int i , card;977 int i; 823 978 int n, index_length; 824 979 Tcl_Obj ** items; … … 873 1028 return TCL_ERROR; 874 1029 } 875 BSet *set = ContainerGetSet( container ); 876 if (!set) { 1030 ContainerIterator *citer = ContainerIterator::New( container ); 1031 1032 if ( !citer ) { 877 1033 Tcl_AppendStringsToObj(obj_result, 878 1034 "object '", … … 880 1036 "' is not a valid container ", 881 1037 NULL); 882 return TCL_ERROR; 883 } 884 885 card = set->Card(); 1038 return TCL_ERROR; 1039 } 886 1040 887 1041 // is ok to ask for a list 888 Tcl_ListObjGetElements( interp, objv[ 0], &n, &items );1042 Tcl_ListObjGetElements( interp, objv[ 1 ], &n, &items ); 889 1043 890 1044 // initialize the list of indexes (the common part) for every item … … 912 1066 datav[ OBJ_DESC ] = Tcl_NewStringObj( "description", -1 ); 913 1067 datav[ OBJ_DESCV ] = Tcl_NewObj( ); 914 Tcl_Obj * last_index = Tcl_NewIntObj( 0);1068 Tcl_Obj * last_index = Tcl_NewIntObj( 1 ); 915 1069 Tcl_ListObjAppendElement( NULL, ArgIndexes, last_index ); 916 1070 datav[ OBJ_INDEXES ] = Tcl_NewStringObj( "indexes", -1 ); … … 939 1093 BText btxt; 940 1094 941 for ( i = 1; i <= card; ++i ) { 942 syn_i = ( *set )[ i ]; 943 1095 for ( i = 1; ( syn_i = citer->Next( ) ); ++i ) { 944 1096 /* read the grammar */ 1097 945 1098 btxt = syn_i->Grammar( )->Name( ); 946 1099 Tcl_ExternalToUtfDString( NULL, btxt, -1, &dstr ); … … 973 1126 Tcl_DStringFree(&dstr); 974 1127 1128 /* update last index */ 1129 if ( Tcl_IsShared( last_index ) ) { 1130 last_index = Tcl_NewIntObj( i ); 1131 Tcl_ListObjReplace( NULL, datav[ OBJ_INDEXESV ], index_length-1, 1132 1, 1, &last_index ); 1133 } else { 1134 Tcl_SetIntObj( last_index, i ); 1135 } 1136 /* to refresh the string */ 1137 Tcl_InvalidateStringRep( datav[ OBJ_INDEXESV ] ); 975 1138 // Este if es para incluir en los items que son Set informacion 976 1139 // que solo ellos llevan como: Subtype, IsFile, etc ... 1140 977 1141 if ( ( set_i = ContainerGetSet( syn_i ) ) ) { 978 /* update last index */979 if ( Tcl_IsShared( last_index ) ) {980 last_index = Tcl_NewIntObj( i );981 Tcl_ListObjReplace( NULL, datav[ OBJ_INDEXESV ], index_length-1,982 1, 1, &last_index );983 }984 /* set the last value index */985 Tcl_SetIntObj( last_index, i );986 /* to refresh the string */987 Tcl_InvalidateStringRep( datav[ OBJ_INDEXESV ] );988 1142 if ( Tcl_IsShared( datav[ OBJ_ISFILEV ] ) ) { 989 1143 Tcl_DecrRefCount( datav[ OBJ_ISFILEV ] ); … … 1060 1214 } 1061 1215 } 1216 1217 delete citer; 1062 1218 1063 1219 /* liberar los objetos tcl */ … … 1084 1240 Tcl_Obj * obj_result) 1085 1241 { 1086 constBSyntaxObject* container;1242 BSyntaxObject* container; 1087 1243 Tcl_DString dstr; 1088 1244 Tcl_Obj * ArgIndexes; 1089 1245 int tcl_code; 1090 int i , card;1246 int i; 1091 1247 int n, index_length; 1092 1248 Tcl_Obj ** items; … … 1138 1294 return TCL_ERROR; 1139 1295 } 1140 BSet *set = ContainerGetSet( container ); 1141 if (!set) { 1296 ContainerIterator *citer = ContainerIterator::New( container ); 1297 1298 if ( !citer ) { 1142 1299 Tcl_AppendStringsToObj(obj_result, 1143 1300 "object '", … … 1147 1304 return TCL_ERROR; 1148 1305 } 1149 1150 card = set->Card();1151 1306 1152 1307 int datac; … … 1177 1332 datav[ARG_PATH] = Tcl_NewObj(); 1178 1333 datav[ARG_DESC] = Tcl_NewObj(); 1179 Tcl_Obj * last_index = Tcl_NewIntObj( 0);1334 Tcl_Obj * last_index = Tcl_NewIntObj(1); 1180 1335 Tcl_ListObjAppendElement(NULL,ArgIndexes,last_index); 1181 1336 datav[ARG_INDEXES] = ArgIndexes; … … 1196 1351 BText btxt; 1197 1352 1198 for ( i = 1; i <= card; ++i ) { 1199 syn_i = (*set)[i]; 1353 for ( i = 1; ( syn_i = citer->Next( ) ); ++i ) { 1200 1354 1201 1355 /* read the grammar */ … … 1261 1415 Tcl_ListObjReplace(NULL, datav[ARG_INDEXES], index_length-1, 1262 1416 1, 1, &last_index); 1417 } else { 1418 /* set the last value index */ 1419 Tcl_SetIntObj( last_index, i ); 1263 1420 } 1264 /* set the last value index */1265 Tcl_SetIntObj( last_index, i );1266 1421 /* to refresh the string */ 1267 1422 Tcl_InvalidateStringRep( datav[ ARG_INDEXES ] ); … … 1332 1487 Tcl_DecrRefCount( datav[ i ] ); 1333 1488 } 1489 1490 delete citer; 1491 1334 1492 delete []datav; 1335 1493 return tcl_code; -
toltcl/generic/toltclInt.h
rdd045c73 r1065545 313 313 */ 314 314 extern 315 constBSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,316 Tcl_Obj *obj_ref,317 Tcl_Obj *obj_result/*,318 BGrammar *grammar=NULL*/);315 BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp, 316 Tcl_Obj *obj_ref, 317 Tcl_Obj *obj_result/*, 318 BGrammar *grammar=NULL*/); 319 319 320 320 extern
Note: See TracChangeset
for help on using the changeset viewer.
