/* ../test/common.h */ static void dao__CommonUsage( DaoProcess *_proc, DaoValue *_p[], int _n ) { CommonState* state = (CommonState*) DaoValue_TryCastCdata( _p[0], dao_type_CommonState ); const char* _CommonUsage = CommonUsage( state ); DaoProcess_PutMBString( _proc, (char*) _CommonUsage ); }
static void DaoIO_GetString( DaoProcess *proc, DaoValue *p[], int N ) { DaoStream *self = & p[0]->xStream; DString *res = DaoProcess_PutMBString( proc, "" ); DString_Assign( res, self->streamString ); DString_Clear( self->streamString ); }
static void DaoIO_ReadFile( DaoProcess *proc, DaoValue *p[], int N ) { DString *res = DaoProcess_PutMBString( proc, "" ); daoint silent = p[1]->xInteger.value; if( proc->vmSpace->options & DAO_OPTION_SAFE ){ DaoProcess_RaiseException( proc, DAO_ERROR, "not permitted" ); return; } if( DString_Size( p[0]->xString.data ) ==0 ){ char buf[1024]; while(1){ size_t count = fread( buf, 1, sizeof( buf ), stdin ); if( count ==0 ) break; DString_AppendDataMBS( res, buf, count ); } }else{ FILE *fin = DaoIO_OpenFile( proc, p[0]->xString.data, "r", silent ); struct stat info; if( fin == NULL ) return; fstat( fileno( fin ), &info ); DString_Resize( res, info.st_size ); DString_Resize( res, fread( res->mbs, 1, res->size, fin ) ); fclose( fin ); } }
static void DaoBUF_GetString( DaoProcess *proc, DaoValue *p[], int N ) { Dao_Buffer *self = (Dao_Buffer*) p[0]; DString *str = DaoProcess_PutMBString( proc, "" ); if( p[1]->xEnum.value == 0 ){ DString_Resize( str, self->size ); memcpy( str->mbs, self->buffer.pVoid, self->size ); }else{ DString_ToWCS( str ); DString_Resize( str, self->size / sizeof( wchar_t ) ); memcpy( str->wcs, self->buffer.pVoid, str->size * sizeof( wchar_t ) ); } }
void DaoCGI_RandomString( DaoProcess *proc, DaoValue *p[], int N ) { int len = DaoValue_TryGetInteger( p[0] ); int alnum = DaoValue_TryGetInteger( p[1] ); int i; DString *res = DaoProcess_PutMBString( proc, "" ); if( alnum ){ for(i=0; i<len; i++) DString_AppendChar( res, alnumChars[ (int)(62 * (rand()/(RAND_MAX+1.0)) ) ] ); }else{ for(i=0; i<len; i++) DString_AppendChar( res, (char)(255 * (rand()/(RAND_MAX+1.0))) ); } }
static void SYS_SetLocale( DaoProcess *proc, DaoValue *p[], int N ) { int category = 0; char* old; switch( p[0]->xEnum.value ){ case 0: category = LC_ALL; break; case 1: category = LC_COLLATE; break; case 2: category = LC_CTYPE; break; case 3: category = LC_MONETARY; break; case 4: category = LC_NUMERIC; break; case 5: category = LC_TIME; break; } old = setlocale( category, N == 1 ? NULL : DString_GetMBS( p[1]->xString.data ) ); if ( old ) DaoProcess_PutMBString( proc, old ); else DaoProcess_RaiseException( proc, DAO_ERROR, "invalid locale" ); }
static void STD_String( DaoProcess *proc, DaoValue *p[], int N ) { DaoInteger idint = {DAO_INTEGER,0,0,0,0,0}; DaoValue *index = (DaoValue*)(void*)&idint; DaoVmCode *sect = DaoGetSectionCode( proc->activeCode ); DString *string = DaoProcess_PutMBString( proc, "" ); daoint i, entry, size = p[0]->xInteger.value; if( p[1]->xEnum.value ) DString_ToWCS( string ); if( sect == NULL || size < 0 ) return; // TODO exception if( DaoProcess_PushSectionFrame( proc ) == NULL ) return; entry = proc->topFrame->entry; DaoProcess_AcquireCV( proc ); for(i=0; i<size; i++){ idint.value = i; if( sect->b >0 ) DaoProcess_SetValue( proc, sect->a, index ); proc->topFrame->entry = entry; DaoProcess_Execute( proc ); if( proc->status == DAO_PROCESS_ABORTED ) break; DString_AppendWChar( string, proc->stackValues[0]->xInteger.value ); } DaoProcess_ReleaseCV( proc ); DaoProcess_PopFrame( proc ); }
static void DaoIO_Read( DaoProcess *proc, DaoValue *p[], int N ) { DaoStream *self = proc->stdioStream; DString *ds = DaoProcess_PutMBString( proc, "" ); int count = 0; if( self == NULL ) self = proc->vmSpace->stdioStream; if( N >0 ) self = & p[0]->xStream; if( N >1 ) count = p[1]->xInteger.value; if( (self->attribs & (DAO_IO_FILE | DAO_IO_PIPE)) && self->file == NULL ){ DaoProcess_RaiseException( proc, DAO_ERROR, "stream is not open!" ); return; } if( ( self->mode & DAO_IO_READ ) == 0 ){ DaoProcess_RaiseException( proc, DAO_ERROR, "stream is not readable" ); return; } if( self->file == NULL && self->redirect && self->redirect->StdioRead ){ self->redirect->StdioRead( self->redirect, ds, count ); }else if( count ){ FILE *fd = stdin; DString_Clear( ds ); if( self->file ) fd = self->file; if( count >0 ){ DString_Resize( ds, count ); DString_Resize( ds, fread( ds->mbs, 1, count, fd ) ); }else{ struct stat info; fstat( fileno( fd ), &info ); DString_Resize( ds, info.st_size - ftell( fd )/2 ); DString_Resize( ds, fread( ds->mbs, 1, ds->size, fd ) ); } if( fd == stdin ) fseek( stdin, 0, SEEK_END ); }else{ DaoStream_ReadLine( self, ds ); } }
static void STD_Version( DaoProcess *proc, DaoValue *p[], int N ) { DaoProcess_PutMBString( proc, DAO_VERSION ); }
static void STD_About( DaoProcess *proc, DaoValue *p[], int N ) { DString *str = DaoProcess_PutMBString( proc, "" ); Dao_AboutVars( proc->activeNamespace, p, N, str ); }
static void AUX_Serialize( DaoProcess *proc, DaoValue *p[], int N ) { DString *mbs = DaoProcess_PutMBString( proc, "" ); DaoValue_Serialize( p[0], mbs, proc->activeNamespace, proc ); }
static void DaoIO_Name( DaoProcess *proc, DaoValue *p[], int N ) { DaoStream *self = & p[0]->xStream; DString *res = DaoProcess_PutMBString( proc, "" ); DString_Assign( res, self->fname ); }
static void SYS_Ctimef( DaoProcess *proc, DaoValue *p[], int N ) { int i; int halfday = 0; const int size = p[1]->xString.data->size; const char *format = DString_GetMBS( p[1]->xString.data ); char buf[100]; char *p1 = buf+1; char *p2; DaoMap *sym = NULL; DaoString *ds = DaoString_New(1); DaoValue *key = (DaoValue*) ds; DString *S; struct tm *ctime; time_t t = (time_t)p[0]->xInteger.value; if( t == 0 ) t = time(NULL); ctime = gmtime( & t ); if( N > 1 ){ sym = (DaoMap*)p[2]; if( sym->items->size == 0 ) sym = NULL; } S = DaoProcess_PutMBString( proc, "" ); for( i=0; i+1<size; i++ ){ if( format[i] == '%' && ( format[i+1] == 'a' || format[i+1] == 'A' ) ){ halfday = 1; break; } } buf[0] = '0'; /* for padding */ for( i=0; i+1<size; i++ ){ p2 = p1; p1[0] = 0; if( format[i] == '%' ){ const char ch = format[i+1]; switch( ch ){ case 'Y' : sprintf( p1, "%i", ctime->tm_year+1900 ); break; case 'y' : sprintf( p1, "%i", ctime->tm_year+1900 ); p2 += 2; break; case 'M' : case 'm' : if( ! addStringFromMap( key, S, sym, "month", ctime->tm_mon ) ){ sprintf( p1, "%i", ctime->tm_mon+1 ); if( ch=='M' && p1[1]==0 ) p2 = buf; /* padding 0; */ }else p2 = NULL; break; case 'D' : case 'd' : if( ! addStringFromMap( key, S, sym, "date", ctime->tm_mday ) ){ sprintf( p1, "%i", ctime->tm_mday ); if( ch=='D' && p1[1]==0 ) p2 = buf; /* padding 0; */ }else p2 = NULL; break; case 'W' : case 'w' : if( ! addStringFromMap( key, S, sym, "week", ctime->tm_wday ) ) sprintf( p1, "%i", ctime->tm_wday+1 ); else p2 = NULL; break; case 'H' : case 'h' : if( halfday ) sprintf( p1, "%i", ctime->tm_hour %12 ); else sprintf( p1, "%i", ctime->tm_hour ); if( ch=='H' && p1[1]==0 ) p2 = buf; /* padding 0; */ break; case 'I' : case 'i' : sprintf( p1, "%i", ctime->tm_min ); if( ch=='I' && p1[1]==0 ) p2 = buf; /* padding 0; */ break; case 'S' : case 's' : sprintf( p1, "%i", ctime->tm_sec ); if( ch=='S' && p1[1]==0 ) p2 = buf; /* padding 0; */ break; case 'a' : if( ! addStringFromMap( key, S, sym, "halfday", 0 ) ){ if( ctime->tm_hour >= 12 ) strcpy( p1, "pm" ); else strcpy( p1, "am" ); }else p2 = NULL; break; case 'A' : if( ! addStringFromMap( key, S, sym, "halfday", 1 ) ){ if( ctime->tm_hour >= 12 ) strcpy( p1, "PM" ); else strcpy( p1, "AM" ); }else p2 = NULL; break; default : break; } if( p2 ) DString_AppendMBS( S, p2 ); i ++; }else{ DString_AppendChar( S, format[i] ); } } if( i+1 == size ) DString_AppendChar( S, format[i] ); DaoString_Delete( ds ); }
static void SYS_GetEnv( DaoProcess *proc, DaoValue *p[], int N ) { char *evar = getenv( DString_GetMBS( p[0]->xString.data ) ); DaoProcess_PutMBString( proc, evar? evar : "" ); }