All pastes #216542 Raw Edit

Unnamed

public text v1 · immutable
#216542 ·published 2006-10-23 05:22 UTC
rendered paste body
static bool add_dir(char* dirname, int len, int fd)
{
    bool abort = false;
    DIRCACHED* dir;

    /* check for user abort */
    if (action_userabort(TIMEOUT_NOBLOCK))
        return true;

    dir = opendir_cached(dirname);
    if(!dir)
        return true;

    while (true) {
        struct dircache_entry *entry;

        entry = readdir_cached(dir);
        if (!entry)
            break;
        if (entry->attribute & ATTR_DIRECTORY) {
            int dirlen = strlen(dirname);
            bool result;

            if (!strcmp((char *)entry->d_name, ".") ||
                !strcmp((char *)entry->d_name, ".."))
                continue;

            if (dirname[1])
                snprintf(dirname+dirlen, len-dirlen, "/%s", entry->d_name);
            else
                snprintf(dirname, len, "/%s", entry->d_name);

            result = add_dir(dirname, len, fd);
            dirname[dirlen] = '\0';
            if (result) {
                abort = true;
                break;
            }
        }
        else {
            int x = strlen((char *)entry->d_name);
            unsigned int i;
            char *cp = strrchr((char *)entry->d_name,'.');

            if (cp) {
                cp++;

                /* add all supported audio files to playlists */
                for (i=0; i < sizeof(filetypes)/sizeof(struct filetype); i++) {
                    if (filetypes[i].tree_attr == TREE_ATTR_MPA) {
                        if (!strcasecmp(cp, filetypes[i].extension)) {
                            char buf[8];
                            int i;
                            write(fd, dirname, strlen(dirname));
                            write(fd, "/", 1);
                            write(fd, entry->d_name, x);
                            write(fd, "\n", 1);

                            plsize++;
                            if(TIME_AFTER(current_tick, pltick+HZ/4)) {
                                pltick = current_tick;

                                snprintf(buf, sizeof buf, "%d", plsize);
#ifdef HAVE_LCD_BITMAP
                                FOR_NB_SCREENS(i)
                                {
                                    screens[i].puts(0, 4, (unsigned char *)buf);
                                    gui_textarea_update(&screens[i]);
                                }
#else
                                x = 10;
                                if (plsize > 999)
                                    x=7;
                                else {
                                    if (plsize > 99)
                                        x=8;
                                    else {
                                        if (plsize > 9)
                                            x=9;
                                    }
                                }
                                FOR_NB_SCREENS(i) {
                                    screens[i].puts(x,0,buf);
                                }
#endif
                            }
                            break;
                        }
                    }
                }
            }
        }
    }
    closedir_cached(dir);