Changeset 468
- Timestamp:
- 09/03/07 02:29:05 (13 months ago)
- Location:
- trunk/thune
- Files:
-
- 1 added
- 13 modified
-
boot.c (modified) (1 diff)
-
console.c (modified) (12 diffs)
-
doc/UserManual (modified) (1 diff)
-
doc/thune.vim (modified) (4 diffs)
-
env.h (modified) (1 diff)
-
gl/scripts/view.t (modified) (3 diffs)
-
mkboot.t (modified) (1 diff)
-
scripts/unicode_db.t (added)
-
series.c (modified) (3 diffs)
-
tests/working/utf8.good (modified) (1 diff)
-
tests/working/utf8.t (modified) (1 diff)
-
thune.c (modified) (1 diff)
-
urlan.c (modified) (10 diffs)
-
urlan.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/thune/boot.c
r458 r468 124 124 "proc :parse.some ;(data rules -- )\n" 125 125 "[\n" 126 " 0,0, 1:version\n"126 " 0,0,3 :version\n" 127 127 " none :os\n" 128 128 " [] :devices\n" -
trunk/thune/console.c
r459 r468 21 21 #include <assert.h> 22 22 #include <stdio.h> 23 #include " env.h"23 #include "urlan.h" 24 24 25 25 … … 113 113 int main( int argc, char** argv ) 114 114 { 115 UrlanEnv env; 115 UrlanEnv* env; 116 UThread* ut; 116 117 char cmd[ 2048 ]; 117 118 int fileN = 0; … … 119 120 120 121 121 if( ur_startup( &env, CUSTOM_DT, CUSTOM_DT_COUNT ) != UR_EVAL_OK ) 122 { 123 printf( "ur_startup failed\n" ); 122 env = ur_makeEnv( CUSTOM_DT, CUSTOM_DT_COUNT ); 123 if( ! env ) 124 { 125 printf( "ur_makeEnv failed\n" ); 124 126 return -1; 125 127 } 126 128 127 129 #ifdef THUNE_GL 128 if( gx_startup( &env ) != UR_EVAL_OK )130 if( gx_startup( env ) != UR_EVAL_OK ) 129 131 { 130 132 printf( "gx_startup failed\n" ); … … 133 135 #endif 134 136 135 ur_freezeEnv( env.threads, 128, 256 ); 137 ur_freezeEnv( env, 128, 256 ); 138 ut = ur_thread( env ); 136 139 137 140 if( argc > 1 ) … … 148 151 { 149 152 case 's': 150 ur_disable( &env, UR_ENV_SECURE );153 ur_disable( env, UR_ENV_SECURE ); 151 154 break; 152 155 … … 204 207 assert( cmd[ sizeof(cmd) - 1 ] == -1 && "cmd buffer overflow" ); 205 208 206 switch( ur_evalCStr( env.threads, cmd, pos - cmd ) )209 switch( ur_evalCStr( ut, cmd, pos - cmd ) ) 207 210 { 208 211 case UR_EVAL_HALT: … … 210 213 211 214 case UR_EVAL_ERROR: 212 reportError( env.threads);215 reportError( ut ); 213 216 goto prompt; 214 217 } … … 243 246 else if( cmd[0] != '\n' ) 244 247 { 245 switch( ur_evalCStr( env.threads, cmd, -1 ) )248 switch( ur_evalCStr( ut, cmd, -1 ) ) 246 249 { 247 250 case UR_EVAL_OK: … … 250 253 UString str; 251 254 252 val = ur_result( env.threads, 0 );255 val = ur_result( ut, 0 ); 253 256 if( ur_is(val, UT_UNSET) || 254 257 ur_is(val, UT_CONTEXT) || … … 257 260 258 261 ur_arrayInit( &str, 1, 0 ); 259 ur_toStrT( env.threads, val, &str, 0 );262 ur_toStrT( ut, val, &str, 0 ); 260 263 if( str.ptr.c ) 261 264 { … … 284 287 285 288 case UR_EVAL_ERROR: 286 reportError( env.threads);287 ur_threadReset( env.threads);289 reportError( ut ); 290 ur_threadReset( ut ); 288 291 break; 289 292 } … … 295 298 296 299 #ifdef THUNE_GL 297 gx_shutdown( &env );298 #endif 299 300 ur_ shutdown( &env );300 gx_shutdown( env ); 301 #endif 302 303 ur_freeEnv( env ); 301 304 302 305 return ret; -
trunk/thune/doc/UserManual
r458 r468 523 523 random (max -- n) Generate random number. 524 524 random (n 'seed -- ) Seed random number generator. 525 zero? (n -- logic) True if number is zero. 525 526 =========== ================= ================= 526 527 -
trunk/thune/doc/thune.vim
r458 r468 36 36 syn match thuneGetWord "\a\k*:" 37 37 syn match thuneLitWord "'\a\k*" 38 "syn match thuneWord "\a\k*"38 syn match thuneWord "\a\k*" 39 39 "syn match thuneWordPath "[^[:space:]]/[^[:space]]"ms=s+1,me=e-1 40 40 … … 100 100 "syn keyword thuneMathFunction square-root subtract tangent 101 101 " Binary operators 102 "syn keyword thuneBinaryOperator complement and or xor ~ 102 syn keyword thuneBinaryOperator complement and or xor 103 103 " Logic operators 104 104 "syn match thuneLogicOperator "[<>=]=\=" … … 131 131 " Series statements 132 132 "syn keyword thuneStatement change clear copy fifth find first format fourth free 133 syn keyword thuneStatement proc func133 syn keyword thuneStatement make proc func 134 134 "head insert last match next parse past 135 135 "syn keyword thuneStatement pick remove second select skip sort tail third trim length? 136 136 137 137 " Context 138 "syn keyword thuneStatement alias binduse138 syn keyword thuneStatement bind infuse 139 139 140 140 " Object … … 184 184 HiLink thuneType Type 185 185 186 " HiLink thuneWord Identifier186 " HiLink thuneWord Keyword 187 187 HiLink thuneOpcode Operator 188 188 " HiLink thuneWordPath thuneWord -
trunk/thune/env.h
r458 r468 11 11 #define UR_EMH_STEP 1 12 12 #define UR_EMH_HALT 2 13 14 15 #define UR_ENV_GC 0x0116 #define UR_ENV_SECURE 0x0217 13 18 14 -
trunk/thune/gl/scripts/view.t
r458 r468 2 2 3 3 <"scripts/stars.t" load do> 4 5 ;"scripts/timer_bar.t" load do 4 6 5 7 0.6 :zoom … … 172 174 [ 173 175 now start-time sub :flare-sh/time 176 ;update-timer-bar 174 177 ] 175 178 proc 'sim-update set … … 299 302 ;enable/? 300 303 image/trans logo-pos <"image/warpfleetc.png" load.tex.clamp> 304 305 ;shader matte 306 ;call dl-timer-bar 301 307 ] 302 308 ] -
trunk/thune/mkboot.t
r458 r468 144 144 145 145 [ 146 0,0, 1:version146 0,0,3 :version 147 147 none :os 148 148 [] :devices -
trunk/thune/series.c
r462 r468 3197 3197 3198 3198 3199 //#define REF_CASE_PART a1+1 3199 void _lowercaseUcs16( uint16_t* it, uint16_t* end ) 3200 { 3201 int c; 3202 while( it != end ) 3203 { 3204 c = *it; 3205 if( (c >= 'A') && (c <= 'Z') ) 3206 *it = c + 32; 3207 else if( (c >= 0x00C0) && (c <= 0x00DE) && (c != 0x00D7) ) 3208 *it = c + 32; 3209 else if( (c >= 0x0391) && (c <= 0x03AB) && (c != 0x03A2) ) 3210 *it = c + 32; 3211 else if( (c >= 0x0410) && (c <= 0x042F) ) 3212 *it = c + 32; 3213 else if( (c >= 0x0531) && (c <= 0x0556) ) 3214 *it = c + 48; 3215 // TODO: Implement full lookup table. 3216 ++it; 3217 } 3218 } 3219 3220 void _lowercaseAscii( char* it, char* end ) 3221 { 3222 int c; 3223 while( it != end ) 3224 { 3225 c = *it; 3226 if( (c >= 'A') && (c <= 'Z') ) 3227 *it = c + ('a' - 'A'); 3228 ++it; 3229 } 3230 } 3231 3200 3232 3201 3233 /* … … 3204 3236 UR_CALL( uc_lowercase ) 3205 3237 { 3238 int len; 3239 int part; 3240 char* cp; 3241 char* end; 3242 UString* str; 3243 3244 #ifdef LANG_THUNE 3245 if( ur_is(tos, UT_INT) ) 3246 { 3247 UR_S_DROP; 3248 part = ur_int(tos); 3249 tos = ur_s_prev(tos); 3250 } 3251 else 3252 #endif 3253 { 3254 part = -1; 3255 } 3256 3257 str = ur_stringSlice( ut, tos, &cp, &end ); 3258 if( str ) 3259 { 3260 if( cp ) 3261 { 3262 if( ur_encoding(tos) == UR_ENC_UTF16 ) 3263 { 3264 uint16_t* cp16 = (uint16_t*) cp; 3265 uint16_t* end16 = (uint16_t*) end; 3266 if( part > -1 ) 3267 { 3268 len = end16 - cp16; 3269 if( part < len ) 3270 end16 = cp16 + part; 3271 } 3272 _lowercaseUcs16( cp16, end16 ); 3273 } 3274 else 3275 { 3276 if( part > -1 ) 3277 { 3278 len = end - cp; 3279 if( part < len ) 3280 end = cp + part; 3281 } 3282 _lowercaseAscii( cp, end ); 3283 } 3284 } 3285 } 3286 else 3287 { 3288 ur_throwErr( UR_ERR_DATATYPE, "lowercase expected string!" ); 3289 } 3290 } 3291 3292 3293 void _uppercaseUcs16( uint16_t* it, uint16_t* end ) 3294 { 3206 3295 int c; 3207 UString* str = ur_bin(tos);3208 char* cp = str->ptr.c + tos->series.it;3209 char* end = str->ptr.c + str->used;3210 3211 UR_CALL_UNUSED_TH3212 #if 0 3213 if( orRefineSet(REF_CASE_PART) )3214 {3215 char* pend;3216 UCell* a3 = tos + 2;3217 if( ur_ins(a3) < 0 )3218 {3219 ur_throwErr( 0, "/part less than zero." );3220 return;3221 }3222 pend = cp + ur_int(a3);3223 if( end > pend ) 3224 end = pend; 3225 } 3226 #endif 3227 3228 while( cp!= end )3229 { 3230 c = * cp;3231 if( (c >= ' A') && (c <= 'Z') )3232 * cp = c +('a' - 'A');3233 ++ cp;3296 while( it != end ) 3297 { 3298 c = *it; 3299 if( (c >= 'a') && (c <= 'z') ) 3300 *it = c - 32; 3301 else if( (c >= 0x00E0) && (c <= 0x00FE) && (c != 0x00F7) ) 3302 *it = c - 32; 3303 else if( (c >= 0x03B1) && (c <= 0x03CB) && (c != 0x03C2) ) 3304 *it = c - 32; 3305 else if( (c >= 0x0430) && (c <= 0x044F) ) 3306 *it = c - 32; 3307 else if( (c >= 0x0561) && (c <= 0x0586) ) 3308 *it = c - 48; 3309 // TODO: Implement full lookup table. 3310 ++it; 3311 } 3312 } 3313 3314 void _uppercaseAscii( char* it, char* end ) 3315 { 3316 int c; 3317 while( it != end ) 3318 { 3319 c = *it; 3320 if( (c >= 'a') && (c <= 'z') ) 3321 *it = c - ('a' - 'A'); 3322 ++it; 3234 3323 } 3235 3324 } … … 3238 3327 /* 3239 3328 (str -- str) 3329 (str part -- str) 3240 3330 */ 3241 3331 UR_CALL( uc_uppercase ) 3242 3332 { 3243 int c; 3244 UString* str = ur_bin(tos); 3245 char* cp = str->ptr.c + tos->series.it; 3246 char* end = str->ptr.c + str->used; 3247 3248 UR_CALL_UNUSED_TH 3249 #if 0 3250 if( orRefineSet(REF_CASE_PART) ) 3251 { 3252 char* pend; 3253 UCell* a3 = tos + 2; 3254 if( ur_int(a3) < 0 ) 3255 { 3256 ur_throwErr( 0, "/part less than zero." ); 3257 return; 3258 } 3259 pend = cp + ur_int(a3); 3260 if( end > pend ) 3261 end = pend; 3262 } 3333 int len; 3334 int part; 3335 char* cp; 3336 char* end; 3337 UString* str; 3338 3339 #ifdef LANG_THUNE 3340 if( ur_is(tos, UT_INT) ) 3341 { 3342 UR_S_DROP; 3343 part = ur_int(tos); 3344 tos = ur_s_prev(tos); 3345 } 3346 else 3263 3347 #endif 3264 3265 while( cp != end ) 3266 { 3267 c = *cp; 3268 if( (c >= 'a') && (c <= 'z') ) 3269 *cp = c - ('a' - 'A'); 3270 ++cp; 3348 { 3349 part = -1; 3350 } 3351 3352 str = ur_stringSlice( ut, tos, &cp, &end ); 3353 if( str ) 3354 { 3355 if( cp ) 3356 { 3357 if( ur_encoding(tos) == UR_ENC_UTF16 ) 3358 { 3359 uint16_t* cp16 = (uint16_t*) cp; 3360 uint16_t* end16 = (uint16_t*) end; 3361 if( part > -1 ) 3362 { 3363 len = end16 - cp16; 3364 if( part < len ) 3365 end16 = cp16 + part; 3366 } 3367 _uppercaseUcs16( cp16, end16 ); 3368 } 3369 else 3370 { 3371 if( part > -1 ) 3372 { 3373 len = end - cp; 3374 if( part < len ) 3375 end = cp + part; 3376 } 3377 _uppercaseAscii( cp, end ); 3378 } 3379 } 3380 } 3381 else 3382 { 3383 ur_throwErr( UR_ERR_DATATYPE, "uppercase expected string!" ); 3271 3384 } 3272 3385 } -
trunk/thune/tests/working/utf8.good
r458 r468 9 9 Ñга жОл-бÑл ÑОÑÑÑÑ? Ðа, МП ÑалÑÑОвÑй ÑкзеЌплÑÑ! ÑÑ.} 10 10 ] 11 {Les naïfs Êgithales hâtifs pondant à Noël où il gÚle sont sûrs d'être déçus et de voir leurs drÃŽles d'Åufs abîmés.} 12 {LES NAÃFS ÃGITHALES HÃTIFS PONDANT à NOÃL Oà IL GÃLE SONT SÃRS D'ÃTRE DÃÃUS ET DE VOIR LEURS DRÃLES D'ÅUFS ABÃMÃS.} 13 {les naïfs Êgithales hâtifs pondant à noël où il gÚle sont sûrs d'être déçus et de voir leurs drÃŽles d'Åufs abîmés.} 14 {Falsches Ãben von Xylophonmusik quÀlt jeden gröÃeren Zwerg.} 15 {FALSCHES ÃBEN VON XYLOPHONMUSIK QUÃLT JEDEN GRÃÃEREN ZWERG.} 16 {falsches ÃŒben von xylophonmusik quÀlt jeden gröÃeren zwerg.} 17 "ΟεÏκεÏÎ¬Î¶Ï ÏηΜ ÏÏ 18 ÏοÏΞÏÏα Î²ÎŽÎµÎ»Ï 19 γΌία" 20 "ÎÎΣÎÎΠάÎΩ ΀ÎΠΚΥΧÎΊÎÏΡΠÎÎÎÎÎ¥ÎÎίÎ" 21 "ΟεÏκεÏÎ¬Î¶Ï ÏηΜ ÏÏ 22 ÏοÏΞÏÏα Î²ÎŽÎµÎ»Ï 23 γΌία" 24 "SÊvör grét áðan ßvà úlpan var ónÜt." 25 "SÃVÃR GRÃT ÃÃAN ÃVà ÃLPAN VAR ÃNÃT." 26 "sÊvör grét áðan ßvà úlpan var ónÜt." 27 {Ð ÑаÑÐ°Ñ 28 Ñга жОл-бÑл ÑОÑÑÑÑ? Ðа, МП ÑалÑÑОвÑй ÑкзеЌплÑÑ! ÑÑ.} 29 {РЧÐЩÐÐ¥ ЮÐÐ ÐÐÐ-ÐЫРЊÐТРУС? ÐÐ, ÐРЀÐÐЬКÐÐЫРÐÐÐÐÐÐÐЯР! ÑЪ.} 30 {в ÑаÑÐ°Ñ 31 Ñга жОл-бÑл ÑОÑÑÑÑ? Ўа, МП ÑалÑÑОвÑй ÑкзеЌплÑÑ! ÑÑ.} -
trunk/thune/tests/working/utf8.t
r458 r468 15 15 Ñга жОл-бÑл ÑОÑÑÑÑ? Ðа, МП ÑалÑÑОвÑй ÑкзеЌплÑÑ! ÑÑ.} 16 16 ] 17 .17 dup . 18 18 19 next 20 [first dup . uppercase dup . lowercase .] 21 iter/2 -
trunk/thune/thune.c
r466 r468 1105 1105 1106 1106 UR_CALL_OP = 0; 1107 1107 1108 1108 op_throw: 1109 1109 -
trunk/thune/urlan.c
r458 r468 445 445 446 446 447 int ur_sizeofUrlanEnv()448 {449 return sizeof(UrlanEnv);450 }451 452 453 447 UThread* ur_thread( UrlanEnv* env ) 454 448 { … … 458 452 459 453 /** 460 Initialize UrlanEnv.454 Create and initialize UrlanEnv. 461 455 462 456 \param custom Pointer to array of cutsom datatypes. … … 464 458 \param customCount Number of UDatatype in custom array. 465 459 466 \return UR_EVAL_ code. 467 */ 468 int ur_startup( UrlanEnv* env, UDatatype* custom, int customCount ) 469 { 460 \return pointer to script environment. 461 */ 462 UrlanEnv* ur_makeEnv( UDatatype* custom, int customCount ) 463 { 464 UrlanEnv* env; 470 465 UThread* ut; 471 466 int n; … … 474 469 _validateEnv(); 475 470 #endif 471 472 env = memAlloc( sizeof(UrlanEnv) ); 473 if( ! env ) 474 return 0; 476 475 477 476 env->threads = 0; … … 505 504 perror( "mutexInit" ); 506 505 #endif 507 return UR_EVAL_ERROR;506 return 0; 508 507 } 509 508 … … 535 534 n = ur_tokenize( ut, _bootScript, _bootScript + sizeof(_bootScript) ); 536 535 if( ! n ) 537 return UR_EVAL_ERROR; 536 { 537 ur_freeEnv( env ); 538 return 0; 539 } 538 540 ur_bind( n, (UCell*) &ur_thrGlobal ); 539 541 n = ur_eval( ut, n, 0 ); 540 542 if( n != UR_EVAL_OK ) 541 return n; 543 { 544 ur_freeEnv( env ); 545 return 0; 546 } 542 547 #endif 543 548 n = ur_evalCStr( ut, _envScript, sizeof(_envScript) ); … … 573 578 ur_installExceptionHandlers(); 574 579 575 return n;580 return env; 576 581 } 577 582 … … 630 635 before a second thread is created. 631 636 */ 632 void ur_freezeEnv( U Thread* ut, int binCount, int blkCount )633 { 634 U rlanEnv* env = ut->env;637 void ur_freezeEnv( UrlanEnv* env, int binCount, int blkCount ) 638 { 639 UThread* ut = env->threads; 635 640 636 641 assert( env->bin.arr.ptr.v == 0 ); … … 727 732 Release all resources used by env. 728 733 */ 729 void ur_ shutdown( UrlanEnv* env )734 void ur_freeEnv( UrlanEnv* env ) 730 735 { 731 736 UThread* thr; 732 737 UThread* next; 738 739 if( ! env ) 740 return; 741 733 742 if( (thr = env->threads) ) 734 743 { … … 753 762 ur_arrayFree( &env->atoms ); 754 763 ur_arrayFree( &env->atomNames ); 764 765 memFree( env ); 755 766 } 756 767 -
trunk/thune/urlan.h
r467 r468 421 421 422 422 423 #define UR_DSTACK_SIZE 256 424 #define UR_CSTACK_SIZE 128 425 426 #define UR_TASK_RUNNING 1 427 #define UR_TASK_READY 2 428 #define UR_TASK_BLOCKED 3 429 #define UR_TASK_TERM 4 423 #define UR_ENV_GC 0x01 424 #define UR_ENV_SECURE 0x02 425 426 #define UR_DSTACK_SIZE 256 427 #define UR_CSTACK_SIZE 128 428 429 #define UR_TASK_RUNNING 1 430 #define UR_TASK_READY 2 431 #define UR_TASK_BLOCKED 3 432 #define UR_TASK_TERM 4 430 433 431 434 typedef struct UrlanEnv UrlanEnv; … … 510 513
