Commit d6037fa3 authored by smorlat's avatar smorlat

add doxygen framework to start documenting liblinphone

enhance lpconfig to be able to load additional config files.

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@781 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
parent 7c81a337
......@@ -390,12 +390,23 @@ changequote([, ])dnl
AC_SUBST([ORTP_VERSION])
AC_SUBST([MS2_VERSION])
dnl ##################################################
dnl # Check for doxygen
dnl ##################################################
AC_PATH_PROG(DOXYGEN,doxygen,false)
AM_CONDITIONAL(HAVE_DOXYGEN, test $DOXYGEN != false)
AC_OUTPUT([
Makefile
m4/Makefile
po/Makefile.in
pixmaps/Makefile
coreapi/Makefile
coreapi/help/Makefile
coreapi/help/Doxyfile
coreapi/help/doxygen.dox
gtk-glade/Makefile
console/Makefile
share/Makefile
......
SUBDIRS=help
## Process this file with automake to produce Makefile.in
linphone_includedir=$(includedir)/linphone
......
......@@ -646,6 +646,21 @@ void linphone_core_remove_friend(LinphoneCore *lc, LinphoneFriend* fl){
}
}
void linphone_friend_set_ref_key(LinphoneFriend *lf, const char *key){
if (lf->refkey!=NULL){
ms_free(lf->refkey);
lf->refkey=NULL;
}
if (key)
lf->refkey=ms_strdup(key);
if (lf->lc)
linphone_core_write_friends_config(lf->lc);
}
const char *linphone_friend_get_ref_key(const LinphoneFriend *lf){
return lf->refkey;
}
static bool_t username_match(const char *u1, const char *u2){
if (u1==NULL && u2==NULL) return TRUE;
if (u1 && u2 && strcasecmp(u1,u2)==0) return TRUE;
......@@ -675,6 +690,18 @@ LinphoneFriend *linphone_core_get_friend_by_uri(const LinphoneCore *lc, const ch
return lf;
}
LinphoneFriend *linphone_core_get_friend_by_ref_key(const LinphoneCore *lc, const char *key){
const MSList *elem;
if (key==NULL) return NULL;
for(elem=linphone_core_get_friend_list(lc);elem!=NULL;elem=elem->next){
LinphoneFriend *lf=(LinphoneFriend*)elem->data;
if (lf->refkey!=NULL && strcmp(lf->refkey,key)==0){
return lf;
}
}
return NULL;
}
#define key_compare(key, word) strncasecmp((key),(word),strlen(key))
LinphoneSubscribePolicy __policy_str_to_enum(const char* pol){
......@@ -729,6 +756,7 @@ LinphoneFriend * linphone_friend_new_from_config_file(LinphoneCore *lc, int inde
if (a!=-1) {
linphone_friend_set_proxy(lf,__index_to_proxy(lc,a));
}
linphone_friend_set_ref_key(lf,lp_config_get_string(config,item,"refkey",NULL));
return lf;
}
......@@ -752,6 +780,7 @@ void linphone_friend_write_to_config_file(LpConfig *config, LinphoneFriend *lf,
char key[50];
char *tmp;
int a;
const char *refkey;
sprintf(key,"friend_%i",index);
......@@ -773,6 +802,11 @@ void linphone_friend_write_to_config_file(LpConfig *config, LinphoneFriend *lf,
a=ms_list_index(lf->lc->sip_conf.proxies,lf->proxy);
lp_config_set_int(config,key,"proxy",a);
}else lp_config_set_int(config,key,"proxy",-1);
refkey=linphone_friend_get_ref_key(lf);
if (refkey){
lp_config_set_string(config,key,"refkey",refkey);
}
}
void linphone_core_write_friends_config(LinphoneCore* lc)
......
# Doxyfile 1.4.1
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
PROJECT_NAME = liblinphone
PROJECT_NUMBER = @LINPHONE_VERSION@
OUTPUT_DIRECTORY = doc
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
USE_WINDOWS_ENCODING = NO
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP = NO
INHERIT_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO
TAB_SIZE = 8
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
SUBGROUPING = YES
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
HIDE_UNDOC_MEMBERS = YES
HIDE_UNDOC_CLASSES = YES
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = NO
SORT_BRIEF_DOCS = NO
SORT_BY_SCOPE_NAME = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = YES
FILE_VERSION_FILTER =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = . ../
FILE_PATTERNS = *.h \
*.c \
*.dox
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXAMPLE_PATH = ../
EXAMPLE_PATTERNS =
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
VERBATIM_HEADERS = NO
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
BINARY_TOC = NO
TOC_EXPAND = NO
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 1
GENERATE_TREEVIEW = NO
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = YES
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
PDF_HYPERLINKS = NO
USE_PDFLATEX = NO
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = YES
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH = .
INCLUDE_FILE_PATTERNS = *.h
PREDEFINED = DOXYGEN
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
TEMPLATE_RELATIONS = YES
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1024
MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = NO
EXTRA_DIST = Doxyfile.in doxygen.dox.in
SOURCES=$(top_srcdir)/coreapi/*.h
#html doc
if HAVE_DOXYGEN
# doxdir & pkgdocdir are not always defined by automake
docdir=$(datadir)/doc
pkgdocdir=$(docdir)/$(PACKAGE)-$(VERSION)
doc_htmldir=$(pkgdocdir)/html
doc_html_DATA = $(top_builddir)/coreapi/help/doc/html/html.tar
$(doc_html_DATA): $(top_builddir)/coreapi/help/doc/html/index.html
cd $(<D) && tar cf html.tar *
$(top_builddir)/coreapi/help/doc/html/index.html: $(SOURCES) Doxyfile Makefile.am
rm -rf doc
$(DOXYGEN) Doxyfile
install-data-hook:
cd $(DESTDIR)$(doc_htmldir) && tar xf html.tar && rm -f html.tar
uninstall-hook:
cd $(DESTDIR)$(doc_htmldir) && rm -f *
endif
clean-local:
rm -rf doc
\ No newline at end of file
/**
* @mainpage
* Project Website: http://savannah.gnu.org/projects/linphone
*
* @verbinclude README
*
*/
/**
* @defgroup liblinphone liblinphone library - high level library for building SIP applications
* @brief liblinphone Version @LINPHONE_VERSION@
*
* @see http://savannah.gnu.org/projects/linphone
*
* @section what_is_it What is liblinphone
*
* Liblinphone is a high level library for bringing SIP video call functionnality
* into an application. It aims at making easy the integration of the SIP
* video calls into any applications. All variants of linphone are directly based
* on it:
* - linphone (gtk interface)
* - linphonec (console interface)
* Liblinphone is GPL (see COPYING file). Please understand the licencing details
* before using it!
*
* For any use of this library beyond the rights granted to you by the
* GPL license, please contact Belledonne Communications
* (contact@belledonne-communications.com)
*
*
/**
* @page liblinphone_license COPYING
* @verbinclude COPYING
*/
......@@ -885,7 +885,7 @@ int linphone_core_set_video_codecs(LinphoneCore *lc, MSList *codecs)
return 0;
}
const MSList * linphone_core_get_friend_list(LinphoneCore *lc)
const MSList * linphone_core_get_friend_list(const LinphoneCore *lc)
{
return lc->friends;
}
......
......@@ -234,6 +234,7 @@ typedef struct _LinphoneFriend{
struct _LinphoneProxyConfig *proxy;
struct _LinphoneCore *lc;
BuddyInfo *info;
char *refkey;
bool_t subscribe;
bool_t inc_subscribe_pending;
}LinphoneFriend;
......@@ -253,6 +254,8 @@ bool_t linphone_friend_get_send_subscribe(const LinphoneFriend *lf);
LinphoneSubscribePolicy linphone_friend_get_inc_subscribe_policy(const LinphoneFriend *lf);
LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf);
BuddyInfo * linphone_friend_get_info(const LinphoneFriend *lf);
void linphone_friend_set_ref_key(LinphoneFriend *lf, const char *key);
const char *linphone_friend_get_ref_key(const LinphoneFriend *lf);
#define linphone_friend_in_list(lf) ((lf)->lc!=NULL)
#define linphone_friend_url(lf) ((lf)->url)
......@@ -547,9 +550,6 @@ const char *linphone_core_get_version(void);
LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable,
const char *config_path, void* userdata);
void linphone_core_init(LinphoneCore *lc, const LinphoneCoreVTable *vtable,
const char *config_path, void * userdata);
/* function to be periodically called in a main loop */
void linphone_core_iterate(LinphoneCore *lc);
......@@ -721,10 +721,11 @@ void linphone_core_add_friend(LinphoneCore *lc, LinphoneFriend *fr);
void linphone_core_remove_friend(LinphoneCore *lc, LinphoneFriend *fr);
void linphone_core_reject_subscriber(LinphoneCore *lc, LinphoneFriend *lf);
/* a list of LinphoneFriend */
const MSList * linphone_core_get_friend_list(LinphoneCore *lc);
const MSList * linphone_core_get_friend_list(const LinphoneCore *lc);
/* notify all friends that have subscribed */
void linphone_core_notify_all_friends(LinphoneCore *lc, LinphoneOnlineStatus os);
LinphoneFriend *linphone_core_get_friend_by_uri(const LinphoneCore *lc, const char *uri);
LinphoneFriend *linphone_core_get_friend_by_ref_key(const LinphoneCore *lc, const char *key);
/* returns a list of LinphoneCallLog */
const MSList * linphone_core_get_call_logs(LinphoneCore *lc);
......@@ -793,7 +794,6 @@ void linphone_core_set_waiting_callback(LinphoneCore *lc, LinphoneWaitingCallbac
/*returns the list of registered SipSetup (linphonecore plugins) */
const MSList * linphone_core_get_sip_setups(LinphoneCore *lc);
void linphone_core_uninit(LinphoneCore *lc);
void linphone_core_destroy(LinphoneCore *lc);
/*for advanced users:*/
......
......@@ -38,49 +38,6 @@
#include "lpconfig.h"
#define LISTNODE(_struct_) \
struct _struct_ *_prev;\
struct _struct_ *_next;
typedef struct _ListNode{
LISTNODE(_ListNode)
} ListNode;
typedef void (*ListNodeForEachFunc)(ListNode *);
ListNode * list_node_append(ListNode *head,ListNode *elem){
ListNode *e=head;
while(e->_next!=NULL) e=e->_next;
e->_next=elem;
elem->_prev=e;
return head;
}
ListNode * list_node_remove(ListNode *head, ListNode *elem){
ListNode *before,*after;
before=elem->_prev;
after=elem->_next;
if (before!=NULL) before->_next=after;
if (after!=NULL) after->_prev=before;
elem->_prev=NULL;
elem->_next=NULL;
if (head==elem) return after;
return head;
}
void list_node_foreach(ListNode *head, ListNodeForEachFunc func){
for (;head!=NULL;head=head->_next){
func(head);
}
}
#define LIST_PREPEND(e1,e2) ( (e2)->_prev=NULL,(e2)->_next=(e1),(e1)->_prev=(e2),(e2) )
#define LIST_APPEND(head,elem) ((head)==0 ? (elem) : (list_node_append((ListNode*)(head),(ListNode*)(elem)), (head)) )
#define LIST_REMOVE(head,elem)
/* returns void */
#define LIST_FOREACH(head) list_node_foreach((ListNode*)head)
typedef struct _LpItem{
char *key;
......@@ -148,13 +105,41 @@ static bool_t is_first_char(const char *start, const char *pos){
return TRUE;
}
void lp_config_parse(LpConfig *lpconfig){
LpSection *lp_config_find_section(LpConfig *lpconfig, const char *name){
LpSection *sec;
MSList *elem;
/*printf("Looking for section %s\n",name);*/
for (elem=lpconfig->sections;elem!=NULL;elem=ms_list_next(elem)){
sec=(LpSection*)elem->data;
if (strcmp(sec->name,name)==0){
/*printf("Section %s found\n",name);*/
return sec;
}
}
return NULL;
}
LpItem *lp_section_find_item(LpSection *sec, const char *name){
MSList *elem;
LpItem *item;
/*printf("Looking for item %s\n",name);*/
for (elem=sec->items;elem!=NULL;elem=ms_list_next(elem)){
item=(LpItem*)elem->data;
if (strcmp(item->key,name)==0) {
/*printf("Item %s found\n",name);*/
return item;
}
}
return NULL;
}
void lp_config_parse(LpConfig *lpconfig, FILE *file){
char tmp[MAX_LEN];
LpSection *cur=NULL;
if (lpconfig->file==NULL) return;
if (file==NULL) return;
while(fgets(tmp,MAX_LEN,lpconfig->file)!=NULL){
while(fgets(tmp,MAX_LEN,file)!=NULL){
char *pos1,*pos2;
pos1=strchr(tmp,'[');
if (pos1!=NULL && is_first_char(tmp,pos1) ){
......@@ -168,8 +153,11 @@ void lp_config_parse(LpConfig *lpconfig){
nbs = sscanf(pos1+1,"%s",secname);
if (nbs == 1 ){
if (strlen(secname)>0){
cur=lp_section_new(secname);
lp_config_add_section(lpconfig,cur);
cur=lp_config_find_section (lpconfig,secname);
if (cur==NULL){
cur=lp_section_new(secname);
lp_config_add_section(lpconfig,cur);
}
}
}else{
ms_warning("parse error!");
......@@ -196,7 +184,13 @@ void lp_config_parse(LpConfig *lpconfig){
if (pos2-pos1>=0){
/* found a pair key,value */
if (cur!=NULL){
lp_section_add_item(cur,lp_item_new(key,pos1));
LpItem *item=lp_section_find_item(cur,key);
if (item==NULL){
lp_section_add_item(cur,lp_item_new(key,pos1));
}else{
ms_free(item->value);
item->value=strdup(pos1);
}
/*printf("Found %s %s=%s\n",cur->name,key,pos1);*/
}else{
ms_warning("found key,item but no sections");
......@@ -214,8 +208,8 @@ LpConfig * lp_config_new(const char *filename){
lpconfig->filename=strdup(filename);
lpconfig->file=fopen(filename,"rw");
if (lpconfig->file!=NULL){
lp_config_parse(lpconfig);
fclose(lpconfig->file);
lp_config_parse(lpconfig,lpconfig->file);
fclose(lpconfig->file);
/* make existing configuration files non-group/world-accessible */
if (chmod(filename, S_IRUSR | S_IWUSR) == -1)
ms_warning("unable to correct permissions on "
......@@ -228,6 +222,17 @@ LpConfig * lp_config_new(const char *filename){
return lpconfig;
}
int lp_config_read_file(LpConfig *lpconfig, const char *filename){
FILE* f=fopen(filename,"r");
if (f!=NULL){
lp_config_parse(lpconfig,f);
fclose(f);
return 0;
}
ms_warning("Fail to open file %s",filename);
return -1;
}
void lp_item_set_value(LpItem *item, const char *value){
free(item->value);
item->value=strdup(value);
......@@ -241,34 +246,6 @@ void lp_config_destroy(LpConfig *lpconfig){
free(lpconfig);
}
LpSection *lp_config_find_section(LpConfig *lpconfig, const char *name){
LpSection *sec;
MSList *elem;
/*printf("Looking for section %s\n",name);*/
for (elem=lpconfig->sections;elem!=NULL;elem=ms_list_next(elem)){
sec=(LpSection*)elem->data;
if (strcmp(sec->name,name)==0){
/*printf("Section %s found\n",name);*/
return sec;
}
}
return NULL;
}
LpItem *lp_section_find_item(LpSection *sec, const char *name){
MSList *elem;
LpItem *item;
/*printf("Looking for item %s\n",name);*/
for (elem=sec->items;elem!=NULL;elem=ms_list_next(elem)){
item=(LpItem*)elem->data;
if (strcmp(item->key,name)==0) {
/*printf("Item %s found\n",name);*/
return item;
}
}
return NULL;
}
void lp_section_remove_item(LpSection *sec, LpItem *item){
sec->items=ms_list_remove(sec->items,(void *)item);
lp_item_destroy(item);
......
......@@ -32,6 +32,7 @@ extern "C" {
#endif
LpConfig * lp_config_new(const char *filename);
int lp_config_read_file(LpConfig *lpconfig, const char *filename);
const char *lp_config_get_string(LpConfig *lpconfig, const char *section, const char *key, const char *default_string);
int lp_config_get_int(LpConfig *lpconfig,const char *section, const char *key, int default_value);
float lp_config_get_float(LpConfig *lpconfig,const char *section, const char *key, float default_value);
......
......@@ -190,4 +190,8 @@ void linphone_proxy_config_get_contact(LinphoneProxyConfig *cfg, const char **ip
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const LinphoneAddress *uri);
int linphone_core_get_local_ip_for(const char *dest, char *result);
void linphone_core_init(LinphoneCore *lc, const LinphoneCoreVTable *vtable,
const char *config_path, void * userdata);
void linphone_core_uninit(LinphoneCore *lc);
#endif /* _PRIVATE_H */
......@@ -21,7 +21,7 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
PACKAGE = @PACKAGE@
VERSION = @VERSION@
SHELL = /bin/sh
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
......@@ -56,7 +56,7 @@ ALL_LINGUAS = @ALL_LINGUAS@
PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi)
USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep ^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep ^$$lang$$`"; then printf "$$lang "; fi; done; fi)
USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi)
USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment