indent dirwalk.c dirwalk.h

Ran indent on dirwalk code; quite a bit of change.
This commit is contained in:
Bill Kendrick 2017-10-15 10:51:07 -07:00
parent ba686d601b
commit b37621c2f0
2 changed files with 247 additions and 246 deletions

View file

@ -25,7 +25,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#ifndef __USE_GNU #ifndef __USE_GNU
#define __USE_GNU /* for strcasestr() */ #define __USE_GNU /* for strcasestr() */
#endif #endif
#include <string.h> #include <string.h>
#include <locale.h> #include <locale.h>
@ -68,187 +68,187 @@
///////////////// directory walking callers and callbacks ////////////////// ///////////////// directory walking callers and callbacks //////////////////
void loadfont_callback(SDL_Surface * screen, const char *restrict const dir, void loadfont_callback(SDL_Surface * screen, const char *restrict const dir,
unsigned dirlen, tp_ftw_str * files, unsigned i, const char *restrict const locale) unsigned dirlen, tp_ftw_str * files, unsigned i, const char *restrict const locale)
{ {
dirlen = dirlen; dirlen = dirlen;
while (i--) while (i--)
{
int loadable = 0;
const char *restrict const cp = strchr(files[i].str, '.');
show_progress_bar(screen);
if (cp)
{ {
// need gcc 3.4 for the restrict in this location int loadable = 0;
const char * /*restrict */ const suffixes[] = const char *restrict const cp = strchr(files[i].str, '.');
{ "ttc", "dfont", "pfa", "pfb", "otf", "ttf", };
int j = sizeof suffixes / sizeof suffixes[0]; show_progress_bar(screen);
while (j--) if (cp)
{ {
// only check part, because of potential .gz or .bz2 suffix // need gcc 3.4 for the restrict in this location
if (!strncasecmp(cp + 1, suffixes[j], strlen(suffixes[j]))) const char * /*restrict */ const suffixes[] =
{ { "ttc", "dfont", "pfa", "pfb", "otf", "ttf", };
loadable = 1; int j = sizeof suffixes / sizeof suffixes[0];
break;
} while (j--)
} {
} // only check part, because of potential .gz or .bz2 suffix
if (!loadable) if (!strncasecmp(cp + 1, suffixes[j], strlen(suffixes[j])))
{ {
if (strcasestr(files[i].str, "/rsrc")) loadable = 1;
loadable = 1; break;
} }
// Loadable: TrueType (.ttf), OpenType (.otf), Type1 (.pfa and .pfb), }
// and various useless bitmap fonts. Compressed files (with .gz or .bz2) }
// should also work. A *.dfont is pretty much a Mac resource fork in a normal if (!loadable)
// file, and may load with some library versions. {
if (loadable) if (strcasestr(files[i].str, "/rsrc"))
{ loadable = 1;
char fname[512]; }
TuxPaint_Font *font; // Loadable: TrueType (.ttf), OpenType (.otf), Type1 (.pfa and .pfb),
snprintf(fname, sizeof fname, "%s/%s", dir, files[i].str); // and various useless bitmap fonts. Compressed files (with .gz or .bz2)
// should also work. A *.dfont is pretty much a Mac resource fork in a normal
// file, and may load with some library versions.
if (loadable)
{
char fname[512];
TuxPaint_Font *font;
snprintf(fname, sizeof fname, "%s/%s", dir, files[i].str);
#ifdef DEBUG #ifdef DEBUG
printf("Loading font: %s (locale is: %s)\n", fname, (locale ? locale : "NULL")); //EP printf("Loading font: %s (locale is: %s)\n", fname, (locale ? locale : "NULL")); //EP
#endif #endif
if (locale && strstr(fname, "locale") && !all_locale_fonts) if (locale && strstr(fname, "locale") && !all_locale_fonts)
{ {
char fname_check[512]; char fname_check[512];
/* We're (probably) loading from our locale fonts folder; ONLY load our locale's font */
snprintf(fname_check, sizeof fname_check, "%s/%s.ttf", dir, locale); /* We're (probably) loading from our locale fonts folder; ONLY load our locale's font */
snprintf(fname_check, sizeof fname_check, "%s/%s.ttf", dir, locale);
#ifdef DEBUG #ifdef DEBUG
printf("checking \"%s\" vs \"%s\"\n", fname_check, fname); //EP printf("checking \"%s\" vs \"%s\"\n", fname_check, fname); //EP
#endif #endif
if (strcmp(fname, fname_check) == 0) if (strcmp(fname, fname_check) == 0)
font = TuxPaint_Font_OpenFont("", fname, text_sizes[text_size]); font = TuxPaint_Font_OpenFont("", fname, text_sizes[text_size]);
else else
font = NULL; font = NULL;
} }
else else
{ {
font = TuxPaint_Font_OpenFont("", fname, text_sizes[text_size]); font = TuxPaint_Font_OpenFont("", fname, text_sizes[text_size]);
} }
if (font) if (font)
{ {
const char *restrict const family = TuxPaint_Font_FontFaceFamilyName(font); const char *restrict const family = TuxPaint_Font_FontFaceFamilyName(font);
const char *restrict const style = TuxPaint_Font_FontFaceStyleName(font); const char *restrict const style = TuxPaint_Font_FontFaceStyleName(font);
#ifdef DEBUG #ifdef DEBUG
int numfaces = TTF_FontFaces(font->ttf_font); int numfaces = TTF_FontFaces(font->ttf_font);
if (numfaces != 1)
printf("Found %d faces in %s, %s, %s\n", numfaces, files[i].str,
family, style);
printf("success: tpf: 0x%x tpf->ttf_font: 0x%x\n", if (numfaces != 1)
(unsigned int)(intptr_t) font, (unsigned int)(intptr_t) font->ttf_font); //EP added (intptr_t) to avoid warning on x64 printf("Found %d faces in %s, %s, %s\n", numfaces, files[i].str, family, style);
printf("success: tpf: 0x%x tpf->ttf_font: 0x%x\n", (unsigned int)(intptr_t) font, (unsigned int)(intptr_t) font->ttf_font); //EP added (intptr_t) to avoid warning on x64
#endif #endif
// These fonts crash Tux Paint via a library bug. // These fonts crash Tux Paint via a library bug.
int blacklisted = !strcmp("Zapfino", family) || !strcmp("Elvish Ring NFI", family); int blacklisted = !strcmp("Zapfino", family) || !strcmp("Elvish Ring NFI", family);
// First, the blacklist. We list font families that can crash Tux Paint // First, the blacklist. We list font families that can crash Tux Paint
// via bugs in the SDL_ttf library. We also test fonts to be sure that // via bugs in the SDL_ttf library. We also test fonts to be sure that
// they have both uppercase and lowercase letters. Note that we do not // they have both uppercase and lowercase letters. Note that we do not
// test for "Aa", because it is OK if uppercase and lowercase are the // test for "Aa", because it is OK if uppercase and lowercase are the
// same (but not nice -- such fonts get a low score later). // same (but not nice -- such fonts get a low score later).
// //
// Most locales leave the blacklist strings alone: "QX" and "qx" // Most locales leave the blacklist strings alone: "QX" and "qx"
// (it is less destructive to use the scoring strings instead) // (it is less destructive to use the scoring strings instead)
// //
// Locales that absolutely require all fonts to have some // Locales that absolutely require all fonts to have some
// extra characters should use "QX..." and "qx...", where "..." // extra characters should use "QX..." and "qx...", where "..."
// are some characters you absolutely require in all fonts. // are some characters you absolutely require in all fonts.
// //
// Locales with absolutely NO use for ASCII may use "..." and "...", // Locales with absolutely NO use for ASCII may use "..." and "...",
// where "..." are some characters you absolutely require in // where "..." are some characters you absolutely require in
// all fonts. This would be the case for a locale in which it is // all fonts. This would be the case for a locale in which it is
// impossible for a user to type ASCII letters. // impossible for a user to type ASCII letters.
// //
// Most translators should use scoring instead. // Most translators should use scoring instead.
if(!charset_works(font, gettext("qx")) || !charset_works(font, gettext("QX"))) if (!charset_works(font, gettext("qx")) || !charset_works(font, gettext("QX")))
blacklisted = 1; blacklisted = 1;
if(!blacklisted){ if (!blacklisted)
if (num_font_styles == num_font_styles_max) {
{ if (num_font_styles == num_font_styles_max)
num_font_styles_max = num_font_styles_max * 5 / 4 + 30; {
user_font_styles = num_font_styles_max = num_font_styles_max * 5 / 4 + 30;
realloc(user_font_styles, user_font_styles = realloc(user_font_styles, num_font_styles_max * sizeof *user_font_styles);
num_font_styles_max * sizeof *user_font_styles); }
} user_font_styles[num_font_styles] = malloc(sizeof *user_font_styles[num_font_styles]);
user_font_styles[num_font_styles] = user_font_styles[num_font_styles]->directory = strdup(dir);
malloc(sizeof *user_font_styles[num_font_styles]); user_font_styles[num_font_styles]->filename = files[i].str; // steal it (mark NULL below)
user_font_styles[num_font_styles]->directory = strdup(dir); user_font_styles[num_font_styles]->family = strdup(family);
user_font_styles[num_font_styles]->filename = files[i].str; // steal it (mark NULL below) user_font_styles[num_font_styles]->style = strdup(style);
user_font_styles[num_font_styles]->family = strdup(family); user_font_styles[num_font_styles]->score = 0;
user_font_styles[num_font_styles]->style = strdup(style);
user_font_styles[num_font_styles]->score = 0;
// TODO: weight specification // TODO: weight specification
// Now we score fonts to ensure that the best ones will be placed at // Now we score fonts to ensure that the best ones will be placed at
// the top of the list. The user will see them first. This sorting is // the top of the list. The user will see them first. This sorting is
// especially important for users who have scroll buttons disabled. // especially important for users who have scroll buttons disabled.
// Translators should do whatever is needed to put crummy fonts last. // Translators should do whatever is needed to put crummy fonts last.
// distinct uppercase and lowercase (e.g., 'o' vs. 'O')
user_font_styles[num_font_styles]->score += charset_works(font, gettext("oO"));
// common punctuation (e.g., '?', '!', '.', ',', etc.) // distinct uppercase and lowercase (e.g., 'o' vs. 'O')
user_font_styles[num_font_styles]->score += charset_works(font, gettext(",.?!")); user_font_styles[num_font_styles]->score += charset_works(font, gettext("oO"));
// uncommon punctuation (e.g., '@', '#', '*', etc.) // common punctuation (e.g., '?', '!', '.', ',', etc.)
user_font_styles[num_font_styles]->score += charset_works(font, gettext("`\%_@$~#{<(^&*")); user_font_styles[num_font_styles]->score += charset_works(font, gettext(",.?!"));
// digits (e.g., '0', '1' and '7') // uncommon punctuation (e.g., '@', '#', '*', etc.)
user_font_styles[num_font_styles]->score += charset_works(font, gettext("017")); user_font_styles[num_font_styles]->score += charset_works(font, gettext("`\%_@$~#{<(^&*"));
// distinct circle-like characters (e.g., 'O' (capital oh) vs. '0' (zero)) // digits (e.g., '0', '1' and '7')
user_font_styles[num_font_styles]->score += charset_works(font, gettext("O0")); user_font_styles[num_font_styles]->score += charset_works(font, gettext("017"));
// distinct line-like characters (e.g., 'l' (lowercase elle) vs. '1' (one) vs. 'I' (capital aye)) // distinct circle-like characters (e.g., 'O' (capital oh) vs. '0' (zero))
user_font_styles[num_font_styles]->score += charset_works(font, gettext("1Il|")); user_font_styles[num_font_styles]->score += charset_works(font, gettext("O0"));
// translation spares -- design not finalized // distinct line-like characters (e.g., 'l' (lowercase elle) vs. '1' (one) vs. 'I' (capital aye))
user_font_styles[num_font_styles]->score += charset_works(font, gettext("1Il|"));
// translation spares -- design not finalized
#if 0 #if 0
user_font_styles[num_font_styles]->score += charset_works(font, gettext("<1>spare-1a")); user_font_styles[num_font_styles]->score += charset_works(font, gettext("<1>spare-1a"));
user_font_styles[num_font_styles]->score += charset_works(font, gettext("<1>spare-1b")); user_font_styles[num_font_styles]->score += charset_works(font, gettext("<1>spare-1b"));
user_font_styles[num_font_styles]->score += charset_works(font, gettext("<9>spare-9a"))*9; user_font_styles[num_font_styles]->score += charset_works(font, gettext("<9>spare-9a")) * 9;
user_font_styles[num_font_styles]->score += charset_works(font, gettext("<9>spare-9b"))*9; user_font_styles[num_font_styles]->score += charset_works(font, gettext("<9>spare-9b")) * 9;
#endif #endif
// this really should be dynamic, avoiding the need for a special build // this really should be dynamic, avoiding the need for a special build
#ifdef OLPC_XO #ifdef OLPC_XO
// Maybe German adds a "\xc2\xb7" (middle dot) and colon here? The key wouldn't change though. // Maybe German adds a "\xc2\xb7" (middle dot) and colon here? The key wouldn't change though.
user_font_styles[num_font_styles]->score += charset_works(font, "\xc3\x97\xc3\xb7"); // multiply and divide user_font_styles[num_font_styles]->score += charset_works(font, "\xc3\x97\xc3\xb7"); // multiply and divide
#endif #endif
// FIXME: add topology tests ('A' has one hole, 'B' has two holes, etc.) // FIXME: add topology tests ('A' has one hole, 'B' has two holes, etc.)
num_font_styles++; num_font_styles++;
//printf("Accepted: %s, %s, %s, score(%d)\n", files[i].str, family, style, user_font_styles[num_font_styles]->score); //printf("Accepted: %s, %s, %s, score(%d)\n", files[i].str, family, style, user_font_styles[num_font_styles]->score);
files[i].str = NULL; // so free() won't crash -- we stole the memory files[i].str = NULL; // so free() won't crash -- we stole the memory
} }
else else
{ {
#if 0 #if 0
// THREADED_FONTS // THREADED_FONTS
printf("Font is too defective: %s, %s, %s\n", files[i].str, family, printf("Font is too defective: %s, %s, %s\n", files[i].str, family, style);
style);
#endif #endif
} }
TuxPaint_Font_CloseFont(font); TuxPaint_Font_CloseFont(font);
} }
else else
{ {
#if 0 #if 0
// THREADED_FONTS // THREADED_FONTS
printf("could not open %s\n", files[i].str); printf("could not open %s\n", files[i].str);
#endif #endif
} }
}
free(files[i].str);
} }
free(files[i].str);
}
free(files); free(files);
} }
@ -258,15 +258,15 @@ int compare_ftw_str(const void *v1, const void *v2)
{ {
const char *restrict const s1 = ((tp_ftw_str *) v1)->str; const char *restrict const s1 = ((tp_ftw_str *) v1)->str;
const char *restrict const s2 = ((tp_ftw_str *) v2)->str; const char *restrict const s2 = ((tp_ftw_str *) v2)->str;
return -strcmp(s1, s2); /* FIXME: Should we try strcasecmp, to group things together despite uppercase/lowercase in filenames (e.g., Jigsaw* vs jigsaw* Starters)??? -bjk 2009.10.11 */
return -strcmp(s1, s2); /* FIXME: Should we try strcasecmp, to group things together despite uppercase/lowercase in filenames (e.g., Jigsaw* vs jigsaw* Starters)??? -bjk 2009.10.11 */
} }
void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen, void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen,
int rsrc, void (*fn) (SDL_Surface * screen, int rsrc, void (*fn) (SDL_Surface * screen,
const char *restrict const dir, const char *restrict const dir,
unsigned dirlen, tp_ftw_str * files, unsigned dirlen, tp_ftw_str * files,
unsigned count, const char *restrict const locale), unsigned count, const char *restrict const locale), const char *restrict const locale)
const char *restrict const locale)
{ {
DIR *d; DIR *d;
unsigned num_file_names = 0; unsigned num_file_names = 0;
@ -287,123 +287,124 @@ void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen,
return; return;
for (;;) for (;;)
{ {
struct dirent *f = readdir(d); struct dirent *f = readdir(d);
int filetype = TP_FTW_UNKNOWN; int filetype = TP_FTW_UNKNOWN;
if (!f) if (!f)
break; break;
if (f->d_name[0] == '.') if (f->d_name[0] == '.')
continue; continue;
// Linux and BSD can often provide file type info w/o the stat() call // Linux and BSD can often provide file type info w/o the stat() call
#ifdef DT_UNKNOWN #ifdef DT_UNKNOWN
switch (f->d_type) switch (f->d_type)
{ {
default: default:
continue; continue;
case DT_REG: case DT_REG:
if (!rsrc) // if maybe opening resource files, need st_size if (!rsrc) // if maybe opening resource files, need st_size
filetype = TP_FTW_NORMAL; filetype = TP_FTW_NORMAL;
break; break;
case DT_DIR: case DT_DIR:
filetype = TP_FTW_DIRECTORY; filetype = TP_FTW_DIRECTORY;
break; break;
case DT_UNKNOWN: case DT_UNKNOWN:
case DT_LNK: case DT_LNK:
; ;
} }
#else #else
#warning Failed to see DT_UNKNOWN #warning Failed to see DT_UNKNOWN
#endif #endif
#if defined(_DIRENT_HAVE_D_NAMLEN) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) #if defined(_DIRENT_HAVE_D_NAMLEN) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
d_namlen = f->d_namlen; d_namlen = f->d_namlen;
#else #else
d_namlen = strlen(f->d_name); d_namlen = strlen(f->d_name);
#endif #endif
add_rsrc = 0; add_rsrc = 0;
if (filetype == TP_FTW_UNKNOWN) if (filetype == TP_FTW_UNKNOWN)
{ {
struct stat sbuf; struct stat sbuf;
memcpy(dir + dirlen, f->d_name, d_namlen + 1);
if (stat(dir, &sbuf))
continue; // oh well... try the next one
if (S_ISDIR(sbuf.st_mode))
filetype = TP_FTW_DIRECTORY;
else if (S_ISREG(sbuf.st_mode))
{
filetype = TP_FTW_NORMAL;
if (rsrc && !sbuf.st_size)
add_rsrc = 5; // 5 is length of "/rsrc"
}
else
continue; // was a device file or somesuch
}
if (filetype == TP_FTW_NORMAL)
{
char *cp;
if (num_file_names == max_file_names) memcpy(dir + dirlen, f->d_name, d_namlen + 1);
{ if (stat(dir, &sbuf))
max_file_names = max_file_names * 5 / 4 + 30; continue; // oh well... try the next one
file_names = realloc(file_names, max_file_names * sizeof *file_names); if (S_ISDIR(sbuf.st_mode))
} filetype = TP_FTW_DIRECTORY;
cp = malloc(d_namlen + add_rsrc + 1); else if (S_ISREG(sbuf.st_mode))
memcpy(cp, f->d_name, d_namlen); {
if (add_rsrc) filetype = TP_FTW_NORMAL;
memcpy(cp + d_namlen, "/rsrc", 6); if (rsrc && !sbuf.st_size)
else add_rsrc = 5; // 5 is length of "/rsrc"
cp[d_namlen] = '\0'; }
file_names[num_file_names].str = cp; else
file_names[num_file_names].len = d_namlen; continue; // was a device file or somesuch
num_file_names++; }
if (filetype == TP_FTW_NORMAL)
{
char *cp;
if (num_file_names == max_file_names)
{
max_file_names = max_file_names * 5 / 4 + 30;
file_names = realloc(file_names, max_file_names * sizeof *file_names);
}
cp = malloc(d_namlen + add_rsrc + 1);
memcpy(cp, f->d_name, d_namlen);
if (add_rsrc)
memcpy(cp + d_namlen, "/rsrc", 6);
else
cp[d_namlen] = '\0';
file_names[num_file_names].str = cp;
file_names[num_file_names].len = d_namlen;
num_file_names++;
}
if (filetype == TP_FTW_DIRECTORY)
{
char *cp;
if (num_dir_names == max_dir_names)
{
max_dir_names = max_dir_names * 5 / 4 + 3;
dir_names = realloc(dir_names, max_dir_names * sizeof *dir_names);
}
cp = malloc(d_namlen + 1);
memcpy(cp, f->d_name, d_namlen + 1);
dir_names[num_dir_names].str = cp;
dir_names[num_dir_names].len = d_namlen;
num_dir_names++;
}
} }
if (filetype == TP_FTW_DIRECTORY)
{
char *cp;
if (num_dir_names == max_dir_names)
{
max_dir_names = max_dir_names * 5 / 4 + 3;
dir_names = realloc(dir_names, max_dir_names * sizeof *dir_names);
}
cp = malloc(d_namlen + 1);
memcpy(cp, f->d_name, d_namlen + 1);
dir_names[num_dir_names].str = cp;
dir_names[num_dir_names].len = d_namlen;
num_dir_names++;
}
}
closedir(d); closedir(d);
show_progress_bar(screen); show_progress_bar(screen);
dir[dirlen] = '\0'; // repair it (clobbered for stat() call above) dir[dirlen] = '\0'; // repair it (clobbered for stat() call above)
if (1 || file_names) // Now ALWAYS calling callback function, so stamp loader can notice top-level directories (even if there are only subdirs, and no files, inside) -bjk 2007.05.16 if (1 || file_names) // Now ALWAYS calling callback function, so stamp loader can notice top-level directories (even if there are only subdirs, and no files, inside) -bjk 2007.05.16
{ {
// let callee sort and keep the string // let callee sort and keep the string
#if 0 #if 0
qsort(file_names, num_file_names, sizeof *file_names, compare_ftw_str); qsort(file_names, num_file_names, sizeof *file_names, compare_ftw_str);
while (num_file_names--) while (num_file_names--)
{ {
free(file_names[num_file_names].str); free(file_names[num_file_names].str);
} }
free(file_names); free(file_names);
#else #else
fn(screen, dir, dirlen, file_names, num_file_names, locale); fn(screen, dir, dirlen, file_names, num_file_names, locale);
#endif #endif
} }
if (dir_names) if (dir_names)
{
qsort(dir_names, num_dir_names, sizeof *dir_names, compare_ftw_str);
while (num_dir_names--)
{ {
memcpy(dir + dirlen, dir_names[num_dir_names].str, qsort(dir_names, num_dir_names, sizeof *dir_names, compare_ftw_str);
dir_names[num_dir_names].len + 1); while (num_dir_names--)
tp_ftw(screen, dir, dirlen + dir_names[num_dir_names].len, rsrc, fn, locale); {
free(dir_names[num_dir_names].str); memcpy(dir + dirlen, dir_names[num_dir_names].str, dir_names[num_dir_names].len + 1);
tp_ftw(screen, dir, dirlen + dir_names[num_dir_names].len, rsrc, fn, locale);
free(dir_names[num_dir_names].str);
}
free(dir_names);
} }
free(dir_names);
}
} }

View file

@ -46,13 +46,13 @@ typedef struct tp_ftw_str
void loadfont_callback(SDL_Surface * screen, const char *restrict const dir, void loadfont_callback(SDL_Surface * screen, const char *restrict const dir,
unsigned dirlen, tp_ftw_str * files, unsigned i, const char *restrict const locale); unsigned dirlen, tp_ftw_str * files, unsigned i, const char *restrict const locale);
int compare_ftw_str(const void *v1, const void *v2); int compare_ftw_str(const void *v1, const void *v2);
void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen, void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen,
int rsrc, void (*fn) (SDL_Surface * screen, int rsrc, void (*fn) (SDL_Surface * screen,
const char *restrict const dir, const char *restrict const dir,
unsigned dirlen, tp_ftw_str * files, unsigned dirlen, tp_ftw_str * files,
unsigned count, const char *restrict const locale), unsigned count, const char *restrict const locale),
const char *restrict const locale); const char *restrict const locale);
#endif #endif