示例#1
0
文件: plugins.c 项目: simi/fontforge
void LoadPluginDir(char *dir) {
    DIR *diro;
    struct dirent *ent;
    char buffer[1025];

    if ( dir==NULL ) {
	/* First load system plug-ins */
#if defined( PLUGINDIR )
	LoadPluginDir( PLUGINDIR );
#else
	char *pt = getFontForgeShareDir();
	if ( pt!=NULL ) {
	    snprintf(buffer, sizeof(buffer), "%s/plugins", pt );
	    LoadPluginDir( buffer );
	}
#endif
	/* Then load user defined ones */
	if ( getPfaEditDir(buffer)!=NULL ) {
	    strcpy(buffer,getPfaEditDir(buffer));
	    strcat(buffer,"/plugins");
	    LoadPluginDir(buffer);
	}
return;
    }

    diro = opendir(dir);
    if ( diro==NULL )		/* It's ok not to have any plugins */
return;

    while ( (ent = readdir(diro))!=NULL ) {
	if ( isdyname(ent->d_name) ) {
	    sprintf( buffer, "%s/%s", dir, ent->d_name );
	    LoadPlugin(buffer);
	}
    }
    closedir(diro);
}
struct cidmap *AskUserForCIDMap(void) {
    struct block block;
    struct cidmap *map = NULL;
    char buffer[200];
    char **choices;
    int i,ret;
    char *filename=NULL;
    char *reg, *ord, *pt;
    int supplement;

    memset(&block,'\0',sizeof(block));
    for ( map = cidmaps; map!=NULL; map = map->next ) {
        sprintf(buffer,"%s-%s-%d", map->registry, map->ordering, map->supplement);
        AddToBlock(&block,buffer,NULL);
    }
    FindMapsInDir(&block,".");
    FindMapsInDir(&block,GResourceProgramDir);
    FindMapsInNoLibsDir(&block,GResourceProgramDir);
    FindMapsInDir(&block,getFontForgeShareDir());
    FindMapsInDir(&block,"/usr/share/fontforge");

    choices = gcalloc(block.cur+2,sizeof(unichar_t *));
    choices[0] = copy(_("Browse..."));
    for ( i=0; i<block.cur; ++i )
        choices[i+1] = copy(block.maps[i]);
    ret = gwwv_choose(_("Find a cidmap file..."),(const char **) choices,i+1,0,_("Please select a CID ordering"));
    for ( i=0; i<=block.cur; ++i )
        free( choices[i] );
    free(choices);
    if ( ret==0 ) {
        filename = gwwv_open_filename(_("Find a cidmap file..."),NULL,
                                      "?*-?*-[0-9]*.cidmap",NULL);
        if ( filename==NULL )
            ret = -1;
    }
    if ( ret!=-1 ) {
        if ( filename!=NULL )
            /* Do nothing for now */;
        else if ( block.dirs[ret-1]!=NULL ) {
            filename = galloc(strlen(block.dirs[ret-1])+strlen(block.maps[ret-1])+3+8);
            strcpy(filename,block.dirs[ret-1]);
            strcat(filename,"/");
            strcat(filename,block.maps[ret-1]);
            strcat(filename,".cidmap");
        }
        if ( ret!=0 )
            reg = block.maps[ret-1];
        else {
            reg = strrchr(filename,'/');
            if ( reg==NULL ) reg = filename;
            else ++reg;
            reg = copy(reg);
        }
        pt = strchr(reg,'-');
        if ( pt==NULL )
            ret = -1;
        else {
            *pt = '\0';
            ord = pt+1;
            pt = strchr(ord,'-');
            if ( pt==NULL )
                ret = -1;
            else {
                *pt = '\0';
                supplement = strtol(pt+1,NULL,10);
            }
        }
        if ( ret == -1 )
            /* No map */;
        else if ( filename==NULL )
            map = FindCidMap(reg,ord,supplement,NULL);
        else {
            map = LoadMapFromFile(filename,reg,ord,supplement);
            free(filename);
        }
        if ( ret!=0 && reg!=block.maps[ret-1] )
            free(reg);
        /*free(filename);*/	/* Freed by loadmap */
    }
    for ( i=0; i<block.cur; ++i )
        free( block.maps[i]);
    free(block.maps);
    free(block.dirs);
    return( map );
}