FileStream.st
changeset 11812 fae9f7c22dbd
parent 11454 b451c165163a
child 11813 9ccd2b0ca724
equal deleted inserted replaced
11811:530bb21f57f9 11812:fae9f7c22dbd
  1009 
  1009 
  1010     |wasBlocked|
  1010     |wasBlocked|
  1011 
  1011 
  1012 %{
  1012 %{
  1013     HFILE f;
  1013     HFILE f;
  1014     HFILE fopen();
  1014 
  1015     int pass = 0;
  1015     int pass = 0;
  1016 
  1016 
  1017 retry:
  1017 retry:
  1018     if (__isNonNilObject(pathName) && __isString(openmode))
  1018     if (__isNonNilObject(pathName) && (__isStringLike(openmode) || __isArray(openmode)))
  1019 #ifdef __VMS__
  1019 #ifdef __VMS__
  1020       if (__qClass(pathName)==String) {
  1020       if (__qClass(pathName)==String) {
  1021         do {
  1021         do {
  1022             /*
  1022             /*
  1023              * allow passing additional RMS arguments.
  1023              * allow passing additional RMS arguments.
  1138         } while ((f == NULL) && (__threadErrno == EINTR));
  1138         } while ((f == NULL) && (__threadErrno == EINTR));
  1139       }
  1139       }
  1140 #else /* not VMS */
  1140 #else /* not VMS */
  1141 
  1141 
  1142 # ifdef WIN32
  1142 # ifdef WIN32
  1143 
  1143     {
  1144       if (__qClass(pathName)==String) {
  1144           DWORD share = 0, access = 0, create = 0, attr = 0;
  1145         {
  1145           int numAttrib, i;
  1146             char _aPathName[MAXPATHLEN];
  1146           OBJ *ap;
  1147             char _openMode[64];
  1147           char * __openmode;
  1148 
  1148           HANDLE handle;
  1149             strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
  1149 
  1150             strncpy(_openMode, __stringVal(openmode), sizeof(_openMode)-1); _openMode[sizeof(_openMode)-1] = '\0';
  1150           if (__isStringLike(openmode)) {
  1151             do {
  1151               share = FILE_SHARE_READ|FILE_SHARE_WRITE;
  1152                 __threadErrno = 0;
  1152               __openmode = __stringVal(openmode);
  1153                 f = STX_C_CALL2( "fopen", fopen, _aPathName, _openMode);
  1153               if (strcmp(__openmode, "rb") == 0) {
  1154                 if (__threadErrno == EINTR) {
  1154                   access = GENERIC_READ;
  1155                     f = NULL;
  1155                   create = OPEN_EXISTING;
       
  1156               } else if (strcmp(__openmode, "rb+") == 0) {
       
  1157                   access = GENERIC_READ | GENERIC_WRITE;
       
  1158                   create = OPEN_ALWAYS;
       
  1159               } else if (strcmp(__openmode, "wb") == 0) {
       
  1160                   access = GENERIC_WRITE;
       
  1161                   create = CREATE_ALWAYS;
       
  1162               } else if (strcmp(__openmode, "wb+") == 0) {
       
  1163                   access = GENERIC_READ | GENERIC_WRITE;
       
  1164                   create = CREATE_ALWAYS;
       
  1165               } else if (strcmp(__openmode, "ab") == 0) {
       
  1166                   access = FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
       
  1167                                 STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
       
  1168                   create = OPEN_ALWAYS;
       
  1169               } else if (strcmp(__openmode, "ab+") == 0) {
       
  1170                   access = GENERIC_READ |FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
       
  1171                                 STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
       
  1172                   create = OPEN_ALWAYS;
       
  1173               } else {
       
  1174                   console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
       
  1175               }
       
  1176           } else if (__isArrayLike(openmode)) {
       
  1177               ap = __ArrayInstPtr(attributeSpec)->a_element;
       
  1178               numAttrib = __arraySize(attributeSpec);
       
  1179               __openmode = "rb+";
       
  1180 
       
  1181               for (i=0; i<numAttrib; i++) {
       
  1182                   OBJ attrSym = ap[i];
       
  1183 
       
  1184                   if (attrSym == @symbol(FILE_SHARE_READ)) {
       
  1185                       share |= FILE_SHARE_READ;
       
  1186                   } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
       
  1187                       share |= FILE_SHARE_WRITE;
       
  1188 
       
  1189                   } else if (attrSym == @symbol(GENERIC_READ)) {
       
  1190                       access |= GENERIC_READ;
       
  1191                   } else if (attrSym == @symbol(GENERIC_WRITE)) {
       
  1192                       access |= GENERIC_WRITE;
       
  1193 
       
  1194                   } else if (attrSym == @symbol(CREATE_NEW)) {
       
  1195                       create |= CREATE_NEW;
       
  1196                   } else if (attrSym == @symbol(CREATE_ALWAYS)) {
       
  1197                       create |= CREATE_ALWAYS;
       
  1198                   } else if (attrSym == @symbol(OPEN_EXISTING)) {
       
  1199                       create |= OPEN_EXISTING;
       
  1200                   } else if (attrSym == @symbol(OPEN_ALWAYS)) {
       
  1201                       create |= OPEN_ALWAYS;
       
  1202                   } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
       
  1203                       create |= TRUNCATE_EXISTING;
       
  1204 
       
  1205                   } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
       
  1206                       attr |= FILE_ATTRIBUTE_HIDDEN;
       
  1207                   } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
       
  1208                       attr |= FILE_ATTRIBUTE_READONLY;
       
  1209                   } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
       
  1210                       attr |= FILE_FLAG_WRITE_THROUGH;
       
  1211                   } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
       
  1212                       attr |= FILE_FLAG_SEQUENTIAL_SCAN;
       
  1213                   } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
       
  1214                       attr |= FILE_FLAG_DELETE_ON_CLOSE;
       
  1215                   } else {
       
  1216                       console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
       
  1217                   }
       
  1218               }
       
  1219           } else {
       
  1220               f = NULL;
       
  1221 //              argumentError = @symbol(badAttributeSpec);
       
  1222               goto badArgument;
       
  1223           }
       
  1224           if (create == 0) {
       
  1225               f = NULL;
       
  1226 //              argumentError = @symbol(missingCreateMode);
       
  1227               goto badArgument;
       
  1228           }
       
  1229           if (attr == 0) {
       
  1230               attr = FILE_ATTRIBUTE_NORMAL;
       
  1231           }
       
  1232 
       
  1233           if (__isString(pathName)) {
       
  1234                 char _aPathName[MAXPATHLEN];
       
  1235 
       
  1236                 strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
       
  1237                 do {
       
  1238                     __threadErrno = 0;
       
  1239                     handle = STX_API_CALL7( "CreateFileA", CreateFileA, _aPathName, access, share, 0 /* sa */, create, attr, 0 /* hTempl */);
       
  1240                     if (__threadErrno == EINTR) {
       
  1241                         handle = INVALID_HANDLE_VALUE;
       
  1242                     }
       
  1243                 } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
       
  1244           } else if (__isUnicode16String(pathName)) {
       
  1245                 wchar_t _aPathName[MAXPATHLEN+1];
       
  1246                 int i, l;
       
  1247 
       
  1248                 l = __unicode16StringSize(pathName);
       
  1249                 if (l > MAXPATHLEN) l = MAXPATHLEN;
       
  1250                 for (i=0; i<l; i++) {
       
  1251                     _aPathName[i] = __unicode16StringVal(pathName)[i];
  1156                 }
  1252                 }
  1157             } while ((f == NULL) && (__threadErrno == EINTR));
  1253                 _aPathName[i] = 0;
  1158         }
  1254 
  1159       } else if (__qClass(pathName)==Unicode16String) {
  1255                 do {
  1160         {
  1256                     __threadErrno = 0;
  1161             wchar_t _aPathName[MAXPATHLEN+1];
  1257                     handle = STX_API_CALL7( "CreateFileW", CreateFileW, _aPathName, access, share, 0 /* sa */, create, attr, 0 /* hTempl */);
  1162             wchar_t _openMode[64];
  1258                     if (__threadErrno == EINTR) {
  1163             int i, l;
  1259                         handle = INVALID_HANDLE_VALUE;
  1164 
  1260                     }
  1165             l = __unicode16StringSize(pathName);
  1261                 } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
  1166             if (l > MAXPATHLEN) l = MAXPATHLEN;
  1262           }
  1167             for (i=0; i<l; i++) {
  1263           if (handle != INVALID_HANDLE_VALUE) {
  1168                 _aPathName[i] = __unicode16StringVal(pathName)[i];
  1264               f = fdopen(_open_osfhandle((long)handle, O_BINARY), __openmode);
  1169             }
  1265           } else {
  1170             _aPathName[i] = 0;
  1266               f = NULL;
  1171 
  1267           }
  1172             l = __stringSize(openmode);
       
  1173             if (l > 64) l = 64;
       
  1174             for (i=0; i<l; i++) {
       
  1175                 _openMode[i] = ((unsigned char *)__stringVal(openmode))[i];
       
  1176             }
       
  1177             _openMode[i] = 0;
       
  1178             do {
       
  1179                 __threadErrno = 0;
       
  1180                 f = STX_C_CALL2( "_wfopen", _wfopen, _aPathName, _openMode);
       
  1181                 if (__threadErrno == EINTR) {
       
  1182                     f = NULL;
       
  1183                 }
       
  1184             } while ((f == NULL) && (__threadErrno == EINTR));
       
  1185         }
       
  1186       }
  1268       }
  1187 # else /* not WIN32 */
  1269 # else /* not WIN32 */
  1188 
  1270 
  1189       if (__qClass(pathName)==String) {
  1271       if (__qClass(pathName)==String) {
  1190         do {
  1272         do {
  1216             pass = 1;
  1298             pass = 1;
  1217             __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
  1299             __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
  1218             __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
  1300             __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
  1219             goto retry;
  1301             goto retry;
  1220         }
  1302         }
  1221     getOutOfHere: ;
  1303     badArgument:
       
  1304     getOutOfHere:
  1222         __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
  1305         __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
  1223         __INST(position) = nil;
  1306         __INST(position) = nil;
  1224     } else {
  1307     } else {
  1225 #ifdef __VMS__
  1308 #ifdef __VMS__
  1226         /*
  1309         /*
  1250             }
  1333             }
  1251         }
  1334         }
  1252 # endif
  1335 # endif
  1253 #else /* not VMS */
  1336 #else /* not VMS */
  1254         __INST(canPosition) = true;
  1337         __INST(canPosition) = true;
  1255 #endif /* poor VMS */
  1338 #endif /* not VMS */
  1256 
  1339 
  1257         if (@global(FileOpenTrace) == true) {
  1340         if (@global(FileOpenTrace) == true) {
  1258             console_fprintf(stderr, "fopen %s [FileStream] -> %x\n", __stringVal(pathName), f);
  1341             console_fprintf(stderr, "fopen %s [FileStream] -> %x\n", __stringVal(pathName), f);
  1259         }
  1342         }
  1260         if (f != NULL) {
  1343         if (f != NULL) {
  1556 ! !
  1639 ! !
  1557 
  1640 
  1558 !FileStream class methodsFor:'documentation'!
  1641 !FileStream class methodsFor:'documentation'!
  1559 
  1642 
  1560 version
  1643 version
  1561     ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.131 2009-01-14 20:01:21 stefan Exp $'
  1644     ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.132 2009-07-28 11:32:44 stefan Exp $'
  1562 ! !
  1645 ! !
  1563 
  1646 
  1564 FileStream initialize!
  1647 FileStream initialize!