96
96
Set_Date (val , & dat );
97
97
}
98
98
99
+ /***********************************************************************
100
+ **
101
+ */ static REBOOL Set_File_Mode_Value (REBREQ * file , REBCNT mode , REBVAL * ret )
102
+ /*
103
+ ** Set a value with file data according specified mode
104
+ **
105
+ ***********************************************************************/
106
+ {
107
+ switch (mode ) {
108
+ case SYM_SIZE :
109
+ SET_INTEGER (ret , file -> file .size );
110
+ break ;
111
+ case SYM_TYPE :
112
+ Init_Word (ret , GET_FLAG (file -> modes , RFM_DIR ) ? SYM_DIR : SYM_FILE );
113
+ break ;
114
+ case SYM_DATE :
115
+ Set_File_Date (file , ret );
116
+ break ;
117
+ case SYM_NAME :
118
+ Set_Series (REB_FILE , ret , To_REBOL_Path (file -> file .path , 0 , OS_WIDE , 0 ));
119
+ break ;
120
+ default :
121
+ return FALSE;
122
+ }
123
+ return TRUE;
124
+ }
99
125
100
126
/***********************************************************************
101
127
**
102
- */ void Ret_Query_File (REBSER * port , REBREQ * file , REBVAL * ret )
128
+ */ void Ret_Query_File (REBSER * port , REBREQ * file , REBVAL * ret , REBVAL * info )
103
129
/*
104
130
** Query file and set RET value to resulting STD_FILE_INFO object.
105
131
**
106
132
***********************************************************************/
107
133
{
108
- REBVAL * info = In_Object (port , STD_PORT_SCHEME , STD_SCHEME_INFO , 0 );
109
134
REBSER * obj ;
110
- REBSER * ser ;
111
135
112
- if (!info || !IS_OBJECT (info )) Trap_Port (RE_INVALID_SPEC , port , -10 );
113
-
114
- obj = CLONE_OBJECT (VAL_OBJ_FRAME (info ));
115
-
116
- SET_OBJECT (ret , obj );
117
- Init_Word (OFV (obj , STD_FILE_INFO_TYPE ), GET_FLAG (file -> modes , RFM_DIR ) ? SYM_DIR : SYM_FILE );
118
- SET_INTEGER (OFV (obj , STD_FILE_INFO_SIZE ), file -> file .size );
119
- Set_File_Date (file , OFV (obj , STD_FILE_INFO_DATE ));
120
-
121
- ser = To_REBOL_Path (file -> file .path , 0 , OS_WIDE , 0 );
122
-
123
- Set_Series (REB_FILE , OFV (obj , STD_FILE_INFO_NAME ), ser );
136
+ if ( IS_WORD (info ) ) {
137
+ if (!Set_File_Mode_Value (file , VAL_WORD_CANON (info ), ret ))
138
+ Trap1 (RE_INVALID_ARG , info );
139
+ } else {
140
+ info = In_Object (port , STD_PORT_SCHEME , STD_SCHEME_INFO , 0 );
141
+ if (!info || !IS_OBJECT (info )) Trap_Port (RE_INVALID_SPEC , port , -10 );
142
+ obj = CLONE_OBJECT (VAL_OBJ_FRAME (info ));
143
+ Set_File_Mode_Value (file , SYM_TYPE , OFV (obj , STD_FILE_INFO_TYPE ));
144
+ Set_File_Mode_Value (file , SYM_SIZE , OFV (obj , STD_FILE_INFO_SIZE ));
145
+ Set_File_Mode_Value (file , SYM_DATE , OFV (obj , STD_FILE_INFO_DATE ));
146
+ Set_File_Mode_Value (file , SYM_NAME , OFV (obj , STD_FILE_INFO_NAME ));
147
+ SET_OBJECT (ret , obj );
148
+ }
124
149
}
125
150
151
+ /***********************************************************************
152
+ **
153
+ */ void Ret_File_Modes (REBSER * port , REBVAL * ret )
154
+ /*
155
+ ** Sets value with block of possible file mode names
156
+ **
157
+ ***********************************************************************/
158
+ {
159
+ Set_Block (ret , Get_Object_Words (In_Object (port , STD_PORT_SCHEME , STD_SCHEME_INFO , 0 )));
160
+ }
126
161
127
162
/***********************************************************************
128
163
**
@@ -461,11 +496,16 @@ REBINT Mode_Syms[] = {
461
496
break ;
462
497
463
498
case A_QUERY :
499
+ args = Find_Refines (ds , ALL_QUERY_REFS );
500
+ if ((args & AM_QUERY_MODE ) && IS_NONE (D_ARG (ARG_QUERY_FIELD ))) {
501
+ Ret_File_Modes (port , D_RET );
502
+ return R_RET ;
503
+ }
464
504
if (!IS_OPEN (file )) {
465
505
Setup_File (file , 0 , path );
466
506
if (OS_DO_DEVICE (file , RDC_QUERY ) < 0 ) return R_NONE ;
467
507
}
468
- Ret_Query_File (port , file , D_RET );
508
+ Ret_Query_File (port , file , D_RET , D_ARG ( ARG_QUERY_FIELD ) );
469
509
// !!! free file path?
470
510
break ;
471
511
@@ -476,7 +516,6 @@ REBINT Mode_Syms[] = {
476
516
if (OS_DO_DEVICE (file , RDC_MODIFY ) < 0 ) return R_NONE ;
477
517
}
478
518
return R_TRUE ;
479
- break ;
480
519
481
520
case A_INDEXQ :
482
521
SET_INTEGER (D_RET , file -> file .index + 1 );
@@ -535,7 +574,6 @@ REBINT Mode_Syms[] = {
535
574
A_REMOVE, // 52
536
575
A_CHANGE, // 53
537
576
A_POKE, // 54
538
- A_QUERY, // 64
539
577
A_FLUSH, // 65
540
578
*/
541
579
0 commit comments