123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #define word char
- #include "lib/math.c"
- #include "lib/stdlib.c"
- #include "lib/sys.c"
- #include "lib/brfs.c"
- /**
- * List the contents of a directory
- * Sort by filename
- */
- void list_dir(char* path)
- {
- struct brfs_dir_entry entries[MAX_DIR_ENTRIES];
- word num_entries = fs_readdir(path, entries);
- // Keep track of the longest filename for formatting
- word max_filename_length = 0;
- // Sort entries by filename
- word i, j;
- for (i = 0; i < num_entries - 1; i++)
- {
- for (j = 0; j < num_entries - i - 1; j++)
- {
- char decompressed_filename1[17];
- strdecompress(decompressed_filename1, entries[j].filename);
- char decompressed_filename2[17];
- strdecompress(decompressed_filename2, entries[j + 1].filename);
- // Update max_filename_length
- // This works because . is always the first entry (skipped by this check)
- if (strlen(decompressed_filename2) > max_filename_length)
- {
- max_filename_length = strlen(decompressed_filename2);
- }
- // Sort by filename
- if (strcmp(decompressed_filename1, decompressed_filename2) > 0)
- {
- // Swap filenames
- struct brfs_dir_entry temp = entries[j];
- entries[j] = entries[j + 1];
- entries[j + 1] = temp;
- }
- }
- }
- for (i = 0; i < num_entries; i++)
- {
- // Create entire line with blank spaces
- char output_line[40];
- memset(output_line, ' ', 40);
- output_line[40] = 0;
- // Add filename
- struct brfs_dir_entry entry = entries[i];
- strdecompress(output_line, entry.filename);
- output_line[strlen(output_line)] = ' ';
- // Add filesize if file
- if ((entry.flags & 0x01) == 0)
- {
- char buffer[11];
- itoa(entry.filesize, buffer);
- memcpy(output_line + max_filename_length + 1, buffer, strlen(buffer));
- }
-
- bdos_print(output_line);
- }
- }
- int main()
- {
- // Read number of arguments
- word argc = shell_argc();
- char** args = shell_argv();
- // Read file/dir name if provided
- char* fname;
- if (argc < 2)
- {
- fname = fs_getcwd();
- }
- else
- {
- fname = args[1];
- }
- // Create absolute path
- char absolute_path[MAX_PATH_LENGTH];
- if (fname[0] != '/')
- {
- char* cwd = fs_getcwd();
- strcpy(absolute_path, cwd);
- if (absolute_path[strlen(absolute_path) - 1] != '/')
- {
- strcat(absolute_path, "/");
- }
- strcat(absolute_path, fname);
- }
- else
- {
- strcpy(absolute_path, fname);
- }
- // If path is root, list root directory
- if (strcmp(absolute_path, "/") == 0)
- {
- list_dir("/");
- return 'q';
- }
- // Check if fname is a file or directory
- struct brfs_dir_entry* entry = (struct brfs_dir_entry*)fs_stat(absolute_path);
- if ((word)entry == -1)
- {
- bdos_println("Dir not found");
- return 'q';
- }
- if ((entry->flags & 0x01) == 0)
- {
- // File
- bdos_println("Not a directory");
- }
- else
- {
- // Directory
- list_dir(absolute_path);
- }
- return 'q';
- }
- void interrupt()
- {
- // Handle all interrupts
- word i = get_int_id();
- switch(i)
- {
- case INTID_TIMER1:
- timer1Value = 1; // Notify ending of timer1
- break;
- }
- }
|