opendir sequence
Nancy Palmquist
nlp at vss3.com
Tue Nov 10 08:53:24 PST 2015
Brian,
Sorry for top post but it seemed silly to put it at the bottom. Great
programming post. I haven't seen someone post a helpful bit of code in
a long time.
Nancy
>
> I was just about to ask if anyone had a good array sort routine for
> this very same purpose. That's why I searched my saved emails first
> and found this.
>
> I just wrote a file-select call table in pure fp, and I did include a
> bubble-sort gosub, but it's pretty slow. Bubble sort is very small and
> easy to translate from generic BASIC or pseudo-code examples into fp
> processing. The only fancy function it needs is if you're sorting text
> strings, then some way to compare text strings, which is one thing we
> do have very easy in fp. We can throw and numerical or alpha strings
> together and compare them and get a sensible result as if it were all
> simple integers.
>
> But it's a bit slow for generating a directory listing as frequently
> as this will be used. Tolerable, but noticeable. A full second or more
> to display our main filepro directory.
>
> So I was about to investigate implementing some other sorting
> algorithm besides bubble sort, but they are all more complicated and
> require functions like bitwise ops that we don't have, and might not
> be practical to implement in processing. I mean if a more efficient
> algorithm required a bitwise-xor, you COULD write a gosub that turned
> integers into strings of 1&0 and then walk through those strings one
> char at a time... but I'm sure the result would be even slower than
> the original plain bubble sort!
>
> Conversely if no one implemented any kind of array sort, here is the
> simple bubble sort at least if you want.
>
> Not possible to dim an array of variable size, so you have to pick a
> max number of elements and hardcode it up front. So this uses 2048. A
> directory can certainly have more than 2048 entries in it so this will
> fail on any of those. You could declare the arrays larger than 2048
> array if you want.
>
> The harm from dimming a lot of array elements is mostly limited to
> using up memory. The loops and the listbox all just work from 1-to-N,
> where N is the return value from opendir(), and ignore the rest. So
> you could probably go ahead and dim a little more.
>
> For reference:
> 2k (2048) elements per array * 32 bytes per element * 2 arrays =
> 131072 bytes (128KB) per running instance of this call table.
> 32k (32768) elements would be 2MB per instance.
> That's on top of whatever fp is maintaining internally to provide
> @DIRLIST*[] in the first place.
>
> So at 32k elements, if 100 users each had 3 windows open with this in
> each of them all at the same time, that would be 600M used by this
> routine. Hm. Maybe it's fine to just go ahead and dim them up around
> 32k after all. Unless it takes extra seconds for FP to allocate all
> that each time the routine is called.
>
> filenames (just the filename part, not counting the leading path) can
> be longer than 32 characters, but @DIRLIST_FILENAME[] only returns 32
> bytes per entry, so there's no point in dimming the array elements any
> larger.
>
> If: 'directory list ; temp copy for bubble sort
> Then: dim dirl[2048](32) ; dim tmpl[2048](32)
> If:
> Then: d = getenv("PFDATA"){getenv("PFDIR"){"/filepro"
> If:
> Then: n = opendir("*",d) ; i = "1"
> cpd If: i le n
> Then: dirl[i] = @DIRLIST_FILENAME[i] ; i = i + "1" ; goto cpd
> If:
> Then: x = closedir()
> If:
> Then: gosub bsrt
>
> [...]
>
> bsrt If: '*** bubble sort dirl[] ***
> Then: ' works but slow
> If:
> Then: i = "1"
> bsi If:
> Then: r = "1"
> bsr If: dirl[r] gt dirl[r+"1"]
> Then: tmpl[r]=dirl[r] ;dirl[r]=dirl[r+"1"] ;dirl[r+"1"]=tmpl[r]
> If: r lt n-i
> Then: r = r + "1" ; goto bsr
> If: i lt n
> Then: i = i + "1" ; goto bsi
> If:
> Then: return ' bsrt
>
>
> I was going to ask if anyone had a better sort routine to share
> already implemented, but given that 32 character limit, and the speed,
> and another little problem having to hard code some logic and values
> from sys/stat.h instead of being able to use IS_DIR(m) like you're
> supposed to, it's probably actually better to just give up on the
> "pure filepro" goal and make a user() co-process that uses normal
> system utils to get file listings, sorted, with metadata.
>
> But I came pretty close.
>
> I have it displaying directory contents, current path to currently
> displayed directory, you can navigate up and down through directories,
> meaning it shows . and .. in the listbox, and if you select "..", it
> strips off a path element and displays the listing for the parent dir.
> When you select an item, it looks at @FSTAT["3"] and determines if
> it's a directory, and if it's a directory it adds it to the path and
> displays that new directory. If it's not a dir then it considers that
> file your final selection and returns. If you select "." then it
> considers the directory you are in as your selection instead of one of
> it's files or navigating to a parent or child dir.
>
> If you comment out the gosub bsrt it's pretty fast, and most filenames
> happen to be under 32 bytes long so it handles most cases. It just
> can't get any better than those "mosts".
>
--
Nancy Palmquist MOS & filePro Training Available
Virtual Software Systems Web Based Training and Consulting
PHONE: (412) 835-9417 Web site: http://www.vss3.com
More information about the Filepro-list
mailing list