#define __USE_BSD
#include <stdio.h>
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <dirent.h>
#include <string.h>
#include <strings.h>

int main(int argcchar **argvchar **envp ) {
        //Open the dir in argument (or . if not set)
        DIR *dir=opendir(argc==2 ? argv[1] : ".");
        if(!dir) {
                perror("opendir");
                return -1;
        }
        //This structure contains (in standart) only the name and the inode number, may contain other things on different OSes
        //DO NOT free it !
        struct dirent *file=NULL;
        while((file=readdir(dir))!=NULL) {
                //If the name begins with '.' then ignore, since in unices it's considered as hidden files
                if(strstr(file->d_name".")==file->d_name)
                        continue;
                struct stat buf;
                //stat the file to know which type is it (but you can do wtf else you want with it)
                stat(file->d_name, &buf);
                if(S_ISDIR(buf.st_mode)) {
                        //If the file is a dir then end it with a /
                        printf("%s/\n"file->d_name);
                } else if(S_ISREG(buf.st_mode)) {
                        //If it's a file then it's ended with a * 
                        printf("%s*\n"file->d_name);
                } else {
                        //Else put a ?
                        printf("%s?\n"file->d_name);
                }
        }
        //To be clean, close allowed ressources)
        closedir(dir);
}