2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2002 - 2005 Roman Zippel < zippel @ linux - m68k . org >
* Copyright ( C ) 2002 - 2005 Sam Ravnborg < sam @ ravnborg . org >
*
* Released under the terms of the GNU GPL v2 .0 .
*/
2011-06-02 00:00:46 +04:00
# include <stdarg.h>
2011-06-02 00:08:14 +04:00
# include <stdlib.h>
2005-04-17 02:20:36 +04:00
# include <string.h>
# include "lkc.h"
/* file already present in list? If not add it */
struct file * file_lookup ( const char * name )
{
struct file * file ;
2010-09-05 00:11:26 +04:00
const char * file_name = sym_expand_string_value ( name ) ;
2005-04-17 02:20:36 +04:00
for ( file = file_list ; file ; file = file - > next ) {
2010-09-05 00:11:26 +04:00
if ( ! strcmp ( name , file - > name ) ) {
free ( ( void * ) file_name ) ;
2005-04-17 02:20:36 +04:00
return file ;
2010-09-05 00:11:26 +04:00
}
2005-04-17 02:20:36 +04:00
}
2012-11-06 18:32:08 +04:00
file = xmalloc ( sizeof ( * file ) ) ;
2005-04-17 02:20:36 +04:00
memset ( file , 0 , sizeof ( * file ) ) ;
2010-09-05 00:11:26 +04:00
file - > name = file_name ;
2005-04-17 02:20:36 +04:00
file - > next = file_list ;
file_list = file ;
return file ;
}
/* write a dependency file as used by kbuild to track dependencies */
int file_write_dep ( const char * name )
{
2008-01-14 06:50:54 +03:00
struct symbol * sym , * env_sym ;
struct expr * e ;
2005-04-17 02:20:36 +04:00
struct file * file ;
FILE * out ;
if ( ! name )
2005-12-27 01:34:03 +03:00
name = " .kconfig.d " ;
2005-04-17 02:20:36 +04:00
out = fopen ( " ..config.tmp " , " w " ) ;
if ( ! out )
return 1 ;
fprintf ( out , " deps_config := \\ \n " ) ;
for ( file = file_list ; file ; file = file - > next ) {
if ( file - > next )
fprintf ( out , " \t %s \\ \n " , file - > name ) ;
else
fprintf ( out , " \t %s \n " , file - > name ) ;
}
2009-05-18 03:36:54 +04:00
fprintf ( out , " \n %s: \\ \n "
" \t $(deps_config) \n \n " , conf_get_autoconfig_name ( ) ) ;
2008-01-14 06:50:54 +03:00
expr_list_for_each_sym ( sym_env_list , e , sym ) {
struct property * prop ;
const char * value ;
prop = sym_get_env_prop ( sym ) ;
env_sym = prop_get_symbol ( prop ) ;
if ( ! env_sym )
continue ;
value = getenv ( env_sym - > name ) ;
if ( ! value )
value = " " ;
fprintf ( out , " ifneq \" $(%s) \" \" %s \" \n " , env_sym - > name , value ) ;
2009-05-18 03:36:54 +04:00
fprintf ( out , " %s: FORCE \n " , conf_get_autoconfig_name ( ) ) ;
2008-01-14 06:50:54 +03:00
fprintf ( out , " endif \n " ) ;
}
fprintf ( out , " \n $(deps_config): ; \n " ) ;
2005-04-17 02:20:36 +04:00
fclose ( out ) ;
rename ( " ..config.tmp " , name ) ;
return 0 ;
}
2010-02-19 14:43:44 +03:00
/* Allocate initial growable string */
2005-04-17 02:20:36 +04:00
struct gstr str_new ( void )
{
struct gstr gs ;
2012-11-06 18:32:08 +04:00
gs . s = xmalloc ( sizeof ( char ) * 64 ) ;
2008-05-19 01:10:24 +04:00
gs . len = 64 ;
2009-12-20 11:29:49 +03:00
gs . max_width = 0 ;
2005-04-17 02:20:36 +04:00
strcpy ( gs . s , " \0 " ) ;
return gs ;
}
/* Free storage for growable string */
void str_free ( struct gstr * gs )
{
if ( gs - > s )
free ( gs - > s ) ;
gs - > s = NULL ;
gs - > len = 0 ;
}
/* Append to growable string */
void str_append ( struct gstr * gs , const char * s )
{
2007-09-19 23:23:09 +04:00
size_t l ;
if ( s ) {
l = strlen ( gs - > s ) + strlen ( s ) + 1 ;
if ( l > gs - > len ) {
gs - > s = realloc ( gs - > s , l ) ;
gs - > len = l ;
}
strcat ( gs - > s , s ) ;
2005-04-17 02:20:36 +04:00
}
}
/* Append printf formatted string to growable string */
void str_printf ( struct gstr * gs , const char * fmt , . . . )
{
va_list ap ;
char s [ 10000 ] ; /* big enough... */
va_start ( ap , fmt ) ;
vsnprintf ( s , sizeof ( s ) , fmt , ap ) ;
str_append ( gs , s ) ;
va_end ( ap ) ;
}
2006-01-03 15:27:11 +03:00
/* Retrieve value of growable string */
2005-04-17 02:20:36 +04:00
const char * str_get ( struct gstr * gs )
{
return gs - > s ;
}
2012-11-06 18:32:08 +04:00
void * xmalloc ( size_t size )
{
void * p = malloc ( size ) ;
if ( p )
return p ;
fprintf ( stderr , " Out of memory. \n " ) ;
exit ( 1 ) ;
}
void * xcalloc ( size_t nmemb , size_t size )
{
void * p = calloc ( nmemb , size ) ;
if ( p )
return p ;
fprintf ( stderr , " Out of memory. \n " ) ;
exit ( 1 ) ;
}