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 SYS_Popen( DaoProcess *proc, DaoValue *p[], int N ) { DaoStream *stream = NULL; char *mode; DString *fname; stream = DaoStream_New(); stream->attribs |= DAO_IO_PIPE; fname = stream->fname; DString_Assign( fname, p[0]->xString.data ); if( DString_Size( fname ) >0 ){ mode = DString_GetMBS( p[1]->xString.data ); stream->file = popen( DString_GetMBS( fname ), mode ); if( stream->file == NULL ){ DaoProcess_RaiseException( proc, DAO_ERROR, "error opening pipe" ); } stream->mode = 0; if( strstr( mode, "+" ) ) stream->mode = DAO_IO_WRITE | DAO_IO_READ; else{ if( strstr( mode, "r" ) ) stream->mode |= DAO_IO_READ; if( strstr( mode, "w" ) || strstr( mode, "a" ) ) stream->mode |= DAO_IO_WRITE; } }else{ DaoProcess_RaiseException( proc, DAO_ERROR, "empty command line" ); } DaoProcess_PutValue( proc, (DaoValue*)stream ); }
static void Dao_ParseTarget( DString *target, DList *parts, DaoValue *sval ) { DString *tmp = sval->xString.value; DaoInteger ival = {DAO_INTEGER,0,0,0,0,0}; daoint i, n = DString_Size( target ); int ch, ch2; DString_Clear( tmp ); for(i=0; i<n; i++){ ch = target->chars[i]; ch2 = target->chars[i+1]; if( ch == '%' && isdigit( ch2 ) ){ DList_PushBack( parts, sval ); DString_Clear( tmp ); ival.value = ch2 - '0'; DList_PushBack( parts, (DaoValue*) & ival ); i ++; }else if( ch == '%' ){ if( i+1 < n ){ DString_AppendChar( tmp, (char)ch2 ); } i ++; }else{ DString_AppendChar( tmp, (char)ch ); } } DList_PushBack( parts, sval ); }
int DaoRegex_ChangeExt( DaoRegex *self, DString *input, DString *output, DString *target, int index, daoint *start2, daoint *end2 ) { daoint start = start2 ? (daoint) *start2 : 0; daoint end = end2 ? (daoint) *end2 : 0; daoint i, n=0, p1=start, p2=end, p3, last; DaoValue *value = NULL; DaoString matched = {DAO_STRING,0,0,0,0,NULL}; DList *array = DList_New( DAO_DATA_VALUE ); DString *tmp = DString_New(); DString *tmp2 = DString_New(); DString_Reset( output, 0 ); if( self == NULL || input->size == 0 ) goto DoNothing; matched.value = tmp; Dao_ParseTarget( target, array, (DaoValue*) & matched ); if( end == 0 ) end = p2 = DString_Size( input ); n = last = 0; while( DaoRegex_Match( self, input, & p1, & p2 ) ){ n += 1; if( index ==0 || n == index ){ DString_SubString( input, tmp2, last, p1 - last ); DString_Append( output, tmp2 ); DString_Clear( tmp ); for(i=0; i<array->size; i++){ value = array->items.pValue[i]; if( value->type == DAO_INTEGER ){ if( DaoRegex_SubMatch( self, value->xInteger.value, & p1, & p3 ) ){ DString_SubString( input, tmp2, p1, p3 - p1 ); DString_Append( tmp, tmp2 ); } }else{ DString_Append( tmp, value->xString.value ); } } DString_Append( output, tmp ); last = p2; } if( start2 ) *start2 = p1; if( end2 ) *end2 = p2; p1 = p2; p2 = end; if( index && n == index ) break; } DString_SubString( input, tmp2, last, end - last ); DString_Append( output, tmp2 ); DoNothing: DString_Delete( tmp ); DString_Delete( tmp2 ); DList_Delete( array ); return n; }
static void DaoIO_ReadFile( DaoProcess *proc, DaoValue *p[], int N ) { DString *res = DaoProcess_PutChars( proc, "" ); daoint silent = p[1]->xBoolean.value; if( DString_Size( p[0]->xString.value ) ==0 ){ char buf[4096]; while(1){ size_t count = fread( buf, 1, sizeof( buf ), stdin ); if( count ==0 ) break; DString_AppendBytes( res, buf, count ); } }else{ FILE *fin = DaoIO_OpenFile( proc, p[0]->xString.value, "r", silent ); struct stat info; if( fin == NULL ) return; fstat( fileno( fin ), &info ); DString_Reserve( res, info.st_size ); DString_Reset( res, fread( res->chars, 1, info.st_size, fin ) ); fclose( fin ); } }
static void PIPE_New( DaoProcess *proc, DaoValue *p[], int N ) { DaoPipeStream *stream = NULL; DString *fname = p[0]->xString.value; char *mode; stream = DaoPipeStream_New(); DaoProcess_PutValue( proc, (DaoValue*)stream ); if( DString_Size( fname ) == 0 ){ DaoProcess_RaiseError( proc, "Param", "Empty command" ); return; } mode = DString_GetData( p[1]->xString.value ); stream->file = popen( DString_GetData( fname ), mode ); if( stream->file == NULL ){ char errbuf[512]; GetErrorMessage( errno, errbuf, sizeof(errbuf) ); DaoProcess_RaiseError( proc, "Stream", errbuf ); return; } if( strstr( mode, "r" ) ) stream->base.mode |= DAO_STREAM_READABLE; if( strstr( mode, "w" ) ) stream->base.mode |= DAO_STREAM_WRITABLE; DaoFileStream_InitCallbacks( stream ); }
static void ParseKeyValueString( DaoProcess *proc, DaoMap *mulmap, DaoMap *map, const char *s ) { int i = 0; int nc = 0; int len = 0; char buffer[ LOCAL_BUF_SIZE + 1 ]; DaoValue *vk = (DaoValue*) DaoProcess_NewMBString( proc, NULL, 0 ); DaoValue *vv = (DaoValue*) DaoProcess_NewMBString( proc, NULL, 0 ); DString *key = DaoString_Get( DaoValue_CastString( vk ) ); DString *value = DaoString_Get( DaoValue_CastString( vv ) ); len = strlen( s ); nc = 0; int isKey = 1; char tmp[3]; tmp[2] = 0; for(i=0; i<len; i++){ if( s[i] == '=' ){ buffer[nc] = 0; DString_AppendMBS( key, buffer ); nc = 0; isKey = 0; }else if( s[i] == '&' || s[i] == ';' || i+1==len ){ if( i+1 == len ){ buffer[ nc ] = s[i]; nc ++; } if( DString_Size( key ) > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( value, buffer ); InsertKeyValue( proc, mulmap, map, vk, vv ); DString_Clear( key ); DString_Clear( value ); nc = 0; isKey = 1; }else if( nc > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( key, buffer ); DString_SetMBS( value, "NULL" ); InsertKeyValue( proc, mulmap, map, vk, vv ); DString_Clear( key ); DString_Clear( value ); nc = 0; isKey = 1; } }else if( s[i] != ' ' ){ if( nc >= LOCAL_BUF_SIZE ){ buffer[ nc ] = 0; if( isKey ){ DString_AppendMBS( key, buffer ); }else{ DString_AppendMBS( value, buffer ); } nc = 0; } if( s[i] == '%' ){ tmp[0] = s[i+1]; tmp[1] = s[i+2]; buffer[ nc ] = strtol( tmp, NULL, 16 ); i += 2; }else if( s[i] == '+' ){ buffer[ nc ] = ' '; }else{ buffer[ nc ] = s[i]; } nc ++; } } if( DString_Size( key ) > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( value, buffer ); InsertKeyValue( proc, mulmap, map, vk, vv ); }else if( nc > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( key, buffer ); DString_SetMBS( value, "NULL" ); InsertKeyValue( proc, mulmap, map, vk, vv ); } }