Exemplo n.º 1
0
        void find_first_file(BytePtr aName)
        {
            DirectoryInfo dir = new DirectoryInfo(dir_path);

            if (!dir.Exists)
            {
                return;
            }

            FileInfo[] files = dir.GetFiles();

            string name = aName.ToString();

            IEnumerator fenum = files.GetEnumerator();

            while (fenum.MoveNext() && (((FileInfo)fenum.Current).Name == "." || ((FileInfo)fenum.Current).Name == ".."))
            {
                ;
            }

            do
            {
                FileInfo fi = (FileInfo)fenum.Current;

                // Match found? Then copy real file name
                if (match(name, fi.Name))
                {
                    CharFunctions.strncpy(aName, fi.Name);
                    return;
                }
            } while (fenum.MoveNext());
        }
Exemplo n.º 2
0
        unsafe void convert_filename(BytePtr srcname, BytePtr destname, ref FileAccessMode filemode, ref FileType filetype)
        {
            byte *p;

            // Search for ':', p points to first character after ':'
            if ((p = CharFunctions.strchr(srcname, ':')) != null)
            {
                p++;
            }
            else
            {
                p = srcname;
            }

            // Remaining string -> destname
            CharFunctions.strncpy(destname, srcname, p);

            // Look for mode parameters seperated by ','
            p = destname;
            while ((p = CharFunctions.strchr(p, ',')) != null)
            {
                // Cut string after the first ','
                *p++ = 0;
                switch ((Char)(*p))
                {
                case 'P':
                    filetype = FileType.FTYPE_PRG;
                    break;

                case 'S':
                    filetype = FileType.FTYPE_SEQ;
                    break;

                case 'U':
                    filetype = FileType.FTYPE_USR;
                    break;

                case 'L':
                    filetype = FileType.FTYPE_REL;
                    break;

                case 'R':
                    filemode = FileAccessMode.FMODE_READ;
                    break;

                case 'W':
                    filemode = FileAccessMode.FMODE_WRITE;
                    break;

                case 'A':
                    filemode = FileAccessMode.FMODE_APPEND;
                    break;
                }
            }
        }
Exemplo n.º 3
0
        unsafe void convert_filename(byte *srcname, byte *destname, ref FileAccessMode filemode, ref FileType filetype, ref bool wildflag)
        {
            byte *p, q;

            // Search for ':', p points to first character after ':'
            if ((p = CharFunctions.strchr(srcname, ':')) != null)
            {
                p++;
            }
            else
            {
                p = srcname;
            }

            // Convert char set of the remaining string -> destname
            q = destname;
            for (int i = 0; i < IEC.NAMEBUF_LENGTH && (*q++ = conv_from_64(*p++, true)) != 0; i++)
            {
                ;
            }

            // Look for mode parameters seperated by ','
            p = destname;
            while ((p = CharFunctions.strchr(p, ',')) != null)
            {
                // Cut string after the first ','
                *p++ = 0;
                switch ((Char)(*p))
                {
                case 'p':
                    filetype = FileType.FTYPE_PRG;
                    break;

                case 's':
                    filetype = FileType.FTYPE_SEQ;
                    break;

                case 'r':
                    filemode = FileAccessMode.FMODE_READ;
                    break;

                case 'w':
                    filemode = FileAccessMode.FMODE_WRITE;
                    break;

                case 'a':
                    filemode = FileAccessMode.FMODE_APPEND;
                    break;
                }
            }

            // Search for wildcards
            wildflag = CharFunctions.strchr(destname, '?') != null || CharFunctions.strchr(destname, '*') != null;
        }
Exemplo n.º 4
0
        unsafe byte open_directory(byte *pattern)
        {
            int       i, j, n, m;
            byte *    p, q;
            DirEntry *de;
            byte      c;
            byte *    tmppat;

            // Special treatment for "$0"
            if (pattern[0] == '0' && pattern[1] == 0)
            {
                pattern += 1;
            }

            // Skip everything before the ':' in the pattern
            if ((tmppat = CharFunctions.strchr(pattern, ':')) != null)
            {
                pattern = tmppat + 1;
            }

            AllocateChannelBuffer(0, 8192);

            p = buf_ptr[0] = chan_buf[0];

            chan_mode[0] = ChannelMode.CHMOD_DIRECTORY;

            // Create directory title
            *p++ = 0x01;        // Load address $0401 (from PET days :-)
            *p++ = 0x04;
            *p++ = 0x01;        // Dummy line link
            *p++ = 0x01;
            *p++ = 0;           // Drive number (0) as line number
            *p++ = 0;
            *p++ = 0x12;        // RVS ON
            *p++ = (byte)'\"';

            q = bam->disk_name;
            for (i = 0; i < 23; i++)
            {
                if ((c = *q++) == 0xa0)
                {
                    *p++ = (byte)' ';           // Replace 0xa0 by space
                }
                else
                {
                    *p++ = c;
                }
            }
            *(p - 7) = (byte)'\"';
            *p++ = 0;

            // Scan all directory blocks
            dir.next_track  = bam->dir_track;
            dir.next_sector = bam->dir_sector;

            fixed(Directory *dd = &dir)
            {
                while (dir.next_track != 0x00)
                {
                    if (!read_sector(dir.next_track, dir.next_sector, &dd->next_track))
                    {
                        return((byte)C64StatusCode.ST_OK);
                    }

                    DirEntry *ade = (DirEntry *)dd->entry;
                    // Scan all 8 entries of a block
                    for (j = 0; j < 8; j++)
                    {
                        de = &ade[j];

                        if (de->type != 0 && match(pattern, de->name))
                        {
                            *p++ = 0x01; // Dummy line link
                            *p++ = 0x01;

                            *p++ = de->num_blocks_l; // Line number
                            *p++ = de->num_blocks_h;

                            *p++ = (byte)' ';
                            n = (de->num_blocks_h << 8) + de->num_blocks_l;
                            if (n < 10)
                            {
                                *p++ = (byte)' ';
                            }
                            if (n < 100)
                            {
                                *p++ = (byte)' ';
                            }

                            *p++ = (byte)'\"';
                            q    = de->name;
                            m    = 0;
                            for (i = 0; i < 16; i++)
                            {
                                if ((c = *q++) == 0xa0)
                                {
                                    if (m != 0)
                                    {
                                        *p++ = (byte)' ';               // Replace all 0xa0 by spaces
                                    }
                                    else
                                    {
                                        m = *p++ = (byte)'\"';  // But the first by a '"'
                                    }
                                }
                                else
                                {
                                    *p++ = c;
                                }
                            }
                            if (m != 0)
                            {
                                *p++ = (byte)' ';
                            }
                            else
                            {
                                *p++ = (byte)'\"';                      // No 0xa0, then append a space
                            }
                            if ((de->type & 0x80) != 0)
                            {
                                *p++ = (byte)' ';
                            }
                            else
                            {
                                *p++ = (byte)'*';
                            }

                            *p++ = type_char_1[de->type & 0x0f];
                            *p++ = type_char_2[de->type & 0x0f];
                            *p++ = type_char_3[de->type & 0x0f];

                            if ((de->type & 0x40) != 0)
                            {
                                *p++ = (byte)'<';
                            }
                            else
                            {
                                *p++ = (byte)' ';
                            }

                            *p++ = (byte)' ';
                            if (n >= 10)
                            {
                                *p++ = (byte)' ';
                            }
                            if (n >= 100)
                            {
                                *p++ = (byte)' ';
                            }
                            *p++ = 0;
                        }
                    }
                }
            }

            // Final line
            q = p;
            for (i = 0; i < 29; i++)
            {
                *q++ = (byte)' ';
            }

            n = 0;
            for (i = 0; i < 35; i++)
            {
                n += bam->bitmap[i * 4];
            }

            *p++ = 0x01;                // Dummy line link
            *p++ = 0x01;
            *p++ = (byte)(n & 0xff);    // Number of free blocks as line number
            *p++ = (byte)((n >> 8) & 0xff);

            *p++ = (byte)'B';
            *p++ = (byte)'L';
            *p++ = (byte)'O';
            *p++ = (byte)'C';
            *p++ = (byte)'K';
            *p++ = (byte)'S';
            *p++ = (byte)' ';
            *p++ = (byte)'F';
            *p++ = (byte)'R';
            *p++ = (byte)'E';
            *p++ = (byte)'E';
            *p++ = (byte)'.';

            p = q;
            *p++ = 0;
            *p++ = 0;
            *p++ = 0;

            buf_len[0] = (int)(p - chan_buf[0]);

            return((byte)C64StatusCode.ST_OK);
        }