Author: mturk Date: Mon Oct 12 12:23:11 2009 New Revision: 824315 URL: http://svn.apache.org/viewvc?rev=824315&view=rev Log: Add simplest FileInfo test
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileInstance.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileWrapper.java commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h commons/sandbox/runtime/trunk/src/main/native/os/unix/uutils.c commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestFileSys.java Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileInstance.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileInstance.java?rev=824315&r1=824314&r2=824315&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileInstance.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileInstance.java Mon Oct 12 12:23:11 2009 @@ -392,6 +392,23 @@ } /** + * Return new {...@link FileInfo} object. + * + * @throws ClosedDescriptorException + * If this file is closed. + * @throws AsyncClosedDescriptorException + * If another thread closes this file while the lock + * operation is in progress. + * @throws IOException + * If some other I/O error occurs. + */ + public FileInfo stat() + throws IOException, SecurityException + { + return FileWrapper.stat(fd); + } + + /** * Lock the entire file. * <p> * To simulate the {...@link java.nio.channels.FileChannel#tryLock} use Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileWrapper.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileWrapper.java?rev=824315&r1=824314&r2=824315&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileWrapper.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/FileWrapper.java Mon Oct 12 12:23:11 2009 @@ -144,7 +144,7 @@ /** * Return new {...@link FileInfo} object. */ - private static FileInfo stat(Descriptor fd) + public static FileInfo stat(Descriptor fd) throws IOException, SecurityException { if (!fd.valid()) Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h?rev=824315&r1=824314&r2=824315&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h Mon Oct 12 12:23:11 2009 @@ -53,7 +53,7 @@ #define ACR_FTOK_ID 'a' #define ACR_MIN_FREAD_LEN 4096 -#define ACR_MAX_FREAD_LEN 65536 +#define ACR_MAX_FREAD_LEN (64 * 1024) #define INVALID_HANDLE_VALUE ((void *)(ptrdiff_t)-1) #define IS_INVALID_HANDLE(h) (((h) == NULL || (h) == INVALID_HANDLE_VALUE)) #define IS_VALID_HANDLE(h) (((h) != NULL && (h) != INVALID_HANDLE_VALUE)) @@ -235,11 +235,44 @@ * Read the content of a txt file, up to the ACR_MAX_FREAD_LEN * and remove all trailing space and control characters. * @param name The file name to read. - * @return buffer with the content of the file. Use free() to + * @return buffer with the content of the file. Use x_free() to * deallocate the buffer when done. * If the file cannot be read, function returns NULL. */ -char *acr_FileReadTxt(const char *name); +char *acr_FileReadTxt(const char *name); + +/** + * Read the content of a file. + * @param name The file name to read. + * @param readed OPtional number of bytes readed from the file. + * @return buffer with the content of the file. Use x_free() to + * deallocate the buffer when done. + * If the file cannot be read, function returns NULL. + */ +char *acr_FileReadAll(const char *name, size_t *readed); + +/** + * Read the content of a text file, up to the ACR_MAX_FREAD_LEN + * and create array from content lines separated by '\n' character. + * Each line has removed leading and trailing spaces. + * Empty lines that contain only spaces or tab characters are removed + * from the resulting array. + * + * @param name The file name to read. + * @return array with the content of the file. Array is terminated + * with NULL pointer. First array element contains the pointer + * to the memory content and must be free'd when no longer needed. + * <pre> + * char **array = acr_FileReadLines ... + * ... + * x_free(array[0]); + * x_free(array); + * </pre> + * + * @note Empty line that contain only spaces or tab characters are removed + * from the resulting array. + */ +char **acr_FileReadLines(const char *name); /** * Get the absolute path by merging the current Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/uutils.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/uutils.c?rev=824315&r1=824314&r2=824315&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/unix/uutils.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/unix/uutils.c Mon Oct 12 12:23:11 2009 @@ -35,7 +35,9 @@ if ((rb = malloc(rd))) { size_t nr = fread(rb, 1, rd - 2, f); if (nr == (rd - 2)) { - /* Try with larger buffer size */ + /* Try with larger buffer size + * but never larger then ACR_MAX_FREAD_LEN + */ char *nb = x_malloc(ACR_MAX_FREAD_LEN); if (nb) { memcpy(nb, rb, nr); @@ -76,6 +78,135 @@ return NULL; } +char *acr_FileReadAll(const char *name, size_t *readed) +{ + FILE *f; + size_t rd = ACR_MIN_FREAD_LEN; + char *rb; + int rc = 0; + + if (readed) + *readed = 0; + if (!(f = fopen(name, "r"))) + return NULL; + if ((rb = malloc(rd))) { + for (;;) { + size_t nr = fread(rb, 1, rd - 1, f); + if (nr == (rd - 1)) { + /* Try with larger buffer size. + */ + char *nb = x_malloc(rd << 1); + if (nb) { + memcpy(nb, rb, nr); + x_free(rb); + rb = nb; + rd = (rd << 1) - nr; + nr += fread(rb + nr, 1, rd - 1, f); + } + else { + rc = errno; + nr = 0; + } + } + if (nr > 0) { + rb[nr] = '\0'; + if (readed) + *readed = nr; + break; + } + else { + x_free(rb); + goto cleanup; + } + } + } + else { + rc = errno; + goto cleanup; + } + fclose(f); + return rb; + +cleanup: + fclose(f); + errno = rc; + return NULL; +} + +/** + * Remove all leading and trailing space characters + * from the string. + * @return pointer to the first non space character. + * @note String is modified in place + */ +static char *strtrim(char *s) +{ + int i; + /* check for empty strings */ + if (!(i = (int)strlen(s))) + return s; + for (i = i - 1; i >= 0 && acr_isspace(s[i]); i--) + ; + s[i + 1] = '\0'; + for (i = 0; s[i] != '\0' && acr_isspace(s[i]); i++) + ; + + return s + i; +} + +/** + * rv[0] contains the entire data and must be always freed. + * rv[n] is NULL. + */ +char **acr_FileReadLines(const char *name) +{ + char **arr; + char *ctxt; + char *cp, *line; + size_t i = 1, nl = 0; + + if (!(ctxt = acr_FileReadAll(name, NULL))) + return NULL; + cp = ctxt; + while ((cp = strchr(cp, '\n'))) { + cp++; + nl++; + } + /* Add room for first, last and terminating line + */ + nl += 3; + arr = (char **)x_malloc(nl * sizeof(char *)); + if (!arr) { + x_free(ctxt); + ACR_SET_OS_ERROR(ENOMEM); + return NULL; + } + arr[0] = ctxt; + line = ctxt; + while ((cp = strchr(line, '\n'))) { + /* Separate file content by NL + */ + *(cp++) = '\0'; + line = strtrim(line); + if (*line) { + arr[i++] = line; + } + line = cp; + if (!*line) + break; + } + /* Last line might not have the '\n' + */ + if (*line) { + line = strtrim(line); + if (*line) { + arr[i++] = line; + } + } + arr[i] = NULL; + return arr; +} + #define IS_PATH_SEP(C) ((C) == '/' || (C) == '\0') /* Calculate the absolute path by merging the current * working directory in case of relative paths. Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestFileSys.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestFileSys.java?rev=824315&r1=824314&r2=824315&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestFileSys.java (original) +++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestFileSys.java Mon Oct 12 12:23:11 2009 @@ -141,6 +141,20 @@ f.close(); } + public void testFileInfo() + throws Exception + { + FileInstance f = FileInstance.createTemp("tmp.", null, false); + assertFalse("FileInstance", f == null); + System.out.println(); + System.out.println("Temporary file " + f.getPath()); + FileInfo info = f.stat(); + System.out.println("Info Name : " + info.Name); + System.out.println(" Size : " + info.Size); + System.out.println(" Inode : " + info.InodeId); + f.close(); + } + }