dir.c revision 23a0898a
123a0898aSmrg/* 223a0898aSmrg * Id: dir.c,v 1.2 1999/11/02 06:16:47 keithp Exp $ 323a0898aSmrg * 423a0898aSmrg * Copyright 1999 SuSE, Inc. 523a0898aSmrg * 623a0898aSmrg * Permission to use, copy, modify, distribute, and sell this software and its 723a0898aSmrg * documentation for any purpose is hereby granted without fee, provided that 823a0898aSmrg * the above copyright notice appear in all copies and that both that 923a0898aSmrg * copyright notice and this permission notice appear in supporting 1023a0898aSmrg * documentation, and that the name of SuSE not be used in advertising or 1123a0898aSmrg * publicity pertaining to distribution of the software without specific, 1223a0898aSmrg * written prior permission. SuSE makes no representations about the 1323a0898aSmrg * suitability of this software for any purpose. It is provided "as is" 1423a0898aSmrg * without express or implied warranty. 1523a0898aSmrg * 1623a0898aSmrg * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL 1723a0898aSmrg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE 1823a0898aSmrg * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1923a0898aSmrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 2023a0898aSmrg * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 2123a0898aSmrg * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 2223a0898aSmrg * 2323a0898aSmrg * Author: Keith Packard, SuSE, Inc. 2423a0898aSmrg */ 2523a0898aSmrg/* $XFree86: xc/lib/font/builtins/dir.c,v 1.3 1999/12/30 02:29:49 robin Exp $ */ 2623a0898aSmrg 2723a0898aSmrg#ifdef HAVE_CONFIG_H 2823a0898aSmrg#include <config.h> 2923a0898aSmrg#endif 3023a0898aSmrg#include "builtin.h" 3123a0898aSmrg 3223a0898aSmrgstatic BuiltinDirPtr 3323a0898aSmrgBuiltinDirsDup (const BuiltinDirPtr a_dirs, 3423a0898aSmrg int a_dirs_len) 3523a0898aSmrg{ 3623a0898aSmrg BuiltinDirPtr dirs=NULL ; 3723a0898aSmrg int i=0 ; 3823a0898aSmrg 3923a0898aSmrg if (!a_dirs) 4023a0898aSmrg return NULL ; 4123a0898aSmrg 4223a0898aSmrg dirs = xcalloc (a_dirs_len, sizeof (BuiltinDirRec)) ; 4323a0898aSmrg if (!dirs) 4423a0898aSmrg return NULL ; 4523a0898aSmrg 4623a0898aSmrg for (i=0; i < a_dirs_len; i++) { 4723a0898aSmrg int len = strlen (a_dirs[i].file_name) ; 4823a0898aSmrg dirs[i].file_name = xcalloc (1, len) ; 4923a0898aSmrg memmove (dirs[i].file_name, a_dirs[i].file_name, len); 5023a0898aSmrg len = strlen (a_dirs[i].font_name) ; 5123a0898aSmrg dirs[i].font_name = xcalloc (1, len) ; 5223a0898aSmrg memmove (dirs[i].font_name, a_dirs[i].font_name, len); 5323a0898aSmrg } 5423a0898aSmrg return dirs ; 5523a0898aSmrg} 5623a0898aSmrg 5723a0898aSmrg/** 5823a0898aSmrg * Copy a_save back into a_cur 5923a0898aSmrg * @param a_cur the instance of BuiltinDir to restore 6023a0898aSmrg * @param a_saved the saved instance of BuiltinDir to copy into a_cur 6123a0898aSmrg * @return 0 if went okay, 1 otherwise. 6223a0898aSmrg */ 6323a0898aSmrgstatic int 6423a0898aSmrgBuiltinDirRestore (BuiltinDirPtr a_cur, 6523a0898aSmrg const BuiltinDirPtr a_saved) 6623a0898aSmrg{ 6723a0898aSmrg if (!a_cur) 6823a0898aSmrg return 1 ; 6923a0898aSmrg if (!a_saved) 7023a0898aSmrg return 0 ; 7123a0898aSmrg 7223a0898aSmrg if (a_saved->font_name) 7323a0898aSmrg memmove (a_cur->font_name, a_saved->font_name, strlen (a_saved->font_name)) ; 7423a0898aSmrg return 0 ; 7523a0898aSmrg} 7623a0898aSmrg 7723a0898aSmrg 7823a0898aSmrgstatic int 7923a0898aSmrgBuiltinDirsRestore (BuiltinDirPtr a_cur_tab, 8023a0898aSmrg const BuiltinDirPtr a_saved_tab, 8123a0898aSmrg int a_tab_len) 8223a0898aSmrg{ 8323a0898aSmrg int i=0 ; 8423a0898aSmrg 8523a0898aSmrg if (!a_cur_tab) 8623a0898aSmrg return 1 ; 8723a0898aSmrg if (!a_saved_tab) 8823a0898aSmrg return 0 ; 8923a0898aSmrg 9023a0898aSmrg for (i=0 ; i < a_tab_len; i++) { 9123a0898aSmrg if (BuiltinDirRestore (&a_cur_tab[i], &a_saved_tab[i])) 9223a0898aSmrg return 1 ; 9323a0898aSmrg } 9423a0898aSmrg return 0 ; 9523a0898aSmrg} 9623a0898aSmrg 9723a0898aSmrgstatic BuiltinAliasPtr 9823a0898aSmrgBuiltinAliasesDup (const BuiltinAliasPtr a_aliases, 9923a0898aSmrg int a_aliases_len) 10023a0898aSmrg{ 10123a0898aSmrg BuiltinAliasPtr aliases=NULL ; 10223a0898aSmrg int i=0 ; 10323a0898aSmrg 10423a0898aSmrg if (!a_aliases) 10523a0898aSmrg return NULL ; 10623a0898aSmrg 10723a0898aSmrg aliases = xcalloc (a_aliases_len, sizeof (BuiltinAliasRec)) ; 10823a0898aSmrg if (!aliases) 10923a0898aSmrg return NULL ; 11023a0898aSmrg 11123a0898aSmrg for (i=0; i < a_aliases_len; i++) { 11223a0898aSmrg int len = strlen (a_aliases[i].font_name) ; 11323a0898aSmrg aliases[i].font_name = xcalloc (1, len) ; 11423a0898aSmrg memmove (aliases[i].font_name, a_aliases[i].font_name, len); 11523a0898aSmrg } 11623a0898aSmrg return aliases ; 11723a0898aSmrg} 11823a0898aSmrg 11923a0898aSmrg/** 12023a0898aSmrg * Copy a_save back into a_cur 12123a0898aSmrg * @param a_cur the instance of BuiltinAlias to restore 12223a0898aSmrg * @param a_saved the saved instance of BuiltinAlias to copy into a_cur 12323a0898aSmrg * @return 0 if went okay, 1 otherwise. 12423a0898aSmrg */ 12523a0898aSmrgstatic int 12623a0898aSmrgBuiltinAliasRestore (BuiltinAliasPtr a_cur, 12723a0898aSmrg const BuiltinAliasPtr a_save) 12823a0898aSmrg{ 12923a0898aSmrg if (!a_cur) 13023a0898aSmrg return 1 ; 13123a0898aSmrg if (!a_save) 13223a0898aSmrg return 0 ; 13323a0898aSmrg if (a_save->alias_name) 13423a0898aSmrg memmove (a_cur->alias_name, a_save->alias_name, strlen (a_save->alias_name)) ; 13523a0898aSmrg if (a_save->font_name) 13623a0898aSmrg memmove (a_cur->font_name, a_save->font_name, strlen (a_save->font_name)) ; 13723a0898aSmrg return 0 ; 13823a0898aSmrg} 13923a0898aSmrg 14023a0898aSmrgstatic int 14123a0898aSmrgBuiltinAliasesRestore (BuiltinAliasPtr a_cur_tab, 14223a0898aSmrg const BuiltinAliasPtr a_saved_tab, 14323a0898aSmrg int a_tab_len) 14423a0898aSmrg{ 14523a0898aSmrg int i=0 ; 14623a0898aSmrg 14723a0898aSmrg if (!a_cur_tab) 14823a0898aSmrg return 1 ; 14923a0898aSmrg if (!a_saved_tab) 15023a0898aSmrg return 0 ; 15123a0898aSmrg 15223a0898aSmrg for (i=0 ; i < a_tab_len; i++) { 15323a0898aSmrg if (BuiltinAliasRestore (&a_cur_tab[i], &a_saved_tab[i])) 15423a0898aSmrg return 1 ; 15523a0898aSmrg } 15623a0898aSmrg return 0 ; 15723a0898aSmrg} 15823a0898aSmrg 15923a0898aSmrgint 16023a0898aSmrgBuiltinReadDirectory (char *directory, FontDirectoryPtr *pdir) 16123a0898aSmrg{ 16223a0898aSmrg FontDirectoryPtr dir; 16323a0898aSmrg int i; 16423a0898aSmrg 16523a0898aSmrg static BuiltinDirPtr saved_builtin_dir; 16623a0898aSmrg static BuiltinAliasPtr saved_builtin_alias; 16723a0898aSmrg 16823a0898aSmrg dir = FontFileMakeDir ("", builtin_dir_count); 16923a0898aSmrg 17023a0898aSmrg if (saved_builtin_dir) 17123a0898aSmrg { 17223a0898aSmrg BuiltinDirsRestore ((BuiltinDirPtr) builtin_dir, 17323a0898aSmrg saved_builtin_dir, 17423a0898aSmrg builtin_dir_count) ; 17523a0898aSmrg } 17623a0898aSmrg else 17723a0898aSmrg { 17823a0898aSmrg saved_builtin_dir = BuiltinDirsDup ((const BuiltinDirPtr) builtin_dir, 17923a0898aSmrg builtin_dir_count) ; 18023a0898aSmrg } 18123a0898aSmrg 18223a0898aSmrg if (saved_builtin_alias) 18323a0898aSmrg { 18423a0898aSmrg BuiltinAliasesRestore ((BuiltinAliasPtr) builtin_alias, 18523a0898aSmrg saved_builtin_alias, 18623a0898aSmrg builtin_alias_count) ; 18723a0898aSmrg } 18823a0898aSmrg else 18923a0898aSmrg { 19023a0898aSmrg saved_builtin_alias = BuiltinAliasesDup ((const BuiltinAliasPtr) builtin_alias, 19123a0898aSmrg builtin_alias_count) ; 19223a0898aSmrg } 19323a0898aSmrg 19423a0898aSmrg for (i = 0; i < builtin_dir_count; i++) 19523a0898aSmrg { 19623a0898aSmrg if (!FontFileAddFontFile (dir, 19723a0898aSmrg (char *) builtin_dir[i].font_name, 19823a0898aSmrg (char *) builtin_dir[i].file_name)) 19923a0898aSmrg { 20023a0898aSmrg FontFileFreeDir (dir); 20123a0898aSmrg return BadFontPath; 20223a0898aSmrg } 20323a0898aSmrg } 20423a0898aSmrg for (i = 0; i < builtin_alias_count; i++) 20523a0898aSmrg { 20623a0898aSmrg if (!FontFileAddFontAlias (dir, 20723a0898aSmrg (char *) builtin_alias[i].alias_name, 20823a0898aSmrg (char *) builtin_alias[i].font_name)) 20923a0898aSmrg { 21023a0898aSmrg FontFileFreeDir (dir); 21123a0898aSmrg return BadFontPath; 21223a0898aSmrg } 21323a0898aSmrg } 21423a0898aSmrg FontFileSortDir (dir); 21523a0898aSmrg *pdir = dir; 21623a0898aSmrg return Successful; 21723a0898aSmrg} 218