changeset 24:e88b15cbf2de

[/trunk] Changeset 40 by mikael * Change structure -> src directory for mcabber source code...
author mikael
date Sun, 27 Mar 2005 20:16:02 +0000
parents d7107507424b
children bf3d6e241714
files mcabber/src/ACKNOWLEDGEMENT mcabber/src/COPYING mcabber/src/Changelog mcabber/src/Makefile mcabber/src/README mcabber/src/TODO mcabber/src/buddies.c mcabber/src/buddies.h mcabber/src/cabberrc.example mcabber/src/harddefines.h mcabber/src/lang.c mcabber/src/lang.h mcabber/src/lang/POSIX.txt mcabber/src/lang/es_ES.txt mcabber/src/list.h mcabber/src/main.c mcabber/src/parsecfg.c mcabber/src/parsecfg.h mcabber/src/screen.c mcabber/src/screen.h mcabber/src/server.c mcabber/src/server.h mcabber/src/socket.c mcabber/src/socket.h mcabber/src/utf8.c mcabber/src/utf8.h mcabber/src/utils.c mcabber/src/utils.h
diffstat 56 files changed, 3410 insertions(+), 3410 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/ACKNOWLEDGEMENT	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-Special Thanks to:
-    Daniel Borca   (http://www.geocities.com/dborca).
-		   Many of the new code is his own work!!!
-		   Thanks Daniel!!!
-
-Thanks to:
-    Abrililla	   (???)
-    Gabber	   (http://gabber.sourceforge.net)
-    Manolo Romero  (cobreti@mundivia.es)    
-    NexusX	   (nexusx666@ajmacias.com)
-    Pablo2000	   (josepablosc@wanadoo.es)
-    Pras           (???)
-    Ted		   (ted@php.net)
-    Thomas Fischer (th.fischer@gmx.net)
-    _Yed_	   (#linux at irc-hispano)
-    ZJoyKiller 	   (#linux at irc-hispano)
--- a/mcabber/COPYING	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
--- a/mcabber/Changelog	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
---[cabber 0.5.0-test1]--
-  - unification of lists in list.h
-  - changed UI... now is multiwindow and have popups!!!
-  - roster is now capable of add/delete buddies (very primitive and buggy!)
-  - improved many routines. Thanks to Daniel Borca.
-  - Added i18n function to translate cabber to others languages
-  - TODO: management of buddies away status...
-
---[cabber 0.4.0-test5]--
-  - many bugs fixed: (roster, utf8...)
-  
---[cabber 0.4.0-test4]--
-  - added UTF8 encoding/decoding (yes, it have bugs...)
-  - added default color for make cabber transparent (Johannes WeiBl)
-  - fixed cursor position.
-  
---[cabber 0.4.0-test3]--
-  - rewritten routine "receivedata" at socket.c (bug #1: Johannes WeiBl)
-  - ignored left and rigth keys until i implement input line editor.
-  - colors are stored in $HOME/.cabberrc
-	- see cabberrc.example ;-)
-	
---[cabber 0.4.0-test2]--
-  - not public.	
-
---[cabber 0.4.0-test1]--
-  - many routines has been rewritten again d8-)
-  
-    * use of lists instead of stacks for store data
-	- stack.c is not needed anymore, i use list.c instead.
-	- added a ugly routine for sort list (improve it!!)
-
-    * socket module has been rewritten and improved:
-	- O_NONBLOCK eliminated
-	  
-    * module parse.c has been rewritten: now is more effective.
-
-    * the XML parser is now more effective (i hope!)	 
-
-    * contact list:
-	- it have scroll bar now,  (manoleT have a large list of contacts ;-)
-	- now contacts are sorted alphabetically.
-	
-    * a lot of new bugs... sorry, but my main pc is broken. This version
-      of cabber has been made in my laptop.
-
--- a/mcabber/Makefile	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-#
-# mcabber Makefile
-#
-
-
-#
-#  Available options:
-#
-#    Environment variables:
-#	CPU		optimize for the given processor.
-#			default = pentium
-#	DEBUG=1		disable optimizations and build for debug
-#			default = no
-#
-#    Targets:
-#	all:		build executable
-#	clean:		remove object files
-#	realclean:	remove all generated files
-#	install:	build & install
-#	dep:		create dependencies
-#
-
-
-.PHONY: all clean realclean install
-# dep
-
-CPU ?= i386
-JCLIENT = mcabber
-
-CC = gcc
-CFLAGS = -Wall -W -pedantic
-LD = gcc
-LDLIBS = -lncurses -lpanel
-
-ifeq ($(DEBUG),1)
-CFLAGS += -O0 -g -DDEBUG=1
-else
-CFLAGS += -O2 -mcpu=$(CPU)
-LDFLAGS = -s
-endif
-
-CP = cp -f
-
-SOURCES = \
-    main.c \
-    screen.c \
-    utils.c \
-    buddies.c \
-    parsecfg.c \
-    server.c \
-    socket.c \
-    lang.c \
-    utf8.c
-
-OBJECTS = $(SOURCES:.c=.o)
-
-.c.o:
-	$(CC) -o $@ $(CFLAGS) -c $<
-
-all: $(JCLIENT)
-
-$(JCLIENT): $(OBJECTS)
-	$(LD) -o $@ $(LDFLAGS) $^ $(LDLIBS)
-
-clean:
-	-$(RM) *~
-	-$(RM) $(JCLIENT)
-	-$(RM) $(OBJECTS)
-#	-$(RM) depend
-
-realclean: clean
-	-$(RM) $(JCLIENT)
-
-install: all
-	$(CP) $(JCLIENT) /usr/bin/$(JCLIENT)
-
-#dep: $(SOURCES)
-#	makedepend -f- -Ylydialog -- $(CFLAGS) -- $(SOURCES) > depend
-
-#-include depend
--- a/mcabber/README	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-Well, the documentation is missing yet, but...
-
-!!!!!! SEE mcabberrc.example !!!!!!
-
-configfile:
-    The configfile will be placed in $HOME/.mcabberrc
-    and it will be:
-	
-	    username = username
-	    password = yourpassword
-	    server = serveryou.use
-	    resource = yourresourcenameOFFICE
-	    passtype = plain  (or sha1)
-	    
-
-That's all folks! (by the moment ;-)
-
--- a/mcabber/TODO	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-
-* pending message not displayed if buddy outside Contact window
-
-* Use libjabber
-* Commands! :-)
-  - /say
-  - /add
-  - /del
-  - /rename
-  - /info
-  - /request_auth (??)
-  - /status (and common shortcuts: /away, /online, /busy, /dnd)
-* Buddies status
-* Command line history (^P/^N)
-* External commands for events
-* Multi-lines
-* Handle window resize (will be hard with current implementation...)
-* Command line completion
-* Scroll back history
-* Save history
-* Shortcut to jump to next message received (shift-tab?)
-* File transfer? :)
-* Conferences :))
-
--- a/mcabber/buddies.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,376 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ncurses.h>
-#include <panel.h>
-#include "screen.h"
-#include "buddies.h"
-
-#include "lang.h"
-#include "utils.h"
-#include "server.h"
-#include "list.h"
-#include "harddefines.h"
-
-/* global vars for BUDDIES.C */
-int buddySelected = 1;		/* Hold the selected Buddy  */
-int buddyOffset = 0;		/* Hold the roster offset   */
-
-static LIST_HEAD(buddy_list);
-static LIST_HEAD(sorted_buddies);
-
-#define buddy_entry(n) list_entry(n, buddy_entry_t, list)
-
-
-void bud_SetBuddyStatus(char *jidfrom, int status)
-{
-  struct list_head *pos, *n;
-  buddy_entry_t *tmp;
-  int changed = 0;
-  char *buffer = (char *) malloc(4096);
-
-  list_for_each_safe(pos, n, &buddy_list) {
-    tmp = buddy_entry(pos);
-    if (!strcmp(tmp->jid, jidfrom)) {
-      if (tmp->flags != status) {
-	tmp->flags = status;
-	changed = 1;
-      }
-      break;
-    }
-  }
-  if (changed) {
-    bud_DrawRoster(scr_GetRosterWindow());
-    switch (status) {
-    case FLAG_BUDDY_DISCONNECTED:
-      sprintf(buffer, "--> %s %s!", jidfrom, i18n("disconected"));
-      break;
-
-    case FLAG_BUDDY_CONNECTED:
-      sprintf(buffer, "--> %s %s!", jidfrom, i18n("connected"));
-      break;
-    }
-    scr_LogPrint("%s", buffer);
-  }
-  free(buffer);
-}
-
-int compara(buddy_entry_t * t1, buddy_entry_t * t2)
-{
-  const char *s1 =
-      (const char *) (STR_EMPTY(t1->name) ? t1->jid : t1->name);
-  const char *s2 =
-      (const char *) (STR_EMPTY(t2->name) ? t2->jid : t2->name);
-  return strcasecmp(s1, s2);
-}
-
-void bud_SortRoster(void)
-{
-  buddy_entry_t *indice, *tmp;
-  struct list_head *pos, *n;
-
-  while (!list_empty(&buddy_list)) {
-    indice = NULL;
-    tmp = NULL;
-    list_for_each_safe(pos, n, &buddy_list) {
-      if (!indice) {
-	indice = buddy_entry(pos);
-	tmp = buddy_entry(pos);
-      } else {
-	tmp = buddy_entry(pos);
-	if (compara(indice, tmp) > 0) {
-	  indice = tmp;
-	}
-      }
-    }
-    list_move_tail(&indice->list, &sorted_buddies);
-  }
-  list_splice(&sorted_buddies, &buddy_list);
-}
-
-void bud_ParseBuddies(char *roster)
-{
-  buddy_entry_t *tmp = NULL;
-  char *aux;
-  char *p, *str;
-
-  ut_WriteLog("[roster]: %s\n\n", roster);
-
-  while ((aux = ut_strrstr(roster, "<item")) != NULL) {
-    char *jid = getattr(aux, "jid='");
-    char *name = getattr(aux, "name='");
-    char *group = gettag(aux, "group='");
-
-    *aux = '\0';
-
-    tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t));
-
-    tmp->flags = FLAG_BUDDY_DISCONNECTED;
-
-    if (strncmp(jid, "UNK", 3)) {
-      char *res = strstr(jid, "/");
-      if (res)
-	*res = '\0';
-
-      tmp->jid = (char *) malloc(strlen(jid) + 1);
-      strcpy(tmp->jid, jid);
-      free(jid);
-    }
-
-    if (strncmp(name, "UNK", 3)) {
-      tmp->name = (char *) calloc(1, strlen(name) + 1);
-      strcpy(tmp->name, name);
-      free(name);
-    } else {
-      tmp->name = (char *) calloc(1, strlen(tmp->jid) + 1);
-      str = strdup(tmp->jid);
-      p = strstr(str, "@");
-      if (p) {
-	*p = '\0';
-      }
-      strncpy(tmp->name, str, 18);
-      free(str);
-    }
-
-    if (strncmp(group, "UNK", 3)) {
-      tmp->group = (char *) malloc(strlen(group) + 1);
-      strcpy(tmp->group, group);
-      free(group);
-    }
-
-    if (!strncmp(tmp->jid, "msn.", 4)) {
-      sprintf(tmp->name, "%c MSN %c", 254, 254);
-    }
-
-    if (!STR_EMPTY(tmp->jid)) {
-      list_add_tail(&tmp->list, &buddy_list);
-    } else {
-      if (tmp->jid)
-	free(tmp->jid);
-      if (tmp->name)
-	free(tmp->name);
-      if (tmp->group)
-	free(tmp->group);
-      free(tmp);
-    }
-  }
-  free(roster);
-
-  bud_SortRoster();
-}
-
-/* Desc: Initialize buddy list
- * 
- * In : none
- * Out: none
- *
- * Note: none
- */
-void bud_InitBuddies(int sock)
-{
-  char *roster;
-  roster = srv_getroster(sock);
-  bud_ParseBuddies(roster);
-}
-
-/* Desc: Destroy (and free) buddy list
- * 
- * In : none
- * Out: none
- *
- * Note: none
- */
-void bud_TerminateBuddies(void)
-{
-}
-
-/* Desc: Count elements in buddy list
- * 
- * In : none
- * Out: number of buddies
- *
- * Note: none
- */
-int bud_BuddyCount(void)
-{
-  int i = 0;
-  struct list_head *pos, *n;
-
-  list_for_each_safe(pos, n, &buddy_list) {
-    i++;
-  }
-  return i;
-}
-
-/* Desc: Draw the roster in roster window
- * 
- * In : roster window
- * Out: none
- *
- * Note: none
- */
-void bud_DrawRoster(WINDOW * win)
-{
-  buddy_entry_t *tmp = NULL;
-  struct list_head *pos, *nn;
-  int i = 1;
-  int n;
-  int maxx, maxy;
-  int fakeOffset = buddyOffset;
-
-  getmaxyx(win, maxy, maxx);
-
-
-  /* cleanup of roster window */
-  wattrset(win, COLOR_PAIR(COLOR_GENERAL));
-  for (i = 1; i < maxy - 1; i++) {
-    mvwprintw(win, i, 1, "");
-    for (n = 2; n < maxx; n++)
-      waddch(win, ' ');
-  }
-
-  i = 1;
-  list_for_each_safe(pos, nn, &buddy_list) {
-
-    char status = '?';
-    char pending = ' ';
-
-    if (fakeOffset > 0) {
-      fakeOffset--;
-      continue;
-    }
-
-    tmp = buddy_entry(pos);
-    if (scr_IsHiddenMessage(tmp->jid)) {
-      pending = '#';
-    }
-
-    if ((tmp->flags && FLAG_BUDDY_CONNECTED) == 1) {
-      status = 'o';
-      if (i == (buddySelected - buddyOffset))
-	wattrset(win, COLOR_PAIR(COLOR_BD_CONSEL));
-      else
-	wattrset(win, COLOR_PAIR(COLOR_BD_CON));
-    } else {
-      if (i == (buddySelected - buddyOffset))
-	wattrset(win, COLOR_PAIR(COLOR_BD_DESSEL));
-      else
-	wattrset(win, COLOR_PAIR(COLOR_BD_DES));
-    }
-    mvwprintw(win, i, 1, "");
-    for (n = 2; n < maxx; n++)
-      waddch(win, ' ');
-    //mvwprintw(win, i, (maxx - strlen(tmp->name)) / 2, "%s", tmp->name);
-    mvwprintw(win, i, 1, " %c[%c] %.12s", pending, status, tmp->name);
-    i++;
-    if (i >= maxy - 1)
-      break;
-  }
-  update_panels();
-  doupdate();
-
-  update_roaster = FALSE;
-}
-
-/* Desc: Change selected buddy (one position down)
- * 
- * In : none
- * Out: none
- *
- * Note: none
- */
-void bud_RosterDown(void)
-{
-  int x, y;
-  getmaxyx(scr_GetRosterWindow(), y, x);
-  y -= 2;
-
-  if (buddySelected < bud_BuddyCount()) {
-    buddySelected++;
-    if (buddySelected > y)
-      buddyOffset++;
-    bud_DrawRoster(scr_GetRosterWindow());
-  }
-}
-
-/* Desc: Change selected buddy (one position up)
- * 
- * In : none
- * Out: none
- *
- * Note: none
- */
-void bud_RosterUp(void)
-{
-  if (buddySelected > 1) {
-    buddySelected--;
-    if (buddySelected - buddyOffset < 1)
-      buddyOffset--;
-    bud_DrawRoster(scr_GetRosterWindow());
-  }
-}
-
-/* Desc: Retrieve info for selected buddy
- * 
- * In : none
- * Out: (buddy_entry_t *) of selected buddy
- *
- * Note: none
- */
-buddy_entry_t *bud_SelectedInfo(void)
-{
-  struct list_head *pos, *n;
-  buddy_entry_t *tmp = NULL;
-
-  int i = 0;
-
-  list_for_each_safe(pos, n, &buddy_list) {
-    tmp = buddy_entry(pos);
-    if (i == buddySelected - 1) {
-      return tmp;
-    }
-    i++;
-  }
-  return NULL;
-}
-
-void bud_AddBuddy(int sock)
-{
-  char *buffer = (char *) calloc(1, 1024);
-  char *buffer2 = (char *) calloc(1, 1024);
-  char *p, *str;
-  buddy_entry_t *tmp;
-
-  ut_CenterMessage(i18n("write jid here"), 60, buffer2);
-  scr_CreatePopup(i18n("Add jid"), buffer2, 60, 1, buffer);
-
-  if (!STR_EMPTY(buffer)) {
-    tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t));
-    tmp->jid = (char *) malloc(strlen(buffer) + 1);
-    strcpy(tmp->jid, buffer);
-    tmp->name = (char *) malloc(strlen(buffer) + 1);
-
-    str = strdup(buffer);
-    p = strstr(str, "@");
-    if (p) {
-      *p = '\0';
-    }
-    strcpy(tmp->name, str);
-    free(str);
-
-    list_add_tail(&tmp->list, &buddy_list);
-    buddySelected = 1;
-    bud_DrawRoster(scr_GetRosterWindow());
-    srv_AddBuddy(sock, tmp->jid);
-  }
-  free(buffer);
-}
-
-void bud_DeleteBuddy(int sock)
-{
-  buddy_entry_t *tmp = bud_SelectedInfo();
-  srv_DelBuddy(sock, tmp->jid);
-  list_del(&tmp->list);
-  buddySelected = 1;
-  bud_DrawRoster(scr_GetRosterWindow());
-}
--- a/mcabber/buddies.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#ifndef __BUDDIES_H__
-#define __BUDDIES_H__ 1
-
-#include <ncurses.h>
-#include "list.h"
-
-/* Definición de tipos */
-typedef struct _buddy_entry_t {
-  char *jid;
-  char *name;
-  char *group;
-  char *resource;
-  int flags;
-  struct list_head list;
-} buddy_entry_t;
-
-void bud_DrawRoster(WINDOW * win);
-void bud_RosterDown(void);
-void bud_RosterUp(void);
-void bud_InitBuddies(int sock);
-void bud_TerminateBuddies(void);
-int bud_BuddyCount(void);
-void bud_SetBuddyStatus(char *jidfrom, int status);
-void bud_ParseBuddies(char *roster);
-void bud_AddBuddy(int sock);
-void bud_DeleteBuddy(int sock);
-buddy_entry_t *bud_SelectedInfo(void);
-
-#endif
--- a/mcabber/cabberrc.example	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-username = yourusername
-password = yourpassword
-server = your.jabber.server
-port = 5222
-resource = yourresource
-passtype = plain
-
-
-#now, the colors
-#color are: black, red, green, yellow, blue, magenta, cyan, white
-color_background = blue
-color_backselected = cyan
-color_borderlines = white
-color_jidonlineselected = black
-color_jidonline = green
-color_jidofflineselected = red
-color_jidoffline = red
-color_text = white
--- a/mcabber/harddefines.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-#ifndef __AJMACIAS__
-#define __AJMACIAS__ 0xWIN!
-
-#define VERSION "MCabber v0.6.0-dev -- based on http://cabber.sourceforge.net"
-#define EMAIL "Email: bmikael [at] lists [dot] lilotux [dot] net"
-
-#define STR_EMPTY(s) ((s)[0] == '\0')
-
-#define FLAG_BUDDY_DISCONNECTED         0x00
-#define FLAG_BUDDY_CONNECTED            0x01
-#define FLAG_BUDDY_AWAY                 0x02
-#define FLAG_BUDDY_XAWAY                0x04
-#define FLAG_BUDDY_HASMESSAGE           0x08
-
-#endif
--- a/mcabber/lang.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <ctype.h>
-
-
-#include "utils.h"
-
-char Lang[100];
-
-void lng_InitLanguage(void)
-{
-  FILE *fp;
-  memset(Lang, 0, 100);
-  sprintf(Lang, "./lang/%s.txt", getenv("LANG"));
-/*    strcpy(Lang, "./lang/");
-    strcat(Lang, getenv("LANG"));
-    strcat(Lang, ".txt");
-*/
-  if ((fp = fopen(Lang, "r")) == NULL) {
-    /* reverting to default */
-    ut_WriteLog("Reverting language to default: POSIX\n");
-    strcpy(Lang, "./lang/POSIX.txt");
-  } else {
-    fclose(fp);
-    ut_WriteLog("Setting language to %s\n", getenv("LANG"));
-  }
-}
-
-char *i18n(char *text)
-{
-  /* hack */
-  char *buf = (char *) malloc(1024);
-  static char result[1024];
-  FILE *fp;
-  char *line;
-  char *value;
-  int found = 0;
-
-  memset(result, 0, 1024);
-
-  if ((fp = fopen(Lang, "r")) != NULL) {
-    while ((fgets(buf, 1024, fp) != NULL) && (!found)) {
-      line = buf;
-
-      while (isspace((int) *line))
-	line++;
-
-      while ((strlen(line) > 0)
-	     && isspace((int) line[strlen(line) - 1]))
-	line[strlen(line) - 1] = '\0';
-
-      if ((*line == '\n') || (*line == '\0') || (*line == '#'))
-	continue;
-
-      if ((strchr(line, '=') != NULL)) {
-	value = strchr(line, '=');
-	*value = '\0';
-	value++;
-
-	while (isspace((int) *value))
-	  value++;
-
-	while ((strlen(line) > 0)
-	       && isspace((int) line[strlen(line) - 1]))
-	  line[strlen(line) - 1] = '\0';
-
-	if (!strcasecmp(line, text)) {
-	  strcpy(result, value);
-	  found = 1;
-	}
-	continue;
-      }
-      /* fprintf(stderr, "CFG: orphaned line \"%s\"\n", line); */
-    }
-    fclose(fp);
-  }
-
-  if (!found) {
-    strcpy(result, text);
-  }
-
-  free(buf);
-  return result;
-}
--- a/mcabber/lang.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-#ifndef __LANG_H__
-#define __LANG_H__ 1
-
-void lng_InitLanguage(void);
-char *i18n(char *text);
-
-#endif
--- a/mcabber/lang/POSIX.txt	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#########################
-# text for help message #
-#########################
-#note the same lenght of lines, sorry!
-
-add contact		= Add contact............
-delete contact		= Delete contact.........
-view buddy window	= Show buddy Window......
-send message		= Send Message...........
-#########################
-
-exit			= Exit
-help 			= Help
-Press any key 		= Press any key...
-roster 			= Contacts
-status window 		= Status Window
-write your message here = Write your message here
-write jid here		= Write jid here
-
-conected		= connected
-disconnected		= disconnected
--- a/mcabber/lang/es_ES.txt	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#########################
-# text for help message #
-#########################
-#note the same lenght of lines, sorry!
-
-add contact		= Añadir contacto........
-delete contact		= Borrar contacto........
-view buddy window	= Ver ventana contacto...
-send message		= Enviar mensaje.........
-#########################
-
-exit			= Salir
-help 			= Ayuda
-Press any key 		= Pulsa una tecla
-roster 			= Contactos
-status window 		= Ventana de estado
-write your message here = Escriba aquí su mensaje!
-write jid here		= Escriba aquí el jid que desea añadir?
-
-connected		= conectado
-disconnected		= desconectado
--- a/mcabber/list.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,213 +0,0 @@
-#ifndef _LINUX_LIST_H
-#define _LINUX_LIST_H
-
-/*
- * Simple doubly linked list implementation.
- *
- * Some of the internal functions ("__xxx") are useful when
- * manipulating whole lists rather than single entries, as
- * sometimes we already know the next/prev entries and we can
- * generate better code by using them directly rather than
- * using the generic single-entry routines.
- */
-
-struct list_head {
-  struct list_head *next, *prev;
-};
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
-	struct list_head name = LIST_HEAD_INIT(name)
-
-#define INIT_LIST_HEAD(ptr) do { \
-	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
-} while (0)
-
-/*
- * Insert a new entry between two known consecutive entries. 
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void
-__list_add(struct list_head *new,
-	   struct list_head *prev, struct list_head *next)
-{
-  next->prev = new;
-  new->next = next;
-  new->prev = prev;
-  prev->next = new;
-}
-
-/**
- * list_add - add a new entry
- * @new: new entry to be added
- * @head: list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-static inline void list_add(struct list_head *new, struct list_head *head)
-{
-  __list_add(new, head, head->next);
-}
-
-/**
- * list_add_tail - add a new entry
- * @new: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-static inline void
-list_add_tail(struct list_head *new, struct list_head *head)
-{
-  __list_add(new, head->prev, head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void
-__list_del(struct list_head *prev, struct list_head *next)
-{
-  next->prev = prev;
-  prev->next = next;
-}
-
-/**
- * list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
- */
-static inline void list_del(struct list_head *entry)
-{
-  __list_del(entry->prev, entry->next);
-  entry->next = (void *) 0;
-  entry->prev = (void *) 0;
-}
-
-/**
- * list_del_init - deletes entry from list and reinitialize it.
- * @entry: the element to delete from the list.
- */
-static inline void list_del_init(struct list_head *entry)
-{
-  __list_del(entry->prev, entry->next);
-  INIT_LIST_HEAD(entry);
-}
-
-/**
- * list_move - delete from one list and add as another's head
- * @list: the entry to move
- * @head: the head that will precede our entry
- */
-static inline void
-list_move(struct list_head *list, struct list_head *head)
-{
-  __list_del(list->prev, list->next);
-  list_add(list, head);
-}
-
-/**
- * list_move_tail - delete from one list and add as another's tail
- * @list: the entry to move
- * @head: the head that will follow our entry
- */
-static inline void
-list_move_tail(struct list_head *list, struct list_head *head)
-{
-  __list_del(list->prev, list->next);
-  list_add_tail(list, head);
-}
-
-/**
- * list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-static inline int list_empty(struct list_head *head)
-{
-  return head->next == head;
-}
-
-static inline void
-__list_splice(struct list_head *list, struct list_head *head)
-{
-  struct list_head *first = list->next;
-  struct list_head *last = list->prev;
-  struct list_head *at = head->next;
-
-  first->prev = head;
-  head->next = first;
-
-  last->next = at;
-  at->prev = last;
-}
-
-/**
- * list_splice - join two lists
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void
-list_splice(struct list_head *list, struct list_head *head)
-{
-  if (!list_empty(list))
-    __list_splice(list, head);
-}
-
-/**
- * list_splice_init - join two lists and reinitialise the emptied list.
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * The list at @list is reinitialised
- */
-static inline void
-list_splice_init(struct list_head *list, struct list_head *head)
-{
-  if (!list_empty(list)) {
-    __list_splice(list, head);
-    INIT_LIST_HEAD(list);
-  }
-}
-
-/**
- * list_entry - get the struct for this entry
- * @ptr:	the &struct list_head pointer.
- * @type:	the type of the struct this is embedded in.
- * @member:	the name of the list_struct within the struct.
- */
-#define list_entry(ptr, type, member) \
-	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
-
-/**
- * list_for_each_safe	-	iterate over a list safe against removal of list entry
- * @pos:	the &struct list_head to use as a loop counter.
- * @n:		another &struct list_head to use as temporary storage
- * @head:	the head for your list.
- */
-#define list_for_each_safe(pos, n, head) \
-	for (pos = (head)->next, n = pos->next; pos != (head); \
-		pos = n, n = pos->next)
-
-/**
- * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos:	the type * to use as a loop counter.
- * @n:		another type * to use as temporary storage
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- */
-#define list_for_each_entry_safe(pos, n, head, member)			\
-	for (pos = list_entry((head)->next, typeof(*pos), member),	\
-		n = list_entry(pos->member.next, typeof(*pos), member);	\
-	     &pos->member != (head); 					\
-	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-#endif
--- a/mcabber/main.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-#include <termios.h>
-
-#include "utils.h"
-#include "screen.h"
-#include "buddies.h"
-#include "parsecfg.h"
-#include "lang.h"
-#include "server.h"
-#include "harddefines.h"
-#include "socket.h"
-
-int sock;
-
-void sig_handler(int signum)
-{
-  switch (signum) {
-  case SIGALRM:
-    sk_send(sock, " ");
-    break;
-
-  case SIGTERM:
-    bud_TerminateBuddies();
-    scr_TerminateCurses();
-    srv_setpresence(sock, "unavailable");
-    close(sock);
-    printf("Killed by SIGTERM\nBye!\n");
-    exit(EXIT_SUCCESS);
-    break;
-
-  }
-  signal(SIGALRM, sig_handler);
-}
-
-ssize_t my_getpass (char **passstr, size_t *n)
-{
-  struct termios orig, new;
-  int nread;
-
-  /* Turn echoing off and fail if we can't. */
-  if (tcgetattr(fileno (stdin), &orig) != 0)
-      return -1;
-  new = orig;
-  new.c_lflag &= ~ECHO;
-  if (tcsetattr(fileno (stdin), TCSAFLUSH, &new) != 0)
-      return -1;
-
-  /* Read the password. */
-  nread = getline(passstr, n, stdin);
-
-  /* Restore terminal. */
-  (void) tcsetattr(fileno (stdin), TCSAFLUSH, &orig);
-
-  return nread;
-}
-
-void credits(void)
-{
-  printf(VERSION "\n");
-  printf(EMAIL "\n");
-}
-
-int main(int argc, char **argv)
-{
-  char configFile[4096];
-  char *username, *password, *resource;
-  char *servername;
-  char *idsession;
-  char *portstring;
-  int key;
-  unsigned int port;
-  unsigned int ping;
-  int ret = 0;
-
-
-  credits();
-
-  /* SET THIS >0 TO ENABLE LOG */
-  ut_InitDebug(1);
-
-  lng_InitLanguage();
-
-  ut_WriteLog("Setting signals handlers...\n");
-  signal(SIGTERM, sig_handler);
-  signal(SIGALRM, sig_handler);
-
-
-  sprintf(configFile, "%s/.mcabberrc", getenv("HOME"));
-
-  /* Proceso opciones de usuario */
-  while (1) {
-    int c = getopt(argc, argv, "hf:");
-    if (c == -1) {
-      break;
-    } else
-      switch (c) {
-      case 'h':
-	printf("Usage: %s [-f mcabberrc_file]\n\n", argv[0]);
-        printf("Thanks to AjMacias for cabber!\n\n");
-	return 0;
-      case 'f':
-	strncpy(configFile, optarg, 1024);
-	break;
-      }
-  }
-
-  ut_WriteLog("Setting config file: %s\n", configFile);
-
-
-  /* Parsing config file... */
-  ut_WriteLog("Parsing config file...\n");
-  cfg_file(configFile);
-
-  servername = cfg_read("server");
-  username = cfg_read("username");
-  password = cfg_read("password");
-  resource = cfg_read("resource");
-
-  if (!servername) {
-      printf("Server name has not been specified in the config file!\n");
-      return -1;
-  }
-  if (!username) {
-      printf("User name has not been specified in the config file!\n");
-      return -1;
-  }
-  if (!password) {
-      char *p;
-      size_t passsize = 64;
-      printf("Please enter password: ");
-      my_getpass(&password, &passsize);
-      printf("\n");
-      for (p = password; *p; p++);
-      for ( ; p > password ; p--)
-          if (*p == '\n' || *p == '\r') *p = 0;
-  }
-
-  /* Initialize N-Curses */
-  ut_WriteLog("Initializing N-Curses...\n");
-  scr_InitCurses();
-
-  /* Connect to server */
-  portstring = cfg_read("port");
-  port = (portstring != NULL) ? atoi(portstring) : -1;
-
-  ut_WriteLog("Connecting to server: %s:%d\n", servername, port);
-  if ((sock = srv_connect(servername, port)) < 0) {
-    ut_WriteLog("\terror!!!\n");
-    fprintf(stderr, "Error connecting to (%s)\n", servername);
-    scr_TerminateCurses();
-    return -2;
-  }
-
-  ut_WriteLog("Sending login string...\n");
-  if ((idsession = srv_login(sock, servername, username, password, 
-                             resource)) == NULL) {
-
-    ut_WriteLog("\terror!!!\n");
-    fprintf(stderr, "Error sending login string...\n");
-    scr_TerminateCurses();
-    return -3;
-  }
-  ut_WriteLog("Connected to %s: %s\n", servername, idsession);
-  free(idsession);
-
-  ut_WriteLog("Requesting roster...\n");
-  bud_InitBuddies(sock);
-
-  ut_WriteLog("Sending presence...\n");
-  srv_setpresence(sock, "Online!");
-
-
-  ut_WriteLog("Drawing main window...\n");
-  scr_DrawMainWindow();
-
-  ping = 15;
-  if (cfg_read("pinginterval"))
-    ping = atoi(cfg_read("pinginterval"));
-
-  ut_WriteLog("Ping interval stablished: %d secs\n", ping);
-
-  ut_WriteLog("Entering into main loop...\n\n");
-  ut_WriteLog("Ready to send/receive messages...\n");
-
-  while (ret != 255) {
-    int x;
-    alarm(ping);
-    x = check_io(sock, 0);
-    if ((x & 1) == 1) {
-      srv_msg *incoming = readserver(sock);
-
-      switch (incoming->m) {
-      case SM_PRESENCE:
-	bud_SetBuddyStatus(incoming->from, incoming->connected);
-	break;
-
-      case SM_MESSAGE:
-	scr_WriteIncomingMessage(incoming->from, incoming->body);
-	free(incoming->body);
-	free(incoming->from);
-	break;
-
-      case SM_UNHANDLED:
-	break;
-      }
-      free(incoming);
-    }
-    if ((x & 2) == 2) {
-      keypad(scr_GetInputWindow(), TRUE);
-      key = scr_Getch();
-      ret = process_key(key, sock);
-      /*
-      switch (key) {
-      case KEY_IC:
-	bud_AddBuddy(sock);
-	break;
-      case KEY_DC:
-	bud_DeleteBuddy(sock);
-	break;
-
-      case KEY_RESIZE:
-	endwin();
-	printf("\nRedimensionado no implementado\n");
-	printf("Reinicie Cabber.\n\n\n");
-	exit(EXIT_FAILURE);
-	break;
-      }
-      */
-    }
-    if (update_roaster) {
-      // scr_LogPrint("Update roaster");
-      bud_DrawRoster(scr_GetRosterWindow());
-    }
-  }
-
-  bud_TerminateBuddies();
-  scr_TerminateCurses();
-
-  srv_setpresence(sock, "unavailable");
-
-  close(sock);
-
-  printf("\n\nHave a nice day!\nBye!\n");
-
-  return 0;
-}
--- a/mcabber/parsecfg.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-
-
-#include "list.h"
-
-/* Definicion de tipos */
-#define MAX_LENGHT_INPUT 1024
-#define cfg_entry(n) list_entry(n, cfg_entry_t, list)
-
-typedef struct _cfg_entry_t {
-  char *key;
-  char *value;
-  struct list_head list;
-} cfg_entry_t;
-
-static LIST_HEAD(cfg_list);
-
-
-void push_in_list(char *key, char *value)
-{
-  cfg_entry_t *new_entry = calloc(1, sizeof(cfg_entry_t));
-
-  new_entry->key = (char *) calloc(1, strlen(key) + 1);
-  new_entry->value = (char *) calloc(1, strlen(value) + 1);
-
-  strcpy(new_entry->key, key);
-  strcpy(new_entry->value, value);
-
-  list_add(&new_entry->list, &cfg_list);
-}
-
-int cfg_file(char *filename)
-{
-  FILE *fp;
-  char *buf;
-  char *line;
-  char *value;
-
-  buf = malloc(255);
-
-  if ((fp = fopen(filename, "r")) == NULL) {
-    perror("fopen (parsecfg.c:46)");
-    exit(EXIT_FAILURE);
-  }
-
-  while (fgets(buf, 255, fp) != NULL) {
-    line = buf;
-
-    while (isspace((int) *line))
-      line++;
-
-    while ((strlen(line) > 0)
-	   && isspace((int) line[strlen(line) - 1]))
-      line[strlen(line) - 1] = '\0';
-
-    if ((*line == '\n') || (*line == '\0') || (*line == '#'))
-      continue;
-
-    if ((strchr(line, '=') != NULL)) {
-      value = strchr(line, '=');
-      *value = '\0';
-      value++;
-
-      while (isspace((int) *value))
-	value++;
-
-      while ((strlen(line) > 0)
-	     && isspace((int) line[strlen(line) - 1]))
-	line[strlen(line) - 1] = '\0';
-
-      push_in_list(line, value);
-      continue;
-    }
-    fprintf(stderr, "CFG: orphaned line \"%s\"\n", line);
-  }
-  return 1;
-}
-
-char *cfg_read(char *key)
-{
-  struct list_head *n, *pos;
-  cfg_entry_t *search_entry = NULL;
-
-  list_for_each_safe(pos, n, &cfg_list) {
-    search_entry = cfg_entry(pos);
-    if (search_entry->key) {
-      if (!strcasecmp(search_entry->key, key)) {
-	return search_entry->value;
-      }
-    }
-  }
-  return NULL;
-}
--- a/mcabber/parsecfg.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-#ifndef __PARSECFG_H__
-#define __PARSECFG_H__ 1
-
-int cfg_file(char *filename);
-char *cfg_read(char *key);
-
-#endif
--- a/mcabber/screen.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,805 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ncurses.h>
-#include <panel.h>
-#include <time.h>
-#include <ctype.h>
-#include <locale.h>
-
-#include "screen.h"
-#include "utils.h"
-#include "buddies.h"
-#include "parsecfg.h"
-#include "lang.h"
-#include "server.h"
-#include "list.h"
-
-/* Definicion de tipos */
-#define window_entry(n) list_entry(n, window_entry_t, list)
-
-LIST_HEAD(window_list);
-
-typedef struct _window_entry_t {
-  WINDOW *win;
-  PANEL *panel;
-  char *name;
-  int nlines;
-  char **texto;
-  int hidden_msg;
-  struct list_head list;
-} window_entry_t;
-
-
-/* Variables globales a SCREEN.C */
-static WINDOW *rosterWnd, *chatWnd, *inputWnd;
-static WINDOW *logWnd, *logWnd_border;
-static PANEL *rosterPanel, *chatPanel, *inputPanel;
-static PANEL *logPanel, *logPanel_border;
-static int maxY, maxX;
-static window_entry_t *currentWindow;
-
-static int chatmode;
-int update_roaster;
-
-static char inputLine[INPUTLINE_LENGTH+1];
-static char *ptr_inputline;
-static short int inputline_offset;
-
-
-/* Funciones */
-
-int scr_WindowHeight(WINDOW * win)
-{
-  int x, y;
-  getmaxyx(win, y, x);
-  return x;
-}
-
-void scr_draw_box(WINDOW * win, int y, int x, int height, int width,
-                  int Color, chtype box, chtype border)
-{
-  int i, j;
-
-  wattrset(win, COLOR_PAIR(Color));
-  for (i = 0; i < height; i++) {
-    wmove(win, y + i, x);
-    for (j = 0; j < width; j++)
-      if (!i && !j)
-	waddch(win, border | ACS_ULCORNER);
-      else if (i == height - 1 && !j)
-	waddch(win, border | ACS_LLCORNER);
-      else if (!i && j == width - 1)
-	waddch(win, box | ACS_URCORNER);
-      else if (i == height - 1 && j == width - 1)
-	waddch(win, box | ACS_LRCORNER);
-      else if (!i)
-	waddch(win, border | ACS_HLINE);
-      else if (i == height - 1)
-	waddch(win, box | ACS_HLINE);
-      else if (!j)
-	waddch(win, border | ACS_VLINE);
-      else if (j == width - 1)
-	waddch(win, box | ACS_VLINE);
-      else
-	waddch(win, box | ' ');
-  }
-}
-
-int FindColor(char *name)
-{
-  if (!strcmp(name, "default"))
-    return -1;
-  if (!strcmp(name, "black"))
-    return COLOR_BLACK;
-  if (!strcmp(name, "red"))
-    return COLOR_RED;
-  if (!strcmp(name, "green"))
-    return COLOR_GREEN;
-  if (!strcmp(name, "yellow"))
-    return COLOR_YELLOW;
-  if (!strcmp(name, "blue"))
-    return COLOR_BLUE;
-  if (!strcmp(name, "magenta"))
-    return COLOR_MAGENTA;
-  if (!strcmp(name, "cyan"))
-    return COLOR_CYAN;
-  if (!strcmp(name, "white"))
-    return COLOR_WHITE;
-
-  return -1;
-}
-
-void ParseColors(void)
-{
-  char *colors[11] = {
-    "", "",
-    "borderlines",
-    "jidonlineselected",
-    "jidonline",
-    "jidofflineselected",
-    "jidoffline",
-    "text",
-    NULL
-  };
-
-  char *tmp = malloc(1024);
-  char *color1;
-  char *background = cfg_read("color_background");
-  char *backselected = cfg_read("color_backselected");
-  int i = 0;
-
-  while (colors[i]) {
-    sprintf(tmp, "color_%s", colors[i]);
-    color1 = cfg_read(tmp);
-
-    switch (i + 1) {
-    case 1:
-      init_pair(1, COLOR_BLACK, COLOR_WHITE);
-      break;
-    case 2:
-      init_pair(2, COLOR_WHITE, COLOR_BLACK);
-      break;
-    case 3:
-      init_pair(3, FindColor(color1), FindColor(background));
-      break;
-    case 4:
-      init_pair(4, FindColor(color1), FindColor(backselected));
-      break;
-    case 5:
-      init_pair(5, FindColor(color1), FindColor(background));
-      break;
-    case 6:
-      init_pair(6, FindColor(color1), FindColor(backselected));
-      break;
-    case 7:
-      init_pair(7, FindColor(color1), FindColor(background));
-      break;
-    case 8:
-      init_pair(8, FindColor(color1), FindColor(background));
-      break;
-    }
-    i++;
-  }
-}
-
-
-window_entry_t *scr_CreatePanel(char *title, int x, int y, int lines,
-				int cols, int dont_show)
-{
-  window_entry_t *tmp = calloc(1, sizeof(window_entry_t));
-
-  tmp->win = newwin(lines, cols, y, x);
-  tmp->panel = new_panel(tmp->win);
-  tmp->name = (char *) calloc(1, 1024);
-  strncpy(tmp->name, title, 1024);
-
-  scr_draw_box(tmp->win, 0, 0, lines, cols, COLOR_GENERAL, 0, 0);
-  //mvwprintw(tmp->win, 0, (cols - (2 + strlen(title))) / 2, " %s ", title);
-  if ((!dont_show)) {
-    currentWindow = tmp;
-  } else {
-    if (currentWindow)
-      top_panel(currentWindow->panel);
-    else
-      top_panel(chatPanel);
-  }
-
-  list_add_tail(&tmp->list, &window_list);
-  update_panels();
-
-  return tmp;
-}
-
-
-void scr_CreatePopup(char *title, char *texto, int corte, int type,
-                     char *returnstring)
-{
-  WINDOW *popupWin;
-  PANEL *popupPanel;
-
-  int lineas = 0;
-  int cols = 0;
-
-  char **submsgs;
-  int n = 0;
-  int i;
-
-  char *instr = (char *) calloc(1, 1024);
-
-  /* fprintf(stderr, "\r\n%d", lineas); */
-
-  submsgs = ut_SplitMessage(texto, &n, corte);
-
-  switch (type) {
-  case 1:
-  case 0:
-    lineas = n + 4;
-    break;
-  }
-
-  cols = corte + 3;
-  popupWin = newwin(lineas, cols, (maxY - lineas) / 2, (maxX - cols) / 2);
-  popupPanel = new_panel(popupWin);
-
-  /*ATENCION!!! Colorear el popup ??
-     / box (popupWin, 0, 0); */
-  scr_draw_box(popupWin, 0, 0, lineas, cols, COLOR_POPUP, 0, 0);
-  mvwprintw(popupWin, 0, (cols - (2 + strlen(title))) / 2, " %s ", title);
-
-  for (i = 0; i < n; i++)
-    mvwprintw(popupWin, i + 1, 2, "%s", submsgs[i]);
-
-
-  for (i = 0; i < n; i++)
-    free(submsgs[i]);
-  free(submsgs);
-
-  switch (type) {
-  case 0:
-    mvwprintw(popupWin, n + 2,
-	      (cols - (2 + strlen(i18n("Press any key")))) / 2,
-	      i18n("Press any key"));
-    update_panels();
-    doupdate();
-    getch();
-    break;
-  case 1:
-    {
-      char ch;
-      int scroll = 0;
-      int input_x = 0;
-
-      wmove(popupWin, 3, 1);
-      wrefresh(popupWin);
-      keypad(popupWin, TRUE);
-      while ((ch = getch()) != '\n') {
-	switch (ch) {
-	case 0x09:
-	case KEY_UP:
-	case KEY_DOWN:
-	  break;
-	case KEY_RIGHT:
-	case KEY_LEFT:
-	  break;
-	case KEY_BACKSPACE:
-	case 127:
-	  if (input_x || scroll) {
-	    /* wattrset (popupWin, 0); */
-	    if (!input_x) {
-	      scroll = scroll < cols - 3 ? 0 : scroll - (cols - 3);
-	      wmove(popupWin, 3, 1);
-	      for (i = 0; i < cols; i++)
-		waddch
-		    (popupWin,
-		     instr
-		     [scroll
-		      + input_x + i] ? instr[scroll + input_x + i] : ' ');
-	      input_x = strlen(instr) - scroll;
-	    } else
-	      input_x--;
-	    instr[scroll + input_x] = '\0';
-	    mvwaddch(popupWin, 3, input_x + 1, ' ');
-	    wmove(popupWin, 3, input_x + 1);
-	    wrefresh(popupWin);
-	  }
-	default:
-	  if ( /*ch<0x100 && */ isprint(ch) || ch == 'ñ'
-	      || ch == 'Ñ') {
-	    if (scroll + input_x < 1024) {
-	      instr[scroll + input_x] = ch;
-	      instr[scroll + input_x + 1] = '\0';
-	      if (input_x == cols - 3) {
-		scroll++;
-		wmove(popupWin, 3, 1);
-		for (i = 0; i < cols - 3; i++)
-		  waddch(popupWin, instr[scroll + i]);
-	      } else {
-		wmove(popupWin, 3, 1 + input_x++);
-		waddch(popupWin, ch);
-	      }
-	      wrefresh(popupWin);
-	    } else {
-	      flash();
-	    }
-	  }
-	}
-      }
-    }
-    if (returnstring != NULL)
-      strcpy(returnstring, instr);
-    break;
-  }
-
-  del_panel(popupPanel);
-  delwin(popupWin);
-  update_panels();
-  doupdate();
-  free(instr);
-  keypad(inputWnd, TRUE);
-}
-
-void scr_RoolWindow(void)
-{
-}
-
-window_entry_t *scr_SearchWindow(char *winId)
-{
-  struct list_head *pos, *n;
-  window_entry_t *search_entry = NULL;
-
-  list_for_each_safe(pos, n, &window_list) {
-    search_entry = window_entry(pos);
-    if (search_entry->name) {
-      if (!strcasecmp(search_entry->name, winId)) {
-	return search_entry;
-      }
-    }
-  }
-  return NULL;
-}
-
-void scr_ShowWindow(char *winId)
-{
-  int n, width, i;
-  window_entry_t *tmp = scr_SearchWindow(winId);
-  if (tmp != NULL) {
-    top_panel(tmp->panel);
-    currentWindow = tmp;
-    chatmode = TRUE;
-    tmp->hidden_msg = FALSE;
-    update_roaster = TRUE;
-    width = scr_WindowHeight(tmp->win);
-    for (n = 0; n < tmp->nlines; n++) {
-      mvwprintw(tmp->win, n + 1, 1, "");
-      for (i = 0; i < width - 2; i++)
-	waddch(tmp->win, ' ');
-      mvwprintw(tmp->win, n + 1, 1, "%s", tmp->texto[n]);
-    }
-    //move(CHAT_WIN_HEIGHT - 1, maxX - 1);
-    update_panels();
-    doupdate();
-  } else {
-    top_panel(chatPanel);
-    currentWindow = tmp;
-  }
-}
-
-void scr_ShowBuddyWindow(void)
-{
-  buddy_entry_t *tmp = bud_SelectedInfo();
-  if (tmp->jid != NULL)
-    scr_ShowWindow(tmp->jid);
-  top_panel(inputPanel);
-}
-
-
-void scr_WriteInWindow(char *winId, char *texto, int TimeStamp, int force_show)
-{
-  time_t ahora;
-  int n;
-  int i;
-  int width;
-  window_entry_t *tmp;
-  int dont_show = FALSE;
-
-
-  tmp = scr_SearchWindow(winId);
-
-  if (!chatmode)
-    dont_show = TRUE;
-  else if ((!force_show) && ((!currentWindow || (currentWindow != tmp))))
-    dont_show = TRUE;
-  // scr_LogPrint("dont_show=%d", dont_show);
-
-  if (tmp == NULL) {
-    tmp = scr_CreatePanel(winId, 20, 0, CHAT_WIN_HEIGHT, maxX - 20, dont_show);
-    tmp->texto = (char **) calloc((CHAT_WIN_HEIGHT+1) * 3, sizeof(char *));
-    for (n = 0; n < CHAT_WIN_HEIGHT * 3; n++)
-      tmp->texto[n] = (char *) calloc(1, 1024);
-
-    if (TimeStamp) {
-      ahora = time(NULL);
-      strftime(tmp->texto[tmp->nlines], 1024, "[%H:%M] ",
-	       localtime(&ahora));
-      strcat(tmp->texto[tmp->nlines], texto);
-    } else {
-      sprintf(tmp->texto[tmp->nlines], "            %s", texto);
-    }
-    tmp->nlines++;
-  } else {
-    if (tmp->nlines < CHAT_WIN_HEIGHT - 2) {
-      if (TimeStamp) {
-	ahora = time(NULL);
-	strftime(tmp->texto[tmp->nlines], 1024,
-		 "[%H:%M] ", localtime(&ahora));
-	strcat(tmp->texto[tmp->nlines], texto);
-      } else {
-	sprintf(tmp->texto[tmp->nlines], "            %s", texto);
-      }
-      tmp->nlines++;
-    } else {
-      for (n = 0; n < tmp->nlines; n++) {
-	memset(tmp->texto[n], 0, 1024);
-	strncpy(tmp->texto[n], tmp->texto[n + 1], 1024);
-      }
-      if (TimeStamp) {
-	ahora = time(NULL);
-	strftime(tmp->texto[tmp->nlines - 1], 1024,
-		 "[%H:%M] ", localtime(&ahora));
-	strcat(tmp->texto[tmp->nlines - 1], texto);
-      } else {
-	sprintf(tmp->texto[tmp->nlines - 1], "            %s", texto);
-      }
-    }
-  }
-
-  if (!dont_show) {
-    top_panel(tmp->panel);
-    width = scr_WindowHeight(tmp->win);
-    for (n = 0; n < tmp->nlines; n++) {
-      mvwprintw(tmp->win, n + 1, 1, "");
-      for (i = 0; i < width - 2; i++)
-        waddch(tmp->win, ' ');
-      mvwprintw(tmp->win, n + 1, 1, "%s", tmp->texto[n]);
-    }
-
-    update_panels();
-    doupdate();
-  } else {
-    tmp->hidden_msg = TRUE;
-    update_roaster = TRUE;
-  }
-}
-
-void scr_InitCurses(void)
-{
-  initscr();
-  noecho();
-  raw();
-  //cbreak();
-  start_color();
-  use_default_colors();
-
-  ParseColors();
-
-  getmaxyx(stdscr, maxY, maxX);
-  inputLine[0] = 0;
-  ptr_inputline = inputLine;
-
-  //setlocale(LC_CTYPE, "");
-
-  return;
-}
-
-void scr_DrawMainWindow(void)
-{
-  /* Draw main panels */
-  rosterWnd = newwin(CHAT_WIN_HEIGHT, 20, 0, 0);
-  rosterPanel = new_panel(rosterWnd);
-  scr_draw_box(rosterWnd, 0, 0, CHAT_WIN_HEIGHT, 20, COLOR_GENERAL, 0, 0);
-  mvwprintw(rosterWnd, 0, (20 - strlen(i18n("Roster"))) / 2,
-	    i18n("Roster"));
-
-  chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - 20, 0, 20);
-  chatPanel = new_panel(chatWnd);
-  scr_draw_box(chatWnd, 0, 0, CHAT_WIN_HEIGHT, maxX - 20, COLOR_GENERAL, 0, 0);
-  //mvwprintw(chatWnd, 0,
-	//    ((maxX - 20) - strlen(i18n("Status Window"))) / 2,
-	//    i18n("Status Window"));
-  //wbkgd(chatWnd, COLOR_PAIR(COLOR_GENERAL));
-  mvwprintw(chatWnd, 1, 1, "This is the status window");
-
-  logWnd_border = newwin(LOG_WIN_HEIGHT, maxX, CHAT_WIN_HEIGHT, 0);
-  logPanel_border = new_panel(logWnd_border);
-  scr_draw_box(logWnd_border, 0, 0, LOG_WIN_HEIGHT, maxX, COLOR_GENERAL, 0, 0);
-//  mvwprintw(logWnd_border, 0,
-//	    ((maxX - 20) - strlen(i18n("Log Window"))) / 2,
-//	    i18n("Log Window"));
-  //logWnd = newwin(LOG_WIN_HEIGHT - 2, maxX-20 - 2, CHAT_WIN_HEIGHT+1, 20+1);
-  logWnd = derwin(logWnd_border, LOG_WIN_HEIGHT-2, maxX-2, 1, 1);
-  logPanel = new_panel(logWnd);
-  wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL));
-  //wattrset(logWnd, COLOR_PAIR(COLOR_GENERAL));
-  scr_LogPrint("Start up.");
-
-  scrollok(logWnd,TRUE);
-  //idlok(logWnd,TRUE);  // XXX Necessary?
-
-  inputWnd = newwin(1, maxX, maxY-1, 0);
-  inputPanel = new_panel(inputWnd);
-  //wbkgd(inputWnd, COLOR_PAIR(COLOR_GENERAL));
-
-  bud_DrawRoster(rosterWnd);
-  update_panels();
-  doupdate();
-  return;
-}
-
-void scr_TerminateCurses(void)
-{
-  clear();
-  refresh();
-  endwin();
-  return;
-}
-
-void scr_WriteIncomingMessage(char *jidfrom, char *text)
-{
-  char **submsgs;
-  int n, i;
-  char *buffer = (char *) malloc(5 + strlen(text));
-
-  sprintf(buffer, "<== %s", text);
-
-  submsgs =
-      ut_SplitMessage(buffer, &n, maxX - scr_WindowHeight(rosterWnd) - 20);
-
-  for (i = 0; i < n; i++) {
-    if (i == 0)
-      scr_WriteInWindow(jidfrom, submsgs[i], TRUE, FALSE);
-    else
-      scr_WriteInWindow(jidfrom, submsgs[i], FALSE, FALSE);
-  }
-
-  for (i = 0; i < n; i++)
-    free(submsgs[i]);
-
-  free(submsgs);
-  free(buffer);
-
-  top_panel(inputPanel);
-  //wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine);
-  update_panels();
-  doupdate();
-}
-
-int scr_Getch(void)
-{
-  int ch;
-  // keypad(inputWnd, TRUE);
-  ch = wgetch(inputWnd);
-  return ch;
-}
-
-WINDOW *scr_GetRosterWindow(void)
-{
-  return rosterWnd;
-}
-
-WINDOW *scr_GetStatusWindow(void)
-{
-  return chatWnd;
-}
-
-WINDOW *scr_GetInputWindow(void)
-{
-  return inputWnd;
-}
-
-void scr_LogPrint(const char *fmt, ...)
-{
-  time_t timestamp;
-  char *buffer;
-  va_list ap;
-
-  buffer = (char *) calloc(1, 4096);
-
-  timestamp = time(NULL);
-  strftime(buffer, 64, "[%H:%M:%S] ", localtime(&timestamp));
-  wprintw(logWnd, "\n%s", buffer);
-
-  va_start(ap, fmt);
-  vsnprintf(buffer, 4096, fmt, ap);
-  va_end(ap);
-
-  wprintw(logWnd, "%s", buffer);
-  free(buffer);
-
-  update_panels();
-  doupdate();
-}
-
-//  scr_IsHiddenMessage(jid)
-// Returns TRUE if there is a hidden message in the window
-// for the jid contact.
-int scr_IsHiddenMessage(char *jid) {
-  window_entry_t *wintmp;
-
-  wintmp = scr_SearchWindow(jid);
-  if ((wintmp) && (wintmp->hidden_msg))
-    return TRUE;
-
-  return FALSE;
-}
-
-void send_message(int sock, char *msg)
-{
-  char **submsgs;
-  char *buffer = (char *) calloc(1, 24+strlen(msg));
-  char *buffer2 = (char *) calloc(1, 1024);
-  int n, i;
-  buddy_entry_t *tmp = bud_SelectedInfo();
-
-  scr_ShowWindow(tmp->jid);
-
-  sprintf(buffer, "--> %s", msg);
-
-  submsgs =
-	ut_SplitMessage(buffer, &n,
-			maxX - scr_WindowHeight(rosterWnd) - 20);
-  for (i = 0; i < n; i++) {
-    if (i == 0)
-      scr_WriteInWindow(tmp->jid, submsgs[i], TRUE, TRUE);
-    else
-      scr_WriteInWindow(tmp->jid, submsgs[i], FALSE, TRUE);
-  }
-
-  for (i = 0; i < n; i++)
-    free(submsgs[i]);
-  free(submsgs);
-
-  //move(CHAT_WIN_HEIGHT - 1, maxX - 1);
-  refresh();
-  sprintf(buffer2, "%s@%s/%s", cfg_read("username"),
-          cfg_read("server"), cfg_read("resource"));
-  srv_sendtext(sock, tmp->jid, msg, buffer2);
-  free(buffer);
-  free(buffer2);
-
-  top_panel(inputPanel);
-}
-
-int process_line(char *line, int sock)
-{
-  if (*line != '/') {
-    send_message(sock, line);
-    return 0;
-  }
-  if (!strcasecmp(line, "/quit")) {
-    return 255;
-  }
-  // Commands handling
-  // TODO
-  // say...
-
-  scr_LogPrint("Unrecognised command, sorry.");
-  return 0;
-}
-
-//  check_offset(int direction)
-// Check inputline_offset value, and make sure the cursor is inside the
-// screen.
-inline void check_offset(int direction)
-{
-  // Left side
-  if (inputline_offset && direction <= 0) {
-    while (ptr_inputline <= (char*)&inputLine + inputline_offset) {
-      if (inputline_offset) {
-        inputline_offset -= 5;
-        if (inputline_offset < 0)
-          inputline_offset = 0;
-      }
-    }
-  }
-  // Right side
-  if (direction >= 0) {
-    while (ptr_inputline >= inputline_offset + (char*)&inputLine + maxX)
-      inputline_offset += 5;
-  }
-}
-
-int process_key(int key, int sock)
-{
-  if (isprint(key)) {
-    char tmpLine[INPUTLINE_LENGTH+1];
-
-    // Check the line isn't too long
-    if (strlen(inputLine) >= INPUTLINE_LENGTH)
-      return 0;
-
-    // Insert char
-    strcpy(tmpLine, ptr_inputline);
-    *ptr_inputline++ = key;
-    strcpy(ptr_inputline, tmpLine);
-    check_offset(1);
-  } else {
-    switch(key) {
-      case KEY_BACKSPACE:
-          if (ptr_inputline != (char*)&inputLine) {
-            *--ptr_inputline = 0;
-            check_offset(-1);
-          }
-          break;
-      case KEY_DC:
-          if (*ptr_inputline)
-            strcpy(ptr_inputline, ptr_inputline+1);
-          break;
-      case KEY_LEFT:
-          if (ptr_inputline != (char*)&inputLine) {
-            ptr_inputline--;
-            check_offset(-1);
-          }
-          break;
-      case KEY_RIGHT:
-          if (*ptr_inputline)
-            ptr_inputline++;
-            check_offset(1);
-          break;
-      case 9:     // Tab
-          scr_LogPrint("I'm unable to complete yet");
-          break;
-      case '\n':  // Enter
-          // XXX Test:
-          chatmode = TRUE;
-          if (inputLine[0] == 0) {
-            scr_ShowBuddyWindow();
-            break;
-          }
-          if (process_line(inputLine, sock))
-            return 255;
-          ptr_inputline = inputLine;
-          *ptr_inputline = 0;
-          inputline_offset = 0;
-          break;
-      case KEY_UP:
-          bud_RosterUp();
-          if (chatmode)
-            scr_ShowBuddyWindow();
-          break;
-      case KEY_DOWN:
-          bud_RosterDown();
-          if (chatmode)
-            scr_ShowBuddyWindow();
-          break;
-      case KEY_PPAGE:
-          scr_LogPrint("PageUp??");
-          break;
-      case KEY_NPAGE:
-          scr_LogPrint("PageDown??");
-          break;
-      case KEY_HOME:
-      case 1:
-          ptr_inputline = inputLine;
-          inputline_offset = 0;
-          break;
-      case KEY_END:
-      case 5:
-          for (; *ptr_inputline; ptr_inputline++) ;
-          check_offset(1);
-          break;
-      case 21:  // Ctrl-u
-          strcpy(inputLine, ptr_inputline);
-          ptr_inputline = inputLine;
-          inputline_offset = 0;
-          break;
-      case KEY_EOL:
-      case 11:  // Ctrl-k
-          *ptr_inputline = 0;
-          break;
-      case 16:  // Ctrl-p
-          scr_LogPrint("Ctrl-p not yet implemented");
-          break;
-      case 14:  // Ctrl-n
-          scr_LogPrint("Ctrl-n not yet implemented");
-          break;
-      case 27:  // ESC
-          currentWindow = NULL;
-          chatmode = FALSE;
-          top_panel(chatPanel);
-          top_panel(inputPanel);
-          break;
-      default:
-          scr_LogPrint("Unkown key=%d", key);
-    }
-    //scr_LogPrint("[%02x]", key);
-  }
-  mvwprintw(inputWnd, 0,0, "%s", inputLine + inputline_offset);
-  wclrtoeol(inputWnd);
-  if (*ptr_inputline) {
-    wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine - inputline_offset);
-  }
-  update_panels();
-  doupdate();
-  return 0;
-}
--- a/mcabber/screen.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#ifndef __SCREEN_H__
-#define __SCREEN_H__ 1
-
-#include <ncurses.h>
-
-#define COLOR_POPUP     1
-#define COLOR_GENERAL   3
-#define COLOR_BD_CONSEL 4
-#define COLOR_BD_CON    5
-#define COLOR_BD_DESSEL 6
-#define COLOR_BD_DES    7
-
-#define LOG_WIN_HEIGHT  (5+2)
-#define CHAT_WIN_HEIGHT (maxY-1-LOG_WIN_HEIGHT)
-
-#define INPUTLINE_LENGTH  1024
-
-extern int update_roaster;
-
-void scr_InitCurses(void);
-void scr_DrawMainWindow(void);
-void scr_TerminateCurses(void);
-void scr_CreatePopup(char *title, char *texto, int corte, int type,
-		     char *returnstring);
-void scr_WriteInWindow(char *nombreVentana, char *texto, int TimeStamp,
-                       int force_show);
-void scr_WriteIncomingMessage(char *jidfrom, char *text);
-void scr_RoolWindow(void);
-void scr_ShowBuddyWindow(void);
-void scr_LogPrint(const char *fmt, ...);
-
-int scr_IsHiddenMessage(char *jid);
-
-WINDOW *scr_GetRosterWindow(void);
-WINDOW *scr_GetStatusWindow(void);
-WINDOW *scr_GetInputWindow(void);
-
-int scr_Getch(void);
-
-int process_key(int, int sock);
-
-#endif
--- a/mcabber/server.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,460 +0,0 @@
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/poll.h>
-
-#include "list.h"
-#include "parsecfg.h"
-#include "screen.h"
-#include "socket.h"
-#include "utf8.h"
-#include "server.h"
-#include "harddefines.h"
-#include "utils.h"
-#include "buddies.h"
-
-#define JABBERPORT 5222
-
-
-/* Desc: poll data from server
- * 
- * In  : socket
- * Out : pending buffer (or NULL if no incoming data)
- *
- * Note: it is up to the caller to free the returned string
- */
-char *srv_poll(int sock)
-{
-  struct pollfd sock_p;
-  sock_p.fd = sock;
-  sock_p.events = POLLIN | POLLPRI;
-  sock_p.revents = 0;
-  poll(&sock_p, 1, 0);
-
-  if (sock_p.revents) {
-    return sk_recv(sock);
-  }
-
-  return NULL;
-}
-
-
-/* Desc: resolve host
- * 
- * In  : hostname
- * Out : 32bit address (or 0 if error)
- *
- * Note: -
- */
-static u_long srv_resolve(const char *host)
-{
-  long i;
-  struct hostent *he;
-
-  if ((i = inet_addr(host)) == -1) {
-    if (!(he = gethostbyname(host)))
-      return 0;
-    else
-      return (*(u_long *) he->h_addr);
-  }
-
-  return i;
-}
-
-
-/* Desc: connect to jabber server
- * 
- * In  : config
- * Out : socket (or -1 on error)
- *
- * Note: if port is -1, the default Jabber port will be used
- */
-int srv_connect(const char *server, unsigned int port)
-{
-  struct sockaddr_in name;
-  int sock;
-
-  if (server == NULL) {
-    fprintf(stderr, "You must supply a server name\n\r");
-    return -1;
-  }
-
-  if (port == -1U) {
-    port = JABBERPORT;
-  }
-
-  name.sin_family = AF_INET;
-  name.sin_port = htons(port);
-
-  if (!(name.sin_addr.s_addr = srv_resolve(server))) {
-    fprintf(stderr, "Cant resolve \"%s\"\n", server);
-    return -1;
-  }
-
-  if ((sock = sk_conn((struct sockaddr *) &name)) < 0) {
-    fprintf(stderr, "Can't connect to \"%s:%u\"\n", server, port);
-    return -1;
-  }
-
-  return sock;
-}
-
-
-/* Desc: login into jabber server
- * 
- * In  : socket, servername, user, password, resource
- * Out : idsession
- *
- * Note: it is up to the caller to free the returned string
- */
-char *srv_login(int sock, const char *server, const char *user,
-		const char *pass, const char *resource)
-{
-  char *stringtosend = malloc(2048);
-  char *response, *aux;
-  char *idsession = malloc(128);
-  int pos = 0;
-
-  memset(stringtosend, 0, 2048);
-  strcpy(stringtosend, "<?xml version='1.0' encoding='UTF-8' ?>");
-  strcat(stringtosend, "<stream:stream to='");
-  strcat(stringtosend, server);
-  strcat(stringtosend, "' xmlns='jabber:client' xmlns:stream='");
-  strcat(stringtosend, "http://etherx.jabber.org/streams'>\n");
-
-  if (!sk_send(sock, stringtosend)) {
-    perror("senddata (server.c:132)");
-    return NULL;
-  }
-  response = sk_recv(sock);
-  if (strstr(response, "error")) {
-    /* fprintf(stderr, "Response not valid:\n%s\n\n", response); */
-    scr_CreatePopup("Error",
-		    "Bad answer from the server", 60, 0, NULL);
-    return NULL;
-  }
-  aux = response;
-  while (strncmp(aux, "id", 2))
-    aux++;
-  pos = 0;
-  aux += 4;
-  while (strncmp(aux, "'", 1)) {
-    aux++;
-    pos++;
-  }
-  aux -= pos;
-  strncpy(idsession, aux, pos);
-
-  free(response);
-
-  strcpy(stringtosend, "<iq type='set' id='1000'>");
-  strcat(stringtosend, "<query xmlns='jabber:iq:auth'>");
-  strcat(stringtosend, "<username>");
-  strcat(stringtosend, user);
-  strcat(stringtosend, "</username><password>");
-  strcat(stringtosend, pass);
-  strcat(stringtosend, "</password><resource>");
-  strcat(stringtosend, resource);
-  strcat(stringtosend, "</resource></query></iq>\n");
-  if (!sk_send(sock, stringtosend)) {
-    perror("senddata (server.c:167)");
-    return NULL;
-  }
-  response = sk_recv(sock);
-  if (strstr(response, "error")) {
-/*	fprintf(stderr, "Response not valid:\n%s\n\n", response);*/
-    scr_CreatePopup("Error",
-		    "Account doesn't exist, or bad password", 60, 0,
-		    NULL);
-
-    /*
-    scr_CreatePopup("Info", "Trying to create the account...", 60, 0, NULL);
-
-    strcpy(stringtosend, "<iq type='set' id='reg' to='");
-    strcat(stringtosend, server);
-    strcat(stringtosend, "'>");
-    strcat(stringtosend, "<query xmlns='jabber:iq:register'>");
-    strcat(stringtosend, "<username>");
-    strcat(stringtosend, user);
-    strcat(stringtosend, "</username><password>");
-    strcat(stringtosend, pass);
-    strcat(stringtosend, "</password>");
-    strcat(stringtosend, "</query></iq>\n");
-    if (!sk_send(sock, stringtosend)) {
-      perror("senddata (server.c:167)");
-      return NULL;
-    }
-
-    response = sk_recv(sock);
-    */
-    scr_TerminateCurses();
-    printf("Reinicie cabber!\n\n");
-    return NULL;
-  }
-  free(response);
-  free(stringtosend);
-
-  return idsession;
-}
-
-
-/* Desc: broadcast presence
- * 
- * In  : socket, presence string
- * Out : ?
- *
- * Note: see `sk_send' for output values
- */
-int srv_setpresence(int sock, const char *type)
-{
-  int rv;
-  char *str = malloc(1024);
-
-  sprintf(str, "<presence><status>%s</status></presence>", type);
-  if (!(rv = sk_send(sock, str))) {
-    perror("senddata (server.c:199)");
-  }
-  free(str);
-
-  return rv;
-}
-
-
-/* Desc: request roster
- * 
- * In  : socket
- * Out : roster string
- *
- * Note: it is up to the caller to free the returned string
- */
-char *srv_getroster(int sock)
-{
-  char *str = malloc(1024);
-
-  strcpy(str, "<iq type='get' id='1001'><query xmlns='");
-  strcat(str, "jabber:iq:roster'/></iq>\n");
-  if (!sk_send(sock, str)) {
-    perror("senddata (server.c:222)");
-    return NULL;
-  }
-  free(str);
-
-  return sk_recv(sock);
-}
-
-
-/* Desc: send text to buddy
- * 
- * In  : socket, destination jid, text, source jid
- * Out : 0 = ok
- *
- * Note: -
- */
-int
-srv_sendtext(int sock, const char *to, const char *text, const char *from)
-{
-  char *stringtosend = malloc(2048);
-  char *utf8inputline = utf8_encode(text);
-
-  sprintf(stringtosend,
-	  "<message from='%s' to='%s' type='chat'><body>%s</body></message>",
-	  from, to, utf8inputline);
-  if (!sk_send(sock, stringtosend)) {
-    perror("senddata (server.c:247)");
-    return -1;
-  }
-
-  free(stringtosend);
-  free(utf8inputline);
-  return 0;
-}
-
-int check_io(int fd1, int fd2)
-{
-  int n = 0, i;
-  fd_set fds;
-  int io_pending = 0;
-
-  i = fd1;
-  if (fd2 > fd1)
-    i = fd2;
-
-  FD_ZERO(&fds);
-  if (fd1 >= 0)
-    FD_SET(fd1, &fds);
-  else
-    fd1 = 0;
-  if (fd2 >= 0)
-    FD_SET(fd2, &fds);
-  else
-    fd2 = 0;
-
-  if (fd2 == 0 && io_pending)
-    n = 2;
-  else if (select(i + 1, &fds, NULL, NULL, NULL) > 0)
-    n = 1 * (FD_ISSET(fd1, &fds) > 0) + 2 * (FD_ISSET(fd2, &fds) > 0);
-
-  return (n);
-}
-
-/* Desc: read data from server
- *
- * In  : socket
- * Out : ptr to newly allocated srv_msg struct
- *
- * Note: returns NULL if no input from server
- */
-srv_msg *readserver(int sock)
-{
-  char *buffer = sk_recv(sock);
-
-  if (buffer != NULL) {
-    srv_msg *msg = calloc(1, sizeof(srv_msg));
-    char *to = getattr(buffer, "to='");
-    char *from = getattr(buffer, "from='");
-    char *id = getattr(buffer, "id='");
-    char *type = getattr(buffer, "type='");
-    char *body = gettag(buffer, "body");
-    char *status = gettag(buffer, "status");
-    char *show = gettag(buffer, "show");
-    char *line = (char *) malloc(1024);
-    memset(line, 0, 1024);
-
-    /* scan for buffer */
-    if (!strncmp(buffer, "<message", 8)) {		/* manage messages */
-      msg->m = SM_MESSAGE;
-    } else if (!strncmp(buffer, "<presence", 9)) {	/* manage presences */
-      msg->m = SM_PRESENCE;
-      if (!strncmp(type, "UNK", 3)) {			/* assume online */
-	msg->connected = FLAG_BUDDY_CONNECTED;
-      } else if (!strncmp(type, "unavailable", 11)) {	/* offline */
-	msg->connected = 0;
-      }
-    } else {
-      msg->m = SM_UNHANDLED;
-    }
-
-    /* write the parsed buffer */
-    switch (msg->m) {
-    case SM_MESSAGE:
-      {
-	char *aux = strstr(from, "/");
-	if (aux)
-	  *aux = '\0';
-	msg->from = from;
-	msg->body = utf8_decode(body);
-	ut_WriteLog("+OK [%s]\n", buffer);
-      }
-      break;
-
-    case SM_PRESENCE:
-      {
-	char *aux = strstr(from, "/");
-	if (aux)
-	  *aux = '\0';
-	msg->from = from;
-      }
-      break;
-
-    case SM_UNHANDLED:
-      ut_WriteLog("BAD [%s]\n", buffer);
-      break;
-
-    }
-    free(line);
-    if (strncmp(to, "UNK", 3))
-      free(to);
-    if (strncmp(from, "UNK", 3) && (msg->m != SM_MESSAGE)
-	&& (msg->m != SM_PRESENCE))
-      free(from);
-    if (strncmp(id, "UNK", 3))
-      free(id);
-    if (strncmp(type, "UNK", 3))
-      free(type);
-    if (strncmp(body, "UNK", 3))
-      free(body);
-    if (strncmp(status, "UNK", 3))
-      free(status);
-    if (strncmp(show, "UNK", 3))
-      free(show);
-    free(buffer);
-
-    return msg;
-  }
-
-  return NULL;
-}
-
-void srv_AddBuddy(int sock, char *jidname)
-{
-  char *buffer = (char *) malloc(1024);
-  char *p, *str;
-  int i;
-
-  memset(buffer, 0, 1024);
-  strcpy(buffer, "<iq type='set'>");
-  strcat(buffer, "  <query xmlns='jabber:iq:roster'>");
-  strcat(buffer, "    <item");
-  strcat(buffer, "      jid='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' name='");
-
-  str = strdup(jidname);
-  p = strstr(str, "@");
-  if (p)
-    *p = '\0';
-  strcat(buffer, str);
-  strcat(buffer, "'/></query></iq>");
-  sk_send(sock, buffer);
-  free(buffer);
-
-  for (i = 0; i < 2; i++) {
-    buffer = sk_recv(sock);
-    ut_WriteLog("[Subscription]: %s\n", buffer);
-    free(buffer);
-  }
-
-  buffer = (char *) malloc(1024);
-  memset(buffer, 0, 1024);
-  strcpy(buffer, "<presence to='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' type='subscribe'>");
-  strcat(buffer, "<status>I would like to add you!</status></presence>");
-  sk_send(sock, buffer);
-  free(buffer);
-
-  buffer = sk_recv(sock);
-  ut_WriteLog("[Subscription]: %s\n", buffer);
-  free(buffer);
-
-  buffer = (char *) malloc(1024);
-  memset(buffer, 0, 1024);
-  strcpy(buffer, "<presence to='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' type='subscribed'/>");
-  sk_send(sock, buffer);
-  free(buffer);
-
-  buffer = sk_recv(sock);
-  ut_WriteLog("[Subscription]: %s\n", buffer);
-  free(buffer);
-}
-
-void srv_DelBuddy(int sock, char *jidname)
-{
-  char *buffer = (char *) malloc(1024);
-
-  strcpy(buffer, "<iq type='set'><query xmlns='jabber:iq:roster'>");
-  strcat(buffer, "<item jid='");
-  strcat(buffer, jidname);
-  strcat(buffer, "' subscription='remove'/></query></iq>");
-
-  sk_send(sock, buffer);
-  free(buffer);
-
-  buffer = sk_recv(sock);
-  ut_WriteLog("[SubscriptionRemove]: %s\n", buffer);
-  free(buffer);
-}
--- a/mcabber/server.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#ifndef __SERVER_H__
-#define __SERVER_H__ 1
-
-typedef enum {
-  SM_MESSAGE,
-  SM_PRESENCE,
-  SM_UNHANDLED
-} SRV_MSGTYPE;
-
-typedef struct {
-  SRV_MSGTYPE m;		/* message type: see above! */
-  int connected;		/* meaningful only with SM_PRESENCE */
-  char *from;			/* sender */
-  char *body;			/* meaningful only with SM_MESSAGE */
-} srv_msg;
-
-char *srv_poll(int sock);
-int srv_connect(const char *server, unsigned int port);
-char *srv_login(int sock, const char *server, const char *user,
-		const char *pass, const char *resource);
-int srv_setpresence(int sock, const char *type);
-char *srv_getroster(int sock);
-int srv_sendtext(int sock, const char *to, const char *text,
-		 const char *from);
-int check_io(int fd1, int fd2);
-srv_msg *readserver(int sock);
-void srv_DelBuddy(int sock, char *jidname);
-void srv_AddBuddy(int sock, char *jidname);
-#endif
--- a/mcabber/socket.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include "utils.h"
-
-#include "socket.h"
-#include <signal.h>
-
-#include "screen.h" // FIXME to be removed
-
-/* Desc: create socket connection
- * 
- * In  : servername, port
- * Out : socket (or -1 on error)
- *
- * Note: -
- */
-int sk_conn(struct sockaddr *name)
-{
-  int sock;
-
-  if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
-    perror("socket (socket.c:23)");
-    return -1;
-  }
-
-  if (connect(sock, (struct sockaddr *) name, sizeof(struct sockaddr)) < 0) {
-    perror("connect (socket.c:29)");
-    return -1;
-  }
-
-  return sock;
-}
-
-
-/* Desc: send data through socket
- * 
- * In  : socket, buffer to send
- * Out : 0 = fail, 1 = pass
- *
- * Note: -
- */
-int sk_send(int sock, char *buffer)
-{
-  //ut_WriteLog("Sending:%s\n", buffer);
-  if ((send(sock, buffer, strlen(buffer), 0)) == -1)
-    return 0;
-  else
-    return 1;
-}
-
-/* Desc: receive data through socket
- * 
- * In  : socket
- * Out : received buffer
- *
- * Note: it is up to the caller to free the returned string
- */
-char *sk_recv(int sock)
-{
-  int i = 1;
-  int tambuffer = 128;
-  char mtag[16];    // For tag name
-
-  char *buffer = malloc(tambuffer);
-  char *retval = malloc(tambuffer + 1);
-
-  memset(retval, 0, tambuffer);
-  memset(buffer, 0, tambuffer + 1);
-
-  while (1) {
-    char *p1;
-    int n = recv(sock, buffer, tambuffer, 0);
-    if (n == -1) {
-      // Error
-      free(buffer);
-      retval[0] = 0;
-      return retval;
-    }
-
-    if (i == 1) {
-      char *p2;
-      strcpy(retval, buffer);
-      p1 = retval+1;
-      p2 = mtag;
-      while (('a' <= *p1) && (*p1 <= 'z') && (p2-mtag < 14))
-        *p2++ = *p1++;
-      *p2++ = '>'; *p2++ = 0;
-      //fprintf(stderr, "TAG=\"%s\"\n", mtag);
-    } else {
-      scr_LogPrint("Realloc %d [%d]", i-1, n);
-      if (!n)
-        break;
-      retval = realloc(retval, (tambuffer * i) + 1);
-      strncat(retval, buffer, tambuffer + 1);
-    }
-    i++;
-    p1 = retval + strlen(retval) - strlen(mtag);
-    //fprintf(stderr, "buffer:[%s]\n", buffer);
-    //fprintf(stderr, "End RET=[%s]\n", p1);
-    if (!strcmp(p1, mtag))
-      break;
-    for (p1 = retval; *p1 && (*p1 != '>'); p1++);
-    if ((*p1 == '>') && (*(p1-1) == '/'))
-      break;
-    memset(buffer, 0, tambuffer);
-  }
-  free(buffer);
-  ut_WriteLog("Received:%s\n", retval);
-  return retval;
-}
--- a/mcabber/socket.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-#ifndef __SOCKET_H__
-#define __SOCKET_H__ 1
-
-#include <sys/socket.h>
-
-int sk_conn(struct sockaddr *name);
-int sk_send(int sock, char *buffer);
-char *sk_recv(int sock);
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/ACKNOWLEDGEMENT	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,16 @@
+Special Thanks to:
+    Daniel Borca   (http://www.geocities.com/dborca).
+		   Many of the new code is his own work!!!
+		   Thanks Daniel!!!
+
+Thanks to:
+    Abrililla	   (???)
+    Gabber	   (http://gabber.sourceforge.net)
+    Manolo Romero  (cobreti@mundivia.es)    
+    NexusX	   (nexusx666@ajmacias.com)
+    Pablo2000	   (josepablosc@wanadoo.es)
+    Pras           (???)
+    Ted		   (ted@php.net)
+    Thomas Fischer (th.fischer@gmx.net)
+    _Yed_	   (#linux at irc-hispano)
+    ZJoyKiller 	   (#linux at irc-hispano)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/COPYING	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/Changelog	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,46 @@
+--[cabber 0.5.0-test1]--
+  - unification of lists in list.h
+  - changed UI... now is multiwindow and have popups!!!
+  - roster is now capable of add/delete buddies (very primitive and buggy!)
+  - improved many routines. Thanks to Daniel Borca.
+  - Added i18n function to translate cabber to others languages
+  - TODO: management of buddies away status...
+
+--[cabber 0.4.0-test5]--
+  - many bugs fixed: (roster, utf8...)
+  
+--[cabber 0.4.0-test4]--
+  - added UTF8 encoding/decoding (yes, it have bugs...)
+  - added default color for make cabber transparent (Johannes WeiBl)
+  - fixed cursor position.
+  
+--[cabber 0.4.0-test3]--
+  - rewritten routine "receivedata" at socket.c (bug #1: Johannes WeiBl)
+  - ignored left and rigth keys until i implement input line editor.
+  - colors are stored in $HOME/.cabberrc
+	- see cabberrc.example ;-)
+	
+--[cabber 0.4.0-test2]--
+  - not public.	
+
+--[cabber 0.4.0-test1]--
+  - many routines has been rewritten again d8-)
+  
+    * use of lists instead of stacks for store data
+	- stack.c is not needed anymore, i use list.c instead.
+	- added a ugly routine for sort list (improve it!!)
+
+    * socket module has been rewritten and improved:
+	- O_NONBLOCK eliminated
+	  
+    * module parse.c has been rewritten: now is more effective.
+
+    * the XML parser is now more effective (i hope!)	 
+
+    * contact list:
+	- it have scroll bar now,  (manoleT have a large list of contacts ;-)
+	- now contacts are sorted alphabetically.
+	
+    * a lot of new bugs... sorry, but my main pc is broken. This version
+      of cabber has been made in my laptop.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/Makefile	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,80 @@
+#
+# mcabber Makefile
+#
+
+
+#
+#  Available options:
+#
+#    Environment variables:
+#	CPU		optimize for the given processor.
+#			default = pentium
+#	DEBUG=1		disable optimizations and build for debug
+#			default = no
+#
+#    Targets:
+#	all:		build executable
+#	clean:		remove object files
+#	realclean:	remove all generated files
+#	install:	build & install
+#	dep:		create dependencies
+#
+
+
+.PHONY: all clean realclean install
+# dep
+
+CPU ?= i386
+JCLIENT = mcabber
+
+CC = gcc
+CFLAGS = -Wall -W -pedantic
+LD = gcc
+LDLIBS = -lncurses -lpanel
+
+ifeq ($(DEBUG),1)
+CFLAGS += -O0 -g -DDEBUG=1
+else
+CFLAGS += -O2 -mcpu=$(CPU)
+LDFLAGS = -s
+endif
+
+CP = cp -f
+
+SOURCES = \
+    main.c \
+    screen.c \
+    utils.c \
+    buddies.c \
+    parsecfg.c \
+    server.c \
+    socket.c \
+    lang.c \
+    utf8.c
+
+OBJECTS = $(SOURCES:.c=.o)
+
+.c.o:
+	$(CC) -o $@ $(CFLAGS) -c $<
+
+all: $(JCLIENT)
+
+$(JCLIENT): $(OBJECTS)
+	$(LD) -o $@ $(LDFLAGS) $^ $(LDLIBS)
+
+clean:
+	-$(RM) *~
+	-$(RM) $(JCLIENT)
+	-$(RM) $(OBJECTS)
+#	-$(RM) depend
+
+realclean: clean
+	-$(RM) $(JCLIENT)
+
+install: all
+	$(CP) $(JCLIENT) /usr/bin/$(JCLIENT)
+
+#dep: $(SOURCES)
+#	makedepend -f- -Ylydialog -- $(CFLAGS) -- $(SOURCES) > depend
+
+#-include depend
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/README	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,17 @@
+Well, the documentation is missing yet, but...
+
+!!!!!! SEE mcabberrc.example !!!!!!
+
+configfile:
+    The configfile will be placed in $HOME/.mcabberrc
+    and it will be:
+	
+	    username = username
+	    password = yourpassword
+	    server = serveryou.use
+	    resource = yourresourcenameOFFICE
+	    passtype = plain  (or sha1)
+	    
+
+That's all folks! (by the moment ;-)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/TODO	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,24 @@
+
+* pending message not displayed if buddy outside Contact window
+
+* Use libjabber
+* Commands! :-)
+  - /say
+  - /add
+  - /del
+  - /rename
+  - /info
+  - /request_auth (??)
+  - /status (and common shortcuts: /away, /online, /busy, /dnd)
+* Buddies status
+* Command line history (^P/^N)
+* External commands for events
+* Multi-lines
+* Handle window resize (will be hard with current implementation...)
+* Command line completion
+* Scroll back history
+* Save history
+* Shortcut to jump to next message received (shift-tab?)
+* File transfer? :)
+* Conferences :))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/buddies.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,376 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ncurses.h>
+#include <panel.h>
+#include "screen.h"
+#include "buddies.h"
+
+#include "lang.h"
+#include "utils.h"
+#include "server.h"
+#include "list.h"
+#include "harddefines.h"
+
+/* global vars for BUDDIES.C */
+int buddySelected = 1;		/* Hold the selected Buddy  */
+int buddyOffset = 0;		/* Hold the roster offset   */
+
+static LIST_HEAD(buddy_list);
+static LIST_HEAD(sorted_buddies);
+
+#define buddy_entry(n) list_entry(n, buddy_entry_t, list)
+
+
+void bud_SetBuddyStatus(char *jidfrom, int status)
+{
+  struct list_head *pos, *n;
+  buddy_entry_t *tmp;
+  int changed = 0;
+  char *buffer = (char *) malloc(4096);
+
+  list_for_each_safe(pos, n, &buddy_list) {
+    tmp = buddy_entry(pos);
+    if (!strcmp(tmp->jid, jidfrom)) {
+      if (tmp->flags != status) {
+	tmp->flags = status;
+	changed = 1;
+      }
+      break;
+    }
+  }
+  if (changed) {
+    bud_DrawRoster(scr_GetRosterWindow());
+    switch (status) {
+    case FLAG_BUDDY_DISCONNECTED:
+      sprintf(buffer, "--> %s %s!", jidfrom, i18n("disconected"));
+      break;
+
+    case FLAG_BUDDY_CONNECTED:
+      sprintf(buffer, "--> %s %s!", jidfrom, i18n("connected"));
+      break;
+    }
+    scr_LogPrint("%s", buffer);
+  }
+  free(buffer);
+}
+
+int compara(buddy_entry_t * t1, buddy_entry_t * t2)
+{
+  const char *s1 =
+      (const char *) (STR_EMPTY(t1->name) ? t1->jid : t1->name);
+  const char *s2 =
+      (const char *) (STR_EMPTY(t2->name) ? t2->jid : t2->name);
+  return strcasecmp(s1, s2);
+}
+
+void bud_SortRoster(void)
+{
+  buddy_entry_t *indice, *tmp;
+  struct list_head *pos, *n;
+
+  while (!list_empty(&buddy_list)) {
+    indice = NULL;
+    tmp = NULL;
+    list_for_each_safe(pos, n, &buddy_list) {
+      if (!indice) {
+	indice = buddy_entry(pos);
+	tmp = buddy_entry(pos);
+      } else {
+	tmp = buddy_entry(pos);
+	if (compara(indice, tmp) > 0) {
+	  indice = tmp;
+	}
+      }
+    }
+    list_move_tail(&indice->list, &sorted_buddies);
+  }
+  list_splice(&sorted_buddies, &buddy_list);
+}
+
+void bud_ParseBuddies(char *roster)
+{
+  buddy_entry_t *tmp = NULL;
+  char *aux;
+  char *p, *str;
+
+  ut_WriteLog("[roster]: %s\n\n", roster);
+
+  while ((aux = ut_strrstr(roster, "<item")) != NULL) {
+    char *jid = getattr(aux, "jid='");
+    char *name = getattr(aux, "name='");
+    char *group = gettag(aux, "group='");
+
+    *aux = '\0';
+
+    tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t));
+
+    tmp->flags = FLAG_BUDDY_DISCONNECTED;
+
+    if (strncmp(jid, "UNK", 3)) {
+      char *res = strstr(jid, "/");
+      if (res)
+	*res = '\0';
+
+      tmp->jid = (char *) malloc(strlen(jid) + 1);
+      strcpy(tmp->jid, jid);
+      free(jid);
+    }
+
+    if (strncmp(name, "UNK", 3)) {
+      tmp->name = (char *) calloc(1, strlen(name) + 1);
+      strcpy(tmp->name, name);
+      free(name);
+    } else {
+      tmp->name = (char *) calloc(1, strlen(tmp->jid) + 1);
+      str = strdup(tmp->jid);
+      p = strstr(str, "@");
+      if (p) {
+	*p = '\0';
+      }
+      strncpy(tmp->name, str, 18);
+      free(str);
+    }
+
+    if (strncmp(group, "UNK", 3)) {
+      tmp->group = (char *) malloc(strlen(group) + 1);
+      strcpy(tmp->group, group);
+      free(group);
+    }
+
+    if (!strncmp(tmp->jid, "msn.", 4)) {
+      sprintf(tmp->name, "%c MSN %c", 254, 254);
+    }
+
+    if (!STR_EMPTY(tmp->jid)) {
+      list_add_tail(&tmp->list, &buddy_list);
+    } else {
+      if (tmp->jid)
+	free(tmp->jid);
+      if (tmp->name)
+	free(tmp->name);
+      if (tmp->group)
+	free(tmp->group);
+      free(tmp);
+    }
+  }
+  free(roster);
+
+  bud_SortRoster();
+}
+
+/* Desc: Initialize buddy list
+ * 
+ * In : none
+ * Out: none
+ *
+ * Note: none
+ */
+void bud_InitBuddies(int sock)
+{
+  char *roster;
+  roster = srv_getroster(sock);
+  bud_ParseBuddies(roster);
+}
+
+/* Desc: Destroy (and free) buddy list
+ * 
+ * In : none
+ * Out: none
+ *
+ * Note: none
+ */
+void bud_TerminateBuddies(void)
+{
+}
+
+/* Desc: Count elements in buddy list
+ * 
+ * In : none
+ * Out: number of buddies
+ *
+ * Note: none
+ */
+int bud_BuddyCount(void)
+{
+  int i = 0;
+  struct list_head *pos, *n;
+
+  list_for_each_safe(pos, n, &buddy_list) {
+    i++;
+  }
+  return i;
+}
+
+/* Desc: Draw the roster in roster window
+ * 
+ * In : roster window
+ * Out: none
+ *
+ * Note: none
+ */
+void bud_DrawRoster(WINDOW * win)
+{
+  buddy_entry_t *tmp = NULL;
+  struct list_head *pos, *nn;
+  int i = 1;
+  int n;
+  int maxx, maxy;
+  int fakeOffset = buddyOffset;
+
+  getmaxyx(win, maxy, maxx);
+
+
+  /* cleanup of roster window */
+  wattrset(win, COLOR_PAIR(COLOR_GENERAL));
+  for (i = 1; i < maxy - 1; i++) {
+    mvwprintw(win, i, 1, "");
+    for (n = 2; n < maxx; n++)
+      waddch(win, ' ');
+  }
+
+  i = 1;
+  list_for_each_safe(pos, nn, &buddy_list) {
+
+    char status = '?';
+    char pending = ' ';
+
+    if (fakeOffset > 0) {
+      fakeOffset--;
+      continue;
+    }
+
+    tmp = buddy_entry(pos);
+    if (scr_IsHiddenMessage(tmp->jid)) {
+      pending = '#';
+    }
+
+    if ((tmp->flags && FLAG_BUDDY_CONNECTED) == 1) {
+      status = 'o';
+      if (i == (buddySelected - buddyOffset))
+	wattrset(win, COLOR_PAIR(COLOR_BD_CONSEL));
+      else
+	wattrset(win, COLOR_PAIR(COLOR_BD_CON));
+    } else {
+      if (i == (buddySelected - buddyOffset))
+	wattrset(win, COLOR_PAIR(COLOR_BD_DESSEL));
+      else
+	wattrset(win, COLOR_PAIR(COLOR_BD_DES));
+    }
+    mvwprintw(win, i, 1, "");
+    for (n = 2; n < maxx; n++)
+      waddch(win, ' ');
+    //mvwprintw(win, i, (maxx - strlen(tmp->name)) / 2, "%s", tmp->name);
+    mvwprintw(win, i, 1, " %c[%c] %.12s", pending, status, tmp->name);
+    i++;
+    if (i >= maxy - 1)
+      break;
+  }
+  update_panels();
+  doupdate();
+
+  update_roaster = FALSE;
+}
+
+/* Desc: Change selected buddy (one position down)
+ * 
+ * In : none
+ * Out: none
+ *
+ * Note: none
+ */
+void bud_RosterDown(void)
+{
+  int x, y;
+  getmaxyx(scr_GetRosterWindow(), y, x);
+  y -= 2;
+
+  if (buddySelected < bud_BuddyCount()) {
+    buddySelected++;
+    if (buddySelected > y)
+      buddyOffset++;
+    bud_DrawRoster(scr_GetRosterWindow());
+  }
+}
+
+/* Desc: Change selected buddy (one position up)
+ * 
+ * In : none
+ * Out: none
+ *
+ * Note: none
+ */
+void bud_RosterUp(void)
+{
+  if (buddySelected > 1) {
+    buddySelected--;
+    if (buddySelected - buddyOffset < 1)
+      buddyOffset--;
+    bud_DrawRoster(scr_GetRosterWindow());
+  }
+}
+
+/* Desc: Retrieve info for selected buddy
+ * 
+ * In : none
+ * Out: (buddy_entry_t *) of selected buddy
+ *
+ * Note: none
+ */
+buddy_entry_t *bud_SelectedInfo(void)
+{
+  struct list_head *pos, *n;
+  buddy_entry_t *tmp = NULL;
+
+  int i = 0;
+
+  list_for_each_safe(pos, n, &buddy_list) {
+    tmp = buddy_entry(pos);
+    if (i == buddySelected - 1) {
+      return tmp;
+    }
+    i++;
+  }
+  return NULL;
+}
+
+void bud_AddBuddy(int sock)
+{
+  char *buffer = (char *) calloc(1, 1024);
+  char *buffer2 = (char *) calloc(1, 1024);
+  char *p, *str;
+  buddy_entry_t *tmp;
+
+  ut_CenterMessage(i18n("write jid here"), 60, buffer2);
+  scr_CreatePopup(i18n("Add jid"), buffer2, 60, 1, buffer);
+
+  if (!STR_EMPTY(buffer)) {
+    tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t));
+    tmp->jid = (char *) malloc(strlen(buffer) + 1);
+    strcpy(tmp->jid, buffer);
+    tmp->name = (char *) malloc(strlen(buffer) + 1);
+
+    str = strdup(buffer);
+    p = strstr(str, "@");
+    if (p) {
+      *p = '\0';
+    }
+    strcpy(tmp->name, str);
+    free(str);
+
+    list_add_tail(&tmp->list, &buddy_list);
+    buddySelected = 1;
+    bud_DrawRoster(scr_GetRosterWindow());
+    srv_AddBuddy(sock, tmp->jid);
+  }
+  free(buffer);
+}
+
+void bud_DeleteBuddy(int sock)
+{
+  buddy_entry_t *tmp = bud_SelectedInfo();
+  srv_DelBuddy(sock, tmp->jid);
+  list_del(&tmp->list);
+  buddySelected = 1;
+  bud_DrawRoster(scr_GetRosterWindow());
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/buddies.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,29 @@
+#ifndef __BUDDIES_H__
+#define __BUDDIES_H__ 1
+
+#include <ncurses.h>
+#include "list.h"
+
+/* Definición de tipos */
+typedef struct _buddy_entry_t {
+  char *jid;
+  char *name;
+  char *group;
+  char *resource;
+  int flags;
+  struct list_head list;
+} buddy_entry_t;
+
+void bud_DrawRoster(WINDOW * win);
+void bud_RosterDown(void);
+void bud_RosterUp(void);
+void bud_InitBuddies(int sock);
+void bud_TerminateBuddies(void);
+int bud_BuddyCount(void);
+void bud_SetBuddyStatus(char *jidfrom, int status);
+void bud_ParseBuddies(char *roster);
+void bud_AddBuddy(int sock);
+void bud_DeleteBuddy(int sock);
+buddy_entry_t *bud_SelectedInfo(void);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/cabberrc.example	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,18 @@
+username = yourusername
+password = yourpassword
+server = your.jabber.server
+port = 5222
+resource = yourresource
+passtype = plain
+
+
+#now, the colors
+#color are: black, red, green, yellow, blue, magenta, cyan, white
+color_background = blue
+color_backselected = cyan
+color_borderlines = white
+color_jidonlineselected = black
+color_jidonline = green
+color_jidofflineselected = red
+color_jidoffline = red
+color_text = white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/harddefines.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,15 @@
+#ifndef __AJMACIAS__
+#define __AJMACIAS__ 0xWIN!
+
+#define VERSION "MCabber v0.6.0-dev -- based on http://cabber.sourceforge.net"
+#define EMAIL "Email: bmikael [at] lists [dot] lilotux [dot] net"
+
+#define STR_EMPTY(s) ((s)[0] == '\0')
+
+#define FLAG_BUDDY_DISCONNECTED         0x00
+#define FLAG_BUDDY_CONNECTED            0x01
+#define FLAG_BUDDY_AWAY                 0x02
+#define FLAG_BUDDY_XAWAY                0x04
+#define FLAG_BUDDY_HASMESSAGE           0x08
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/lang.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+
+
+#include "utils.h"
+
+char Lang[100];
+
+void lng_InitLanguage(void)
+{
+  FILE *fp;
+  memset(Lang, 0, 100);
+  sprintf(Lang, "./lang/%s.txt", getenv("LANG"));
+/*    strcpy(Lang, "./lang/");
+    strcat(Lang, getenv("LANG"));
+    strcat(Lang, ".txt");
+*/
+  if ((fp = fopen(Lang, "r")) == NULL) {
+    /* reverting to default */
+    ut_WriteLog("Reverting language to default: POSIX\n");
+    strcpy(Lang, "./lang/POSIX.txt");
+  } else {
+    fclose(fp);
+    ut_WriteLog("Setting language to %s\n", getenv("LANG"));
+  }
+}
+
+char *i18n(char *text)
+{
+  /* hack */
+  char *buf = (char *) malloc(1024);
+  static char result[1024];
+  FILE *fp;
+  char *line;
+  char *value;
+  int found = 0;
+
+  memset(result, 0, 1024);
+
+  if ((fp = fopen(Lang, "r")) != NULL) {
+    while ((fgets(buf, 1024, fp) != NULL) && (!found)) {
+      line = buf;
+
+      while (isspace((int) *line))
+	line++;
+
+      while ((strlen(line) > 0)
+	     && isspace((int) line[strlen(line) - 1]))
+	line[strlen(line) - 1] = '\0';
+
+      if ((*line == '\n') || (*line == '\0') || (*line == '#'))
+	continue;
+
+      if ((strchr(line, '=') != NULL)) {
+	value = strchr(line, '=');
+	*value = '\0';
+	value++;
+
+	while (isspace((int) *value))
+	  value++;
+
+	while ((strlen(line) > 0)
+	       && isspace((int) line[strlen(line) - 1]))
+	  line[strlen(line) - 1] = '\0';
+
+	if (!strcasecmp(line, text)) {
+	  strcpy(result, value);
+	  found = 1;
+	}
+	continue;
+      }
+      /* fprintf(stderr, "CFG: orphaned line \"%s\"\n", line); */
+    }
+    fclose(fp);
+  }
+
+  if (!found) {
+    strcpy(result, text);
+  }
+
+  free(buf);
+  return result;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/lang.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,7 @@
+#ifndef __LANG_H__
+#define __LANG_H__ 1
+
+void lng_InitLanguage(void);
+char *i18n(char *text);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/lang/POSIX.txt	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,21 @@
+#########################
+# text for help message #
+#########################
+#note the same lenght of lines, sorry!
+
+add contact		= Add contact............
+delete contact		= Delete contact.........
+view buddy window	= Show buddy Window......
+send message		= Send Message...........
+#########################
+
+exit			= Exit
+help 			= Help
+Press any key 		= Press any key...
+roster 			= Contacts
+status window 		= Status Window
+write your message here = Write your message here
+write jid here		= Write jid here
+
+conected		= connected
+disconnected		= disconnected
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/lang/es_ES.txt	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,21 @@
+#########################
+# text for help message #
+#########################
+#note the same lenght of lines, sorry!
+
+add contact		= Añadir contacto........
+delete contact		= Borrar contacto........
+view buddy window	= Ver ventana contacto...
+send message		= Enviar mensaje.........
+#########################
+
+exit			= Salir
+help 			= Ayuda
+Press any key 		= Pulsa una tecla
+roster 			= Contactos
+status window 		= Ventana de estado
+write your message here = Escriba aquí su mensaje!
+write jid here		= Escriba aquí el jid que desea añadir?
+
+connected		= conectado
+disconnected		= desconectado
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/list.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,213 @@
+#ifndef _LINUX_LIST_H
+#define _LINUX_LIST_H
+
+/*
+ * Simple doubly linked list implementation.
+ *
+ * Some of the internal functions ("__xxx") are useful when
+ * manipulating whole lists rather than single entries, as
+ * sometimes we already know the next/prev entries and we can
+ * generate better code by using them directly rather than
+ * using the generic single-entry routines.
+ */
+
+struct list_head {
+  struct list_head *next, *prev;
+};
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+	struct list_head name = LIST_HEAD_INIT(name)
+
+#define INIT_LIST_HEAD(ptr) do { \
+	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
+} while (0)
+
+/*
+ * Insert a new entry between two known consecutive entries. 
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void
+__list_add(struct list_head *new,
+	   struct list_head *prev, struct list_head *next)
+{
+  next->prev = new;
+  new->next = next;
+  new->prev = prev;
+  prev->next = new;
+}
+
+/**
+ * list_add - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it after
+ *
+ * Insert a new entry after the specified head.
+ * This is good for implementing stacks.
+ */
+static inline void list_add(struct list_head *new, struct list_head *head)
+{
+  __list_add(new, head, head->next);
+}
+
+/**
+ * list_add_tail - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it before
+ *
+ * Insert a new entry before the specified head.
+ * This is useful for implementing queues.
+ */
+static inline void
+list_add_tail(struct list_head *new, struct list_head *head)
+{
+  __list_add(new, head->prev, head);
+}
+
+/*
+ * Delete a list entry by making the prev/next entries
+ * point to each other.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void
+__list_del(struct list_head *prev, struct list_head *next)
+{
+  next->prev = prev;
+  prev->next = next;
+}
+
+/**
+ * list_del - deletes entry from list.
+ * @entry: the element to delete from the list.
+ * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
+ */
+static inline void list_del(struct list_head *entry)
+{
+  __list_del(entry->prev, entry->next);
+  entry->next = (void *) 0;
+  entry->prev = (void *) 0;
+}
+
+/**
+ * list_del_init - deletes entry from list and reinitialize it.
+ * @entry: the element to delete from the list.
+ */
+static inline void list_del_init(struct list_head *entry)
+{
+  __list_del(entry->prev, entry->next);
+  INIT_LIST_HEAD(entry);
+}
+
+/**
+ * list_move - delete from one list and add as another's head
+ * @list: the entry to move
+ * @head: the head that will precede our entry
+ */
+static inline void
+list_move(struct list_head *list, struct list_head *head)
+{
+  __list_del(list->prev, list->next);
+  list_add(list, head);
+}
+
+/**
+ * list_move_tail - delete from one list and add as another's tail
+ * @list: the entry to move
+ * @head: the head that will follow our entry
+ */
+static inline void
+list_move_tail(struct list_head *list, struct list_head *head)
+{
+  __list_del(list->prev, list->next);
+  list_add_tail(list, head);
+}
+
+/**
+ * list_empty - tests whether a list is empty
+ * @head: the list to test.
+ */
+static inline int list_empty(struct list_head *head)
+{
+  return head->next == head;
+}
+
+static inline void
+__list_splice(struct list_head *list, struct list_head *head)
+{
+  struct list_head *first = list->next;
+  struct list_head *last = list->prev;
+  struct list_head *at = head->next;
+
+  first->prev = head;
+  head->next = first;
+
+  last->next = at;
+  at->prev = last;
+}
+
+/**
+ * list_splice - join two lists
+ * @list: the new list to add.
+ * @head: the place to add it in the first list.
+ */
+static inline void
+list_splice(struct list_head *list, struct list_head *head)
+{
+  if (!list_empty(list))
+    __list_splice(list, head);
+}
+
+/**
+ * list_splice_init - join two lists and reinitialise the emptied list.
+ * @list: the new list to add.
+ * @head: the place to add it in the first list.
+ *
+ * The list at @list is reinitialised
+ */
+static inline void
+list_splice_init(struct list_head *list, struct list_head *head)
+{
+  if (!list_empty(list)) {
+    __list_splice(list, head);
+    INIT_LIST_HEAD(list);
+  }
+}
+
+/**
+ * list_entry - get the struct for this entry
+ * @ptr:	the &struct list_head pointer.
+ * @type:	the type of the struct this is embedded in.
+ * @member:	the name of the list_struct within the struct.
+ */
+#define list_entry(ptr, type, member) \
+	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
+
+/**
+ * list_for_each_safe	-	iterate over a list safe against removal of list entry
+ * @pos:	the &struct list_head to use as a loop counter.
+ * @n:		another &struct list_head to use as temporary storage
+ * @head:	the head for your list.
+ */
+#define list_for_each_safe(pos, n, head) \
+	for (pos = (head)->next, n = pos->next; pos != (head); \
+		pos = n, n = pos->next)
+
+/**
+ * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
+ * @pos:	the type * to use as a loop counter.
+ * @n:		another type * to use as temporary storage
+ * @head:	the head for your list.
+ * @member:	the name of the list_struct within the struct.
+ */
+#define list_for_each_entry_safe(pos, n, head, member)			\
+	for (pos = list_entry((head)->next, typeof(*pos), member),	\
+		n = list_entry(pos->member.next, typeof(*pos), member);	\
+	     &pos->member != (head); 					\
+	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/main.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,250 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <termios.h>
+
+#include "utils.h"
+#include "screen.h"
+#include "buddies.h"
+#include "parsecfg.h"
+#include "lang.h"
+#include "server.h"
+#include "harddefines.h"
+#include "socket.h"
+
+int sock;
+
+void sig_handler(int signum)
+{
+  switch (signum) {
+  case SIGALRM:
+    sk_send(sock, " ");
+    break;
+
+  case SIGTERM:
+    bud_TerminateBuddies();
+    scr_TerminateCurses();
+    srv_setpresence(sock, "unavailable");
+    close(sock);
+    printf("Killed by SIGTERM\nBye!\n");
+    exit(EXIT_SUCCESS);
+    break;
+
+  }
+  signal(SIGALRM, sig_handler);
+}
+
+ssize_t my_getpass (char **passstr, size_t *n)
+{
+  struct termios orig, new;
+  int nread;
+
+  /* Turn echoing off and fail if we can't. */
+  if (tcgetattr(fileno (stdin), &orig) != 0)
+      return -1;
+  new = orig;
+  new.c_lflag &= ~ECHO;
+  if (tcsetattr(fileno (stdin), TCSAFLUSH, &new) != 0)
+      return -1;
+
+  /* Read the password. */
+  nread = getline(passstr, n, stdin);
+
+  /* Restore terminal. */
+  (void) tcsetattr(fileno (stdin), TCSAFLUSH, &orig);
+
+  return nread;
+}
+
+void credits(void)
+{
+  printf(VERSION "\n");
+  printf(EMAIL "\n");
+}
+
+int main(int argc, char **argv)
+{
+  char configFile[4096];
+  char *username, *password, *resource;
+  char *servername;
+  char *idsession;
+  char *portstring;
+  int key;
+  unsigned int port;
+  unsigned int ping;
+  int ret = 0;
+
+
+  credits();
+
+  /* SET THIS >0 TO ENABLE LOG */
+  ut_InitDebug(1);
+
+  lng_InitLanguage();
+
+  ut_WriteLog("Setting signals handlers...\n");
+  signal(SIGTERM, sig_handler);
+  signal(SIGALRM, sig_handler);
+
+
+  sprintf(configFile, "%s/.mcabberrc", getenv("HOME"));
+
+  /* Proceso opciones de usuario */
+  while (1) {
+    int c = getopt(argc, argv, "hf:");
+    if (c == -1) {
+      break;
+    } else
+      switch (c) {
+      case 'h':
+	printf("Usage: %s [-f mcabberrc_file]\n\n", argv[0]);
+        printf("Thanks to AjMacias for cabber!\n\n");
+	return 0;
+      case 'f':
+	strncpy(configFile, optarg, 1024);
+	break;
+      }
+  }
+
+  ut_WriteLog("Setting config file: %s\n", configFile);
+
+
+  /* Parsing config file... */
+  ut_WriteLog("Parsing config file...\n");
+  cfg_file(configFile);
+
+  servername = cfg_read("server");
+  username = cfg_read("username");
+  password = cfg_read("password");
+  resource = cfg_read("resource");
+
+  if (!servername) {
+      printf("Server name has not been specified in the config file!\n");
+      return -1;
+  }
+  if (!username) {
+      printf("User name has not been specified in the config file!\n");
+      return -1;
+  }
+  if (!password) {
+      char *p;
+      size_t passsize = 64;
+      printf("Please enter password: ");
+      my_getpass(&password, &passsize);
+      printf("\n");
+      for (p = password; *p; p++);
+      for ( ; p > password ; p--)
+          if (*p == '\n' || *p == '\r') *p = 0;
+  }
+
+  /* Initialize N-Curses */
+  ut_WriteLog("Initializing N-Curses...\n");
+  scr_InitCurses();
+
+  /* Connect to server */
+  portstring = cfg_read("port");
+  port = (portstring != NULL) ? atoi(portstring) : -1;
+
+  ut_WriteLog("Connecting to server: %s:%d\n", servername, port);
+  if ((sock = srv_connect(servername, port)) < 0) {
+    ut_WriteLog("\terror!!!\n");
+    fprintf(stderr, "Error connecting to (%s)\n", servername);
+    scr_TerminateCurses();
+    return -2;
+  }
+
+  ut_WriteLog("Sending login string...\n");
+  if ((idsession = srv_login(sock, servername, username, password, 
+                             resource)) == NULL) {
+
+    ut_WriteLog("\terror!!!\n");
+    fprintf(stderr, "Error sending login string...\n");
+    scr_TerminateCurses();
+    return -3;
+  }
+  ut_WriteLog("Connected to %s: %s\n", servername, idsession);
+  free(idsession);
+
+  ut_WriteLog("Requesting roster...\n");
+  bud_InitBuddies(sock);
+
+  ut_WriteLog("Sending presence...\n");
+  srv_setpresence(sock, "Online!");
+
+
+  ut_WriteLog("Drawing main window...\n");
+  scr_DrawMainWindow();
+
+  ping = 15;
+  if (cfg_read("pinginterval"))
+    ping = atoi(cfg_read("pinginterval"));
+
+  ut_WriteLog("Ping interval stablished: %d secs\n", ping);
+
+  ut_WriteLog("Entering into main loop...\n\n");
+  ut_WriteLog("Ready to send/receive messages...\n");
+
+  while (ret != 255) {
+    int x;
+    alarm(ping);
+    x = check_io(sock, 0);
+    if ((x & 1) == 1) {
+      srv_msg *incoming = readserver(sock);
+
+      switch (incoming->m) {
+      case SM_PRESENCE:
+	bud_SetBuddyStatus(incoming->from, incoming->connected);
+	break;
+
+      case SM_MESSAGE:
+	scr_WriteIncomingMessage(incoming->from, incoming->body);
+	free(incoming->body);
+	free(incoming->from);
+	break;
+
+      case SM_UNHANDLED:
+	break;
+      }
+      free(incoming);
+    }
+    if ((x & 2) == 2) {
+      keypad(scr_GetInputWindow(), TRUE);
+      key = scr_Getch();
+      ret = process_key(key, sock);
+      /*
+      switch (key) {
+      case KEY_IC:
+	bud_AddBuddy(sock);
+	break;
+      case KEY_DC:
+	bud_DeleteBuddy(sock);
+	break;
+
+      case KEY_RESIZE:
+	endwin();
+	printf("\nRedimensionado no implementado\n");
+	printf("Reinicie Cabber.\n\n\n");
+	exit(EXIT_FAILURE);
+	break;
+      }
+      */
+    }
+    if (update_roaster) {
+      // scr_LogPrint("Update roaster");
+      bud_DrawRoster(scr_GetRosterWindow());
+    }
+  }
+
+  bud_TerminateBuddies();
+  scr_TerminateCurses();
+
+  srv_setpresence(sock, "unavailable");
+
+  close(sock);
+
+  printf("\n\nHave a nice day!\nBye!\n");
+
+  return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/parsecfg.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,97 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+
+
+#include "list.h"
+
+/* Definicion de tipos */
+#define MAX_LENGHT_INPUT 1024
+#define cfg_entry(n) list_entry(n, cfg_entry_t, list)
+
+typedef struct _cfg_entry_t {
+  char *key;
+  char *value;
+  struct list_head list;
+} cfg_entry_t;
+
+static LIST_HEAD(cfg_list);
+
+
+void push_in_list(char *key, char *value)
+{
+  cfg_entry_t *new_entry = calloc(1, sizeof(cfg_entry_t));
+
+  new_entry->key = (char *) calloc(1, strlen(key) + 1);
+  new_entry->value = (char *) calloc(1, strlen(value) + 1);
+
+  strcpy(new_entry->key, key);
+  strcpy(new_entry->value, value);
+
+  list_add(&new_entry->list, &cfg_list);
+}
+
+int cfg_file(char *filename)
+{
+  FILE *fp;
+  char *buf;
+  char *line;
+  char *value;
+
+  buf = malloc(255);
+
+  if ((fp = fopen(filename, "r")) == NULL) {
+    perror("fopen (parsecfg.c:46)");
+    exit(EXIT_FAILURE);
+  }
+
+  while (fgets(buf, 255, fp) != NULL) {
+    line = buf;
+
+    while (isspace((int) *line))
+      line++;
+
+    while ((strlen(line) > 0)
+	   && isspace((int) line[strlen(line) - 1]))
+      line[strlen(line) - 1] = '\0';
+
+    if ((*line == '\n') || (*line == '\0') || (*line == '#'))
+      continue;
+
+    if ((strchr(line, '=') != NULL)) {
+      value = strchr(line, '=');
+      *value = '\0';
+      value++;
+
+      while (isspace((int) *value))
+	value++;
+
+      while ((strlen(line) > 0)
+	     && isspace((int) line[strlen(line) - 1]))
+	line[strlen(line) - 1] = '\0';
+
+      push_in_list(line, value);
+      continue;
+    }
+    fprintf(stderr, "CFG: orphaned line \"%s\"\n", line);
+  }
+  return 1;
+}
+
+char *cfg_read(char *key)
+{
+  struct list_head *n, *pos;
+  cfg_entry_t *search_entry = NULL;
+
+  list_for_each_safe(pos, n, &cfg_list) {
+    search_entry = cfg_entry(pos);
+    if (search_entry->key) {
+      if (!strcasecmp(search_entry->key, key)) {
+	return search_entry->value;
+      }
+    }
+  }
+  return NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/parsecfg.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,7 @@
+#ifndef __PARSECFG_H__
+#define __PARSECFG_H__ 1
+
+int cfg_file(char *filename);
+char *cfg_read(char *key);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/screen.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,805 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ncurses.h>
+#include <panel.h>
+#include <time.h>
+#include <ctype.h>
+#include <locale.h>
+
+#include "screen.h"
+#include "utils.h"
+#include "buddies.h"
+#include "parsecfg.h"
+#include "lang.h"
+#include "server.h"
+#include "list.h"
+
+/* Definicion de tipos */
+#define window_entry(n) list_entry(n, window_entry_t, list)
+
+LIST_HEAD(window_list);
+
+typedef struct _window_entry_t {
+  WINDOW *win;
+  PANEL *panel;
+  char *name;
+  int nlines;
+  char **texto;
+  int hidden_msg;
+  struct list_head list;
+} window_entry_t;
+
+
+/* Variables globales a SCREEN.C */
+static WINDOW *rosterWnd, *chatWnd, *inputWnd;
+static WINDOW *logWnd, *logWnd_border;
+static PANEL *rosterPanel, *chatPanel, *inputPanel;
+static PANEL *logPanel, *logPanel_border;
+static int maxY, maxX;
+static window_entry_t *currentWindow;
+
+static int chatmode;
+int update_roaster;
+
+static char inputLine[INPUTLINE_LENGTH+1];
+static char *ptr_inputline;
+static short int inputline_offset;
+
+
+/* Funciones */
+
+int scr_WindowHeight(WINDOW * win)
+{
+  int x, y;
+  getmaxyx(win, y, x);
+  return x;
+}
+
+void scr_draw_box(WINDOW * win, int y, int x, int height, int width,
+                  int Color, chtype box, chtype border)
+{
+  int i, j;
+
+  wattrset(win, COLOR_PAIR(Color));
+  for (i = 0; i < height; i++) {
+    wmove(win, y + i, x);
+    for (j = 0; j < width; j++)
+      if (!i && !j)
+	waddch(win, border | ACS_ULCORNER);
+      else if (i == height - 1 && !j)
+	waddch(win, border | ACS_LLCORNER);
+      else if (!i && j == width - 1)
+	waddch(win, box | ACS_URCORNER);
+      else if (i == height - 1 && j == width - 1)
+	waddch(win, box | ACS_LRCORNER);
+      else if (!i)
+	waddch(win, border | ACS_HLINE);
+      else if (i == height - 1)
+	waddch(win, box | ACS_HLINE);
+      else if (!j)
+	waddch(win, border | ACS_VLINE);
+      else if (j == width - 1)
+	waddch(win, box | ACS_VLINE);
+      else
+	waddch(win, box | ' ');
+  }
+}
+
+int FindColor(char *name)
+{
+  if (!strcmp(name, "default"))
+    return -1;
+  if (!strcmp(name, "black"))
+    return COLOR_BLACK;
+  if (!strcmp(name, "red"))
+    return COLOR_RED;
+  if (!strcmp(name, "green"))
+    return COLOR_GREEN;
+  if (!strcmp(name, "yellow"))
+    return COLOR_YELLOW;
+  if (!strcmp(name, "blue"))
+    return COLOR_BLUE;
+  if (!strcmp(name, "magenta"))
+    return COLOR_MAGENTA;
+  if (!strcmp(name, "cyan"))
+    return COLOR_CYAN;
+  if (!strcmp(name, "white"))
+    return COLOR_WHITE;
+
+  return -1;
+}
+
+void ParseColors(void)
+{
+  char *colors[11] = {
+    "", "",
+    "borderlines",
+    "jidonlineselected",
+    "jidonline",
+    "jidofflineselected",
+    "jidoffline",
+    "text",
+    NULL
+  };
+
+  char *tmp = malloc(1024);
+  char *color1;
+  char *background = cfg_read("color_background");
+  char *backselected = cfg_read("color_backselected");
+  int i = 0;
+
+  while (colors[i]) {
+    sprintf(tmp, "color_%s", colors[i]);
+    color1 = cfg_read(tmp);
+
+    switch (i + 1) {
+    case 1:
+      init_pair(1, COLOR_BLACK, COLOR_WHITE);
+      break;
+    case 2:
+      init_pair(2, COLOR_WHITE, COLOR_BLACK);
+      break;
+    case 3:
+      init_pair(3, FindColor(color1), FindColor(background));
+      break;
+    case 4:
+      init_pair(4, FindColor(color1), FindColor(backselected));
+      break;
+    case 5:
+      init_pair(5, FindColor(color1), FindColor(background));
+      break;
+    case 6:
+      init_pair(6, FindColor(color1), FindColor(backselected));
+      break;
+    case 7:
+      init_pair(7, FindColor(color1), FindColor(background));
+      break;
+    case 8:
+      init_pair(8, FindColor(color1), FindColor(background));
+      break;
+    }
+    i++;
+  }
+}
+
+
+window_entry_t *scr_CreatePanel(char *title, int x, int y, int lines,
+				int cols, int dont_show)
+{
+  window_entry_t *tmp = calloc(1, sizeof(window_entry_t));
+
+  tmp->win = newwin(lines, cols, y, x);
+  tmp->panel = new_panel(tmp->win);
+  tmp->name = (char *) calloc(1, 1024);
+  strncpy(tmp->name, title, 1024);
+
+  scr_draw_box(tmp->win, 0, 0, lines, cols, COLOR_GENERAL, 0, 0);
+  //mvwprintw(tmp->win, 0, (cols - (2 + strlen(title))) / 2, " %s ", title);
+  if ((!dont_show)) {
+    currentWindow = tmp;
+  } else {
+    if (currentWindow)
+      top_panel(currentWindow->panel);
+    else
+      top_panel(chatPanel);
+  }
+
+  list_add_tail(&tmp->list, &window_list);
+  update_panels();
+
+  return tmp;
+}
+
+
+void scr_CreatePopup(char *title, char *texto, int corte, int type,
+                     char *returnstring)
+{
+  WINDOW *popupWin;
+  PANEL *popupPanel;
+
+  int lineas = 0;
+  int cols = 0;
+
+  char **submsgs;
+  int n = 0;
+  int i;
+
+  char *instr = (char *) calloc(1, 1024);
+
+  /* fprintf(stderr, "\r\n%d", lineas); */
+
+  submsgs = ut_SplitMessage(texto, &n, corte);
+
+  switch (type) {
+  case 1:
+  case 0:
+    lineas = n + 4;
+    break;
+  }
+
+  cols = corte + 3;
+  popupWin = newwin(lineas, cols, (maxY - lineas) / 2, (maxX - cols) / 2);
+  popupPanel = new_panel(popupWin);
+
+  /*ATENCION!!! Colorear el popup ??
+     / box (popupWin, 0, 0); */
+  scr_draw_box(popupWin, 0, 0, lineas, cols, COLOR_POPUP, 0, 0);
+  mvwprintw(popupWin, 0, (cols - (2 + strlen(title))) / 2, " %s ", title);
+
+  for (i = 0; i < n; i++)
+    mvwprintw(popupWin, i + 1, 2, "%s", submsgs[i]);
+
+
+  for (i = 0; i < n; i++)
+    free(submsgs[i]);
+  free(submsgs);
+
+  switch (type) {
+  case 0:
+    mvwprintw(popupWin, n + 2,
+	      (cols - (2 + strlen(i18n("Press any key")))) / 2,
+	      i18n("Press any key"));
+    update_panels();
+    doupdate();
+    getch();
+    break;
+  case 1:
+    {
+      char ch;
+      int scroll = 0;
+      int input_x = 0;
+
+      wmove(popupWin, 3, 1);
+      wrefresh(popupWin);
+      keypad(popupWin, TRUE);
+      while ((ch = getch()) != '\n') {
+	switch (ch) {
+	case 0x09:
+	case KEY_UP:
+	case KEY_DOWN:
+	  break;
+	case KEY_RIGHT:
+	case KEY_LEFT:
+	  break;
+	case KEY_BACKSPACE:
+	case 127:
+	  if (input_x || scroll) {
+	    /* wattrset (popupWin, 0); */
+	    if (!input_x) {
+	      scroll = scroll < cols - 3 ? 0 : scroll - (cols - 3);
+	      wmove(popupWin, 3, 1);
+	      for (i = 0; i < cols; i++)
+		waddch
+		    (popupWin,
+		     instr
+		     [scroll
+		      + input_x + i] ? instr[scroll + input_x + i] : ' ');
+	      input_x = strlen(instr) - scroll;
+	    } else
+	      input_x--;
+	    instr[scroll + input_x] = '\0';
+	    mvwaddch(popupWin, 3, input_x + 1, ' ');
+	    wmove(popupWin, 3, input_x + 1);
+	    wrefresh(popupWin);
+	  }
+	default:
+	  if ( /*ch<0x100 && */ isprint(ch) || ch == 'ñ'
+	      || ch == 'Ñ') {
+	    if (scroll + input_x < 1024) {
+	      instr[scroll + input_x] = ch;
+	      instr[scroll + input_x + 1] = '\0';
+	      if (input_x == cols - 3) {
+		scroll++;
+		wmove(popupWin, 3, 1);
+		for (i = 0; i < cols - 3; i++)
+		  waddch(popupWin, instr[scroll + i]);
+	      } else {
+		wmove(popupWin, 3, 1 + input_x++);
+		waddch(popupWin, ch);
+	      }
+	      wrefresh(popupWin);
+	    } else {
+	      flash();
+	    }
+	  }
+	}
+      }
+    }
+    if (returnstring != NULL)
+      strcpy(returnstring, instr);
+    break;
+  }
+
+  del_panel(popupPanel);
+  delwin(popupWin);
+  update_panels();
+  doupdate();
+  free(instr);
+  keypad(inputWnd, TRUE);
+}
+
+void scr_RoolWindow(void)
+{
+}
+
+window_entry_t *scr_SearchWindow(char *winId)
+{
+  struct list_head *pos, *n;
+  window_entry_t *search_entry = NULL;
+
+  list_for_each_safe(pos, n, &window_list) {
+    search_entry = window_entry(pos);
+    if (search_entry->name) {
+      if (!strcasecmp(search_entry->name, winId)) {
+	return search_entry;
+      }
+    }
+  }
+  return NULL;
+}
+
+void scr_ShowWindow(char *winId)
+{
+  int n, width, i;
+  window_entry_t *tmp = scr_SearchWindow(winId);
+  if (tmp != NULL) {
+    top_panel(tmp->panel);
+    currentWindow = tmp;
+    chatmode = TRUE;
+    tmp->hidden_msg = FALSE;
+    update_roaster = TRUE;
+    width = scr_WindowHeight(tmp->win);
+    for (n = 0; n < tmp->nlines; n++) {
+      mvwprintw(tmp->win, n + 1, 1, "");
+      for (i = 0; i < width - 2; i++)
+	waddch(tmp->win, ' ');
+      mvwprintw(tmp->win, n + 1, 1, "%s", tmp->texto[n]);
+    }
+    //move(CHAT_WIN_HEIGHT - 1, maxX - 1);
+    update_panels();
+    doupdate();
+  } else {
+    top_panel(chatPanel);
+    currentWindow = tmp;
+  }
+}
+
+void scr_ShowBuddyWindow(void)
+{
+  buddy_entry_t *tmp = bud_SelectedInfo();
+  if (tmp->jid != NULL)
+    scr_ShowWindow(tmp->jid);
+  top_panel(inputPanel);
+}
+
+
+void scr_WriteInWindow(char *winId, char *texto, int TimeStamp, int force_show)
+{
+  time_t ahora;
+  int n;
+  int i;
+  int width;
+  window_entry_t *tmp;
+  int dont_show = FALSE;
+
+
+  tmp = scr_SearchWindow(winId);
+
+  if (!chatmode)
+    dont_show = TRUE;
+  else if ((!force_show) && ((!currentWindow || (currentWindow != tmp))))
+    dont_show = TRUE;
+  // scr_LogPrint("dont_show=%d", dont_show);
+
+  if (tmp == NULL) {
+    tmp = scr_CreatePanel(winId, 20, 0, CHAT_WIN_HEIGHT, maxX - 20, dont_show);
+    tmp->texto = (char **) calloc((CHAT_WIN_HEIGHT+1) * 3, sizeof(char *));
+    for (n = 0; n < CHAT_WIN_HEIGHT * 3; n++)
+      tmp->texto[n] = (char *) calloc(1, 1024);
+
+    if (TimeStamp) {
+      ahora = time(NULL);
+      strftime(tmp->texto[tmp->nlines], 1024, "[%H:%M] ",
+	       localtime(&ahora));
+      strcat(tmp->texto[tmp->nlines], texto);
+    } else {
+      sprintf(tmp->texto[tmp->nlines], "            %s", texto);
+    }
+    tmp->nlines++;
+  } else {
+    if (tmp->nlines < CHAT_WIN_HEIGHT - 2) {
+      if (TimeStamp) {
+	ahora = time(NULL);
+	strftime(tmp->texto[tmp->nlines], 1024,
+		 "[%H:%M] ", localtime(&ahora));
+	strcat(tmp->texto[tmp->nlines], texto);
+      } else {
+	sprintf(tmp->texto[tmp->nlines], "            %s", texto);
+      }
+      tmp->nlines++;
+    } else {
+      for (n = 0; n < tmp->nlines; n++) {
+	memset(tmp->texto[n], 0, 1024);
+	strncpy(tmp->texto[n], tmp->texto[n + 1], 1024);
+      }
+      if (TimeStamp) {
+	ahora = time(NULL);
+	strftime(tmp->texto[tmp->nlines - 1], 1024,
+		 "[%H:%M] ", localtime(&ahora));
+	strcat(tmp->texto[tmp->nlines - 1], texto);
+      } else {
+	sprintf(tmp->texto[tmp->nlines - 1], "            %s", texto);
+      }
+    }
+  }
+
+  if (!dont_show) {
+    top_panel(tmp->panel);
+    width = scr_WindowHeight(tmp->win);
+    for (n = 0; n < tmp->nlines; n++) {
+      mvwprintw(tmp->win, n + 1, 1, "");
+      for (i = 0; i < width - 2; i++)
+        waddch(tmp->win, ' ');
+      mvwprintw(tmp->win, n + 1, 1, "%s", tmp->texto[n]);
+    }
+
+    update_panels();
+    doupdate();
+  } else {
+    tmp->hidden_msg = TRUE;
+    update_roaster = TRUE;
+  }
+}
+
+void scr_InitCurses(void)
+{
+  initscr();
+  noecho();
+  raw();
+  //cbreak();
+  start_color();
+  use_default_colors();
+
+  ParseColors();
+
+  getmaxyx(stdscr, maxY, maxX);
+  inputLine[0] = 0;
+  ptr_inputline = inputLine;
+
+  //setlocale(LC_CTYPE, "");
+
+  return;
+}
+
+void scr_DrawMainWindow(void)
+{
+  /* Draw main panels */
+  rosterWnd = newwin(CHAT_WIN_HEIGHT, 20, 0, 0);
+  rosterPanel = new_panel(rosterWnd);
+  scr_draw_box(rosterWnd, 0, 0, CHAT_WIN_HEIGHT, 20, COLOR_GENERAL, 0, 0);
+  mvwprintw(rosterWnd, 0, (20 - strlen(i18n("Roster"))) / 2,
+	    i18n("Roster"));
+
+  chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - 20, 0, 20);
+  chatPanel = new_panel(chatWnd);
+  scr_draw_box(chatWnd, 0, 0, CHAT_WIN_HEIGHT, maxX - 20, COLOR_GENERAL, 0, 0);
+  //mvwprintw(chatWnd, 0,
+	//    ((maxX - 20) - strlen(i18n("Status Window"))) / 2,
+	//    i18n("Status Window"));
+  //wbkgd(chatWnd, COLOR_PAIR(COLOR_GENERAL));
+  mvwprintw(chatWnd, 1, 1, "This is the status window");
+
+  logWnd_border = newwin(LOG_WIN_HEIGHT, maxX, CHAT_WIN_HEIGHT, 0);
+  logPanel_border = new_panel(logWnd_border);
+  scr_draw_box(logWnd_border, 0, 0, LOG_WIN_HEIGHT, maxX, COLOR_GENERAL, 0, 0);
+//  mvwprintw(logWnd_border, 0,
+//	    ((maxX - 20) - strlen(i18n("Log Window"))) / 2,
+//	    i18n("Log Window"));
+  //logWnd = newwin(LOG_WIN_HEIGHT - 2, maxX-20 - 2, CHAT_WIN_HEIGHT+1, 20+1);
+  logWnd = derwin(logWnd_border, LOG_WIN_HEIGHT-2, maxX-2, 1, 1);
+  logPanel = new_panel(logWnd);
+  wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL));
+  //wattrset(logWnd, COLOR_PAIR(COLOR_GENERAL));
+  scr_LogPrint("Start up.");
+
+  scrollok(logWnd,TRUE);
+  //idlok(logWnd,TRUE);  // XXX Necessary?
+
+  inputWnd = newwin(1, maxX, maxY-1, 0);
+  inputPanel = new_panel(inputWnd);
+  //wbkgd(inputWnd, COLOR_PAIR(COLOR_GENERAL));
+
+  bud_DrawRoster(rosterWnd);
+  update_panels();
+  doupdate();
+  return;
+}
+
+void scr_TerminateCurses(void)
+{
+  clear();
+  refresh();
+  endwin();
+  return;
+}
+
+void scr_WriteIncomingMessage(char *jidfrom, char *text)
+{
+  char **submsgs;
+  int n, i;
+  char *buffer = (char *) malloc(5 + strlen(text));
+
+  sprintf(buffer, "<== %s", text);
+
+  submsgs =
+      ut_SplitMessage(buffer, &n, maxX - scr_WindowHeight(rosterWnd) - 20);
+
+  for (i = 0; i < n; i++) {
+    if (i == 0)
+      scr_WriteInWindow(jidfrom, submsgs[i], TRUE, FALSE);
+    else
+      scr_WriteInWindow(jidfrom, submsgs[i], FALSE, FALSE);
+  }
+
+  for (i = 0; i < n; i++)
+    free(submsgs[i]);
+
+  free(submsgs);
+  free(buffer);
+
+  top_panel(inputPanel);
+  //wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine);
+  update_panels();
+  doupdate();
+}
+
+int scr_Getch(void)
+{
+  int ch;
+  // keypad(inputWnd, TRUE);
+  ch = wgetch(inputWnd);
+  return ch;
+}
+
+WINDOW *scr_GetRosterWindow(void)
+{
+  return rosterWnd;
+}
+
+WINDOW *scr_GetStatusWindow(void)
+{
+  return chatWnd;
+}
+
+WINDOW *scr_GetInputWindow(void)
+{
+  return inputWnd;
+}
+
+void scr_LogPrint(const char *fmt, ...)
+{
+  time_t timestamp;
+  char *buffer;
+  va_list ap;
+
+  buffer = (char *) calloc(1, 4096);
+
+  timestamp = time(NULL);
+  strftime(buffer, 64, "[%H:%M:%S] ", localtime(&timestamp));
+  wprintw(logWnd, "\n%s", buffer);
+
+  va_start(ap, fmt);
+  vsnprintf(buffer, 4096, fmt, ap);
+  va_end(ap);
+
+  wprintw(logWnd, "%s", buffer);
+  free(buffer);
+
+  update_panels();
+  doupdate();
+}
+
+//  scr_IsHiddenMessage(jid)
+// Returns TRUE if there is a hidden message in the window
+// for the jid contact.
+int scr_IsHiddenMessage(char *jid) {
+  window_entry_t *wintmp;
+
+  wintmp = scr_SearchWindow(jid);
+  if ((wintmp) && (wintmp->hidden_msg))
+    return TRUE;
+
+  return FALSE;
+}
+
+void send_message(int sock, char *msg)
+{
+  char **submsgs;
+  char *buffer = (char *) calloc(1, 24+strlen(msg));
+  char *buffer2 = (char *) calloc(1, 1024);
+  int n, i;
+  buddy_entry_t *tmp = bud_SelectedInfo();
+
+  scr_ShowWindow(tmp->jid);
+
+  sprintf(buffer, "--> %s", msg);
+
+  submsgs =
+	ut_SplitMessage(buffer, &n,
+			maxX - scr_WindowHeight(rosterWnd) - 20);
+  for (i = 0; i < n; i++) {
+    if (i == 0)
+      scr_WriteInWindow(tmp->jid, submsgs[i], TRUE, TRUE);
+    else
+      scr_WriteInWindow(tmp->jid, submsgs[i], FALSE, TRUE);
+  }
+
+  for (i = 0; i < n; i++)
+    free(submsgs[i]);
+  free(submsgs);
+
+  //move(CHAT_WIN_HEIGHT - 1, maxX - 1);
+  refresh();
+  sprintf(buffer2, "%s@%s/%s", cfg_read("username"),
+          cfg_read("server"), cfg_read("resource"));
+  srv_sendtext(sock, tmp->jid, msg, buffer2);
+  free(buffer);
+  free(buffer2);
+
+  top_panel(inputPanel);
+}
+
+int process_line(char *line, int sock)
+{
+  if (*line != '/') {
+    send_message(sock, line);
+    return 0;
+  }
+  if (!strcasecmp(line, "/quit")) {
+    return 255;
+  }
+  // Commands handling
+  // TODO
+  // say...
+
+  scr_LogPrint("Unrecognised command, sorry.");
+  return 0;
+}
+
+//  check_offset(int direction)
+// Check inputline_offset value, and make sure the cursor is inside the
+// screen.
+inline void check_offset(int direction)
+{
+  // Left side
+  if (inputline_offset && direction <= 0) {
+    while (ptr_inputline <= (char*)&inputLine + inputline_offset) {
+      if (inputline_offset) {
+        inputline_offset -= 5;
+        if (inputline_offset < 0)
+          inputline_offset = 0;
+      }
+    }
+  }
+  // Right side
+  if (direction >= 0) {
+    while (ptr_inputline >= inputline_offset + (char*)&inputLine + maxX)
+      inputline_offset += 5;
+  }
+}
+
+int process_key(int key, int sock)
+{
+  if (isprint(key)) {
+    char tmpLine[INPUTLINE_LENGTH+1];
+
+    // Check the line isn't too long
+    if (strlen(inputLine) >= INPUTLINE_LENGTH)
+      return 0;
+
+    // Insert char
+    strcpy(tmpLine, ptr_inputline);
+    *ptr_inputline++ = key;
+    strcpy(ptr_inputline, tmpLine);
+    check_offset(1);
+  } else {
+    switch(key) {
+      case KEY_BACKSPACE:
+          if (ptr_inputline != (char*)&inputLine) {
+            *--ptr_inputline = 0;
+            check_offset(-1);
+          }
+          break;
+      case KEY_DC:
+          if (*ptr_inputline)
+            strcpy(ptr_inputline, ptr_inputline+1);
+          break;
+      case KEY_LEFT:
+          if (ptr_inputline != (char*)&inputLine) {
+            ptr_inputline--;
+            check_offset(-1);
+          }
+          break;
+      case KEY_RIGHT:
+          if (*ptr_inputline)
+            ptr_inputline++;
+            check_offset(1);
+          break;
+      case 9:     // Tab
+          scr_LogPrint("I'm unable to complete yet");
+          break;
+      case '\n':  // Enter
+          // XXX Test:
+          chatmode = TRUE;
+          if (inputLine[0] == 0) {
+            scr_ShowBuddyWindow();
+            break;
+          }
+          if (process_line(inputLine, sock))
+            return 255;
+          ptr_inputline = inputLine;
+          *ptr_inputline = 0;
+          inputline_offset = 0;
+          break;
+      case KEY_UP:
+          bud_RosterUp();
+          if (chatmode)
+            scr_ShowBuddyWindow();
+          break;
+      case KEY_DOWN:
+          bud_RosterDown();
+          if (chatmode)
+            scr_ShowBuddyWindow();
+          break;
+      case KEY_PPAGE:
+          scr_LogPrint("PageUp??");
+          break;
+      case KEY_NPAGE:
+          scr_LogPrint("PageDown??");
+          break;
+      case KEY_HOME:
+      case 1:
+          ptr_inputline = inputLine;
+          inputline_offset = 0;
+          break;
+      case KEY_END:
+      case 5:
+          for (; *ptr_inputline; ptr_inputline++) ;
+          check_offset(1);
+          break;
+      case 21:  // Ctrl-u
+          strcpy(inputLine, ptr_inputline);
+          ptr_inputline = inputLine;
+          inputline_offset = 0;
+          break;
+      case KEY_EOL:
+      case 11:  // Ctrl-k
+          *ptr_inputline = 0;
+          break;
+      case 16:  // Ctrl-p
+          scr_LogPrint("Ctrl-p not yet implemented");
+          break;
+      case 14:  // Ctrl-n
+          scr_LogPrint("Ctrl-n not yet implemented");
+          break;
+      case 27:  // ESC
+          currentWindow = NULL;
+          chatmode = FALSE;
+          top_panel(chatPanel);
+          top_panel(inputPanel);
+          break;
+      default:
+          scr_LogPrint("Unkown key=%d", key);
+    }
+    //scr_LogPrint("[%02x]", key);
+  }
+  mvwprintw(inputWnd, 0,0, "%s", inputLine + inputline_offset);
+  wclrtoeol(inputWnd);
+  if (*ptr_inputline) {
+    wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine - inputline_offset);
+  }
+  update_panels();
+  doupdate();
+  return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/screen.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,42 @@
+#ifndef __SCREEN_H__
+#define __SCREEN_H__ 1
+
+#include <ncurses.h>
+
+#define COLOR_POPUP     1
+#define COLOR_GENERAL   3
+#define COLOR_BD_CONSEL 4
+#define COLOR_BD_CON    5
+#define COLOR_BD_DESSEL 6
+#define COLOR_BD_DES    7
+
+#define LOG_WIN_HEIGHT  (5+2)
+#define CHAT_WIN_HEIGHT (maxY-1-LOG_WIN_HEIGHT)
+
+#define INPUTLINE_LENGTH  1024
+
+extern int update_roaster;
+
+void scr_InitCurses(void);
+void scr_DrawMainWindow(void);
+void scr_TerminateCurses(void);
+void scr_CreatePopup(char *title, char *texto, int corte, int type,
+		     char *returnstring);
+void scr_WriteInWindow(char *nombreVentana, char *texto, int TimeStamp,
+                       int force_show);
+void scr_WriteIncomingMessage(char *jidfrom, char *text);
+void scr_RoolWindow(void);
+void scr_ShowBuddyWindow(void);
+void scr_LogPrint(const char *fmt, ...);
+
+int scr_IsHiddenMessage(char *jid);
+
+WINDOW *scr_GetRosterWindow(void);
+WINDOW *scr_GetStatusWindow(void);
+WINDOW *scr_GetInputWindow(void);
+
+int scr_Getch(void);
+
+int process_key(int, int sock);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/server.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,460 @@
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/poll.h>
+
+#include "list.h"
+#include "parsecfg.h"
+#include "screen.h"
+#include "socket.h"
+#include "utf8.h"
+#include "server.h"
+#include "harddefines.h"
+#include "utils.h"
+#include "buddies.h"
+
+#define JABBERPORT 5222
+
+
+/* Desc: poll data from server
+ * 
+ * In  : socket
+ * Out : pending buffer (or NULL if no incoming data)
+ *
+ * Note: it is up to the caller to free the returned string
+ */
+char *srv_poll(int sock)
+{
+  struct pollfd sock_p;
+  sock_p.fd = sock;
+  sock_p.events = POLLIN | POLLPRI;
+  sock_p.revents = 0;
+  poll(&sock_p, 1, 0);
+
+  if (sock_p.revents) {
+    return sk_recv(sock);
+  }
+
+  return NULL;
+}
+
+
+/* Desc: resolve host
+ * 
+ * In  : hostname
+ * Out : 32bit address (or 0 if error)
+ *
+ * Note: -
+ */
+static u_long srv_resolve(const char *host)
+{
+  long i;
+  struct hostent *he;
+
+  if ((i = inet_addr(host)) == -1) {
+    if (!(he = gethostbyname(host)))
+      return 0;
+    else
+      return (*(u_long *) he->h_addr);
+  }
+
+  return i;
+}
+
+
+/* Desc: connect to jabber server
+ * 
+ * In  : config
+ * Out : socket (or -1 on error)
+ *
+ * Note: if port is -1, the default Jabber port will be used
+ */
+int srv_connect(const char *server, unsigned int port)
+{
+  struct sockaddr_in name;
+  int sock;
+
+  if (server == NULL) {
+    fprintf(stderr, "You must supply a server name\n\r");
+    return -1;
+  }
+
+  if (port == -1U) {
+    port = JABBERPORT;
+  }
+
+  name.sin_family = AF_INET;
+  name.sin_port = htons(port);
+
+  if (!(name.sin_addr.s_addr = srv_resolve(server))) {
+    fprintf(stderr, "Cant resolve \"%s\"\n", server);
+    return -1;
+  }
+
+  if ((sock = sk_conn((struct sockaddr *) &name)) < 0) {
+    fprintf(stderr, "Can't connect to \"%s:%u\"\n", server, port);
+    return -1;
+  }
+
+  return sock;
+}
+
+
+/* Desc: login into jabber server
+ * 
+ * In  : socket, servername, user, password, resource
+ * Out : idsession
+ *
+ * Note: it is up to the caller to free the returned string
+ */
+char *srv_login(int sock, const char *server, const char *user,
+		const char *pass, const char *resource)
+{
+  char *stringtosend = malloc(2048);
+  char *response, *aux;
+  char *idsession = malloc(128);
+  int pos = 0;
+
+  memset(stringtosend, 0, 2048);
+  strcpy(stringtosend, "<?xml version='1.0' encoding='UTF-8' ?>");
+  strcat(stringtosend, "<stream:stream to='");
+  strcat(stringtosend, server);
+  strcat(stringtosend, "' xmlns='jabber:client' xmlns:stream='");
+  strcat(stringtosend, "http://etherx.jabber.org/streams'>\n");
+
+  if (!sk_send(sock, stringtosend)) {
+    perror("senddata (server.c:132)");
+    return NULL;
+  }
+  response = sk_recv(sock);
+  if (strstr(response, "error")) {
+    /* fprintf(stderr, "Response not valid:\n%s\n\n", response); */
+    scr_CreatePopup("Error",
+		    "Bad answer from the server", 60, 0, NULL);
+    return NULL;
+  }
+  aux = response;
+  while (strncmp(aux, "id", 2))
+    aux++;
+  pos = 0;
+  aux += 4;
+  while (strncmp(aux, "'", 1)) {
+    aux++;
+    pos++;
+  }
+  aux -= pos;
+  strncpy(idsession, aux, pos);
+
+  free(response);
+
+  strcpy(stringtosend, "<iq type='set' id='1000'>");
+  strcat(stringtosend, "<query xmlns='jabber:iq:auth'>");
+  strcat(stringtosend, "<username>");
+  strcat(stringtosend, user);
+  strcat(stringtosend, "</username><password>");
+  strcat(stringtosend, pass);
+  strcat(stringtosend, "</password><resource>");
+  strcat(stringtosend, resource);
+  strcat(stringtosend, "</resource></query></iq>\n");
+  if (!sk_send(sock, stringtosend)) {
+    perror("senddata (server.c:167)");
+    return NULL;
+  }
+  response = sk_recv(sock);
+  if (strstr(response, "error")) {
+/*	fprintf(stderr, "Response not valid:\n%s\n\n", response);*/
+    scr_CreatePopup("Error",
+		    "Account doesn't exist, or bad password", 60, 0,
+		    NULL);
+
+    /*
+    scr_CreatePopup("Info", "Trying to create the account...", 60, 0, NULL);
+
+    strcpy(stringtosend, "<iq type='set' id='reg' to='");
+    strcat(stringtosend, server);
+    strcat(stringtosend, "'>");
+    strcat(stringtosend, "<query xmlns='jabber:iq:register'>");
+    strcat(stringtosend, "<username>");
+    strcat(stringtosend, user);
+    strcat(stringtosend, "</username><password>");
+    strcat(stringtosend, pass);
+    strcat(stringtosend, "</password>");
+    strcat(stringtosend, "</query></iq>\n");
+    if (!sk_send(sock, stringtosend)) {
+      perror("senddata (server.c:167)");
+      return NULL;
+    }
+
+    response = sk_recv(sock);
+    */
+    scr_TerminateCurses();
+    printf("Reinicie cabber!\n\n");
+    return NULL;
+  }
+  free(response);
+  free(stringtosend);
+
+  return idsession;
+}
+
+
+/* Desc: broadcast presence
+ * 
+ * In  : socket, presence string
+ * Out : ?
+ *
+ * Note: see `sk_send' for output values
+ */
+int srv_setpresence(int sock, const char *type)
+{
+  int rv;
+  char *str = malloc(1024);
+
+  sprintf(str, "<presence><status>%s</status></presence>", type);
+  if (!(rv = sk_send(sock, str))) {
+    perror("senddata (server.c:199)");
+  }
+  free(str);
+
+  return rv;
+}
+
+
+/* Desc: request roster
+ * 
+ * In  : socket
+ * Out : roster string
+ *
+ * Note: it is up to the caller to free the returned string
+ */
+char *srv_getroster(int sock)
+{
+  char *str = malloc(1024);
+
+  strcpy(str, "<iq type='get' id='1001'><query xmlns='");
+  strcat(str, "jabber:iq:roster'/></iq>\n");
+  if (!sk_send(sock, str)) {
+    perror("senddata (server.c:222)");
+    return NULL;
+  }
+  free(str);
+
+  return sk_recv(sock);
+}
+
+
+/* Desc: send text to buddy
+ * 
+ * In  : socket, destination jid, text, source jid
+ * Out : 0 = ok
+ *
+ * Note: -
+ */
+int
+srv_sendtext(int sock, const char *to, const char *text, const char *from)
+{
+  char *stringtosend = malloc(2048);
+  char *utf8inputline = utf8_encode(text);
+
+  sprintf(stringtosend,
+	  "<message from='%s' to='%s' type='chat'><body>%s</body></message>",
+	  from, to, utf8inputline);
+  if (!sk_send(sock, stringtosend)) {
+    perror("senddata (server.c:247)");
+    return -1;
+  }
+
+  free(stringtosend);
+  free(utf8inputline);
+  return 0;
+}
+
+int check_io(int fd1, int fd2)
+{
+  int n = 0, i;
+  fd_set fds;
+  int io_pending = 0;
+
+  i = fd1;
+  if (fd2 > fd1)
+    i = fd2;
+
+  FD_ZERO(&fds);
+  if (fd1 >= 0)
+    FD_SET(fd1, &fds);
+  else
+    fd1 = 0;
+  if (fd2 >= 0)
+    FD_SET(fd2, &fds);
+  else
+    fd2 = 0;
+
+  if (fd2 == 0 && io_pending)
+    n = 2;
+  else if (select(i + 1, &fds, NULL, NULL, NULL) > 0)
+    n = 1 * (FD_ISSET(fd1, &fds) > 0) + 2 * (FD_ISSET(fd2, &fds) > 0);
+
+  return (n);
+}
+
+/* Desc: read data from server
+ *
+ * In  : socket
+ * Out : ptr to newly allocated srv_msg struct
+ *
+ * Note: returns NULL if no input from server
+ */
+srv_msg *readserver(int sock)
+{
+  char *buffer = sk_recv(sock);
+
+  if (buffer != NULL) {
+    srv_msg *msg = calloc(1, sizeof(srv_msg));
+    char *to = getattr(buffer, "to='");
+    char *from = getattr(buffer, "from='");
+    char *id = getattr(buffer, "id='");
+    char *type = getattr(buffer, "type='");
+    char *body = gettag(buffer, "body");
+    char *status = gettag(buffer, "status");
+    char *show = gettag(buffer, "show");
+    char *line = (char *) malloc(1024);
+    memset(line, 0, 1024);
+
+    /* scan for buffer */
+    if (!strncmp(buffer, "<message", 8)) {		/* manage messages */
+      msg->m = SM_MESSAGE;
+    } else if (!strncmp(buffer, "<presence", 9)) {	/* manage presences */
+      msg->m = SM_PRESENCE;
+      if (!strncmp(type, "UNK", 3)) {			/* assume online */
+	msg->connected = FLAG_BUDDY_CONNECTED;
+      } else if (!strncmp(type, "unavailable", 11)) {	/* offline */
+	msg->connected = 0;
+      }
+    } else {
+      msg->m = SM_UNHANDLED;
+    }
+
+    /* write the parsed buffer */
+    switch (msg->m) {
+    case SM_MESSAGE:
+      {
+	char *aux = strstr(from, "/");
+	if (aux)
+	  *aux = '\0';
+	msg->from = from;
+	msg->body = utf8_decode(body);
+	ut_WriteLog("+OK [%s]\n", buffer);
+      }
+      break;
+
+    case SM_PRESENCE:
+      {
+	char *aux = strstr(from, "/");
+	if (aux)
+	  *aux = '\0';
+	msg->from = from;
+      }
+      break;
+
+    case SM_UNHANDLED:
+      ut_WriteLog("BAD [%s]\n", buffer);
+      break;
+
+    }
+    free(line);
+    if (strncmp(to, "UNK", 3))
+      free(to);
+    if (strncmp(from, "UNK", 3) && (msg->m != SM_MESSAGE)
+	&& (msg->m != SM_PRESENCE))
+      free(from);
+    if (strncmp(id, "UNK", 3))
+      free(id);
+    if (strncmp(type, "UNK", 3))
+      free(type);
+    if (strncmp(body, "UNK", 3))
+      free(body);
+    if (strncmp(status, "UNK", 3))
+      free(status);
+    if (strncmp(show, "UNK", 3))
+      free(show);
+    free(buffer);
+
+    return msg;
+  }
+
+  return NULL;
+}
+
+void srv_AddBuddy(int sock, char *jidname)
+{
+  char *buffer = (char *) malloc(1024);
+  char *p, *str;
+  int i;
+
+  memset(buffer, 0, 1024);
+  strcpy(buffer, "<iq type='set'>");
+  strcat(buffer, "  <query xmlns='jabber:iq:roster'>");
+  strcat(buffer, "    <item");
+  strcat(buffer, "      jid='");
+  strcat(buffer, jidname);
+  strcat(buffer, "' name='");
+
+  str = strdup(jidname);
+  p = strstr(str, "@");
+  if (p)
+    *p = '\0';
+  strcat(buffer, str);
+  strcat(buffer, "'/></query></iq>");
+  sk_send(sock, buffer);
+  free(buffer);
+
+  for (i = 0; i < 2; i++) {
+    buffer = sk_recv(sock);
+    ut_WriteLog("[Subscription]: %s\n", buffer);
+    free(buffer);
+  }
+
+  buffer = (char *) malloc(1024);
+  memset(buffer, 0, 1024);
+  strcpy(buffer, "<presence to='");
+  strcat(buffer, jidname);
+  strcat(buffer, "' type='subscribe'>");
+  strcat(buffer, "<status>I would like to add you!</status></presence>");
+  sk_send(sock, buffer);
+  free(buffer);
+
+  buffer = sk_recv(sock);
+  ut_WriteLog("[Subscription]: %s\n", buffer);
+  free(buffer);
+
+  buffer = (char *) malloc(1024);
+  memset(buffer, 0, 1024);
+  strcpy(buffer, "<presence to='");
+  strcat(buffer, jidname);
+  strcat(buffer, "' type='subscribed'/>");
+  sk_send(sock, buffer);
+  free(buffer);
+
+  buffer = sk_recv(sock);
+  ut_WriteLog("[Subscription]: %s\n", buffer);
+  free(buffer);
+}
+
+void srv_DelBuddy(int sock, char *jidname)
+{
+  char *buffer = (char *) malloc(1024);
+
+  strcpy(buffer, "<iq type='set'><query xmlns='jabber:iq:roster'>");
+  strcat(buffer, "<item jid='");
+  strcat(buffer, jidname);
+  strcat(buffer, "' subscription='remove'/></query></iq>");
+
+  sk_send(sock, buffer);
+  free(buffer);
+
+  buffer = sk_recv(sock);
+  ut_WriteLog("[SubscriptionRemove]: %s\n", buffer);
+  free(buffer);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/server.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,29 @@
+#ifndef __SERVER_H__
+#define __SERVER_H__ 1
+
+typedef enum {
+  SM_MESSAGE,
+  SM_PRESENCE,
+  SM_UNHANDLED
+} SRV_MSGTYPE;
+
+typedef struct {
+  SRV_MSGTYPE m;		/* message type: see above! */
+  int connected;		/* meaningful only with SM_PRESENCE */
+  char *from;			/* sender */
+  char *body;			/* meaningful only with SM_MESSAGE */
+} srv_msg;
+
+char *srv_poll(int sock);
+int srv_connect(const char *server, unsigned int port);
+char *srv_login(int sock, const char *server, const char *user,
+		const char *pass, const char *resource);
+int srv_setpresence(int sock, const char *type);
+char *srv_getroster(int sock);
+int srv_sendtext(int sock, const char *to, const char *text,
+		 const char *from);
+int check_io(int fd1, int fd2);
+srv_msg *readserver(int sock);
+void srv_DelBuddy(int sock, char *jidname);
+void srv_AddBuddy(int sock, char *jidname);
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/socket.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include "utils.h"
+
+#include "socket.h"
+#include <signal.h>
+
+#include "screen.h" // FIXME to be removed
+
+/* Desc: create socket connection
+ * 
+ * In  : servername, port
+ * Out : socket (or -1 on error)
+ *
+ * Note: -
+ */
+int sk_conn(struct sockaddr *name)
+{
+  int sock;
+
+  if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+    perror("socket (socket.c:23)");
+    return -1;
+  }
+
+  if (connect(sock, (struct sockaddr *) name, sizeof(struct sockaddr)) < 0) {
+    perror("connect (socket.c:29)");
+    return -1;
+  }
+
+  return sock;
+}
+
+
+/* Desc: send data through socket
+ * 
+ * In  : socket, buffer to send
+ * Out : 0 = fail, 1 = pass
+ *
+ * Note: -
+ */
+int sk_send(int sock, char *buffer)
+{
+  //ut_WriteLog("Sending:%s\n", buffer);
+  if ((send(sock, buffer, strlen(buffer), 0)) == -1)
+    return 0;
+  else
+    return 1;
+}
+
+/* Desc: receive data through socket
+ * 
+ * In  : socket
+ * Out : received buffer
+ *
+ * Note: it is up to the caller to free the returned string
+ */
+char *sk_recv(int sock)
+{
+  int i = 1;
+  int tambuffer = 128;
+  char mtag[16];    // For tag name
+
+  char *buffer = malloc(tambuffer);
+  char *retval = malloc(tambuffer + 1);
+
+  memset(retval, 0, tambuffer);
+  memset(buffer, 0, tambuffer + 1);
+
+  while (1) {
+    char *p1;
+    int n = recv(sock, buffer, tambuffer, 0);
+    if (n == -1) {
+      // Error
+      free(buffer);
+      retval[0] = 0;
+      return retval;
+    }
+
+    if (i == 1) {
+      char *p2;
+      strcpy(retval, buffer);
+      p1 = retval+1;
+      p2 = mtag;
+      while (('a' <= *p1) && (*p1 <= 'z') && (p2-mtag < 14))
+        *p2++ = *p1++;
+      *p2++ = '>'; *p2++ = 0;
+      //fprintf(stderr, "TAG=\"%s\"\n", mtag);
+    } else {
+      scr_LogPrint("Realloc %d [%d]", i-1, n);
+      if (!n)
+        break;
+      retval = realloc(retval, (tambuffer * i) + 1);
+      strncat(retval, buffer, tambuffer + 1);
+    }
+    i++;
+    p1 = retval + strlen(retval) - strlen(mtag);
+    //fprintf(stderr, "buffer:[%s]\n", buffer);
+    //fprintf(stderr, "End RET=[%s]\n", p1);
+    if (!strcmp(p1, mtag))
+      break;
+    for (p1 = retval; *p1 && (*p1 != '>'); p1++);
+    if ((*p1 == '>') && (*(p1-1) == '/'))
+      break;
+    memset(buffer, 0, tambuffer);
+  }
+  free(buffer);
+  ut_WriteLog("Received:%s\n", retval);
+  return retval;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/socket.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,10 @@
+#ifndef __SOCKET_H__
+#define __SOCKET_H__ 1
+
+#include <sys/socket.h>
+
+int sk_conn(struct sockaddr *name);
+int sk_send(int sock, char *buffer);
+char *sk_recv(int sock);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/utf8.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,58 @@
+#include <stdlib.h>
+#include <string.h>
+
+#include "utf8.h"
+
+
+/* Desc: convert UTF8 -> ASCII
+ * 
+ * In  : UTF8 string
+ * Out : ASCII string
+ *
+ * Note: it is up to the caller to free the returned string
+ */
+char *utf8_decode(const char *src)
+{
+  char *ret = calloc(1, strlen(src) + 1);
+  char *aux = ret;
+
+  while (*src) {
+    unsigned char lead = *src++;
+    if ((lead & 0xe0) == 0xc0) {
+      unsigned char ch2 = *src++;
+      *aux = ((lead & 0x1f) << 6) | (ch2 & 0x3f);
+    } else {
+      *aux = lead;
+    }
+    aux++;
+  }
+
+  return ret;
+}
+
+
+/* Desc: convert ASCII -> UTF8
+ * 
+ * In  : ASCII string
+ * Out : UTF8 string
+ *
+ * Note: it is up to the caller to free the returned string
+ */
+char *utf8_encode(const char *src)
+{
+  char *ret = calloc(1, (strlen(src) * 2) + 1);
+  char *aux = ret;
+
+  while (*src) {
+    unsigned char ch = *src++;
+    if (ch < 0x80) {
+      *aux = ch;
+    } else {			/* if (ch < 0x800) { */
+      *aux++ = 0xc0 | (ch >> 6 & 0x1f);
+      *aux = 0xc0 | (0x80 | (ch & 0x3f));
+    }
+    aux++;
+  }
+
+  return ret;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/utf8.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,7 @@
+#ifndef __UTF8_H__
+#define __UTF8_H__ 1
+
+char *utf8_decode(const char *src);
+char *utf8_encode(const char *src);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/utils.c	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,207 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ncurses.h>
+#include <stdarg.h>
+#include <time.h>
+
+/* Variables globales a UTILS.C */
+int DebugEnabled = 0;
+
+void ut_InitDebug(int level)
+{
+  FILE *fp = fopen("/tmp/mcabberlog", "w");
+
+  DebugEnabled = level;
+  fprintf(fp, "Debugging mode started...\n"
+	  "-----------------------------------\n");
+  fclose(fp);
+}
+
+void ut_WriteLog(const char *fmt, ...)
+{
+  FILE *fp = NULL;
+  time_t ahora;
+  va_list ap;
+  char *buffer = NULL;
+
+  if (DebugEnabled) {
+    fp = fopen("/tmp/mcabberlog", "a+");
+    buffer = (char *) calloc(1, 64);
+
+    ahora = time(NULL);
+    strftime(buffer, 64, "[%H:%M:%S] ", localtime(&ahora));
+    fprintf(fp, "%s", buffer);
+
+    va_start(ap, fmt);
+    vfprintf(fp, fmt, ap);
+    va_end(ap);
+
+    free(buffer);
+    fclose(fp);
+  }
+}
+
+char **ut_SplitMessage(char *message, int *nsubmsgs, unsigned int maxlong)
+{
+  /* BUGs:    recorta la palabra si la longitud maxlong es menor que la palabra
+     //  maxlong = 4
+     // message = "peaso bug!"
+     // submsgs[0] = "peas"
+     // submsgs[1] = "bug!"
+     // por lo demas, rula de arte. De todos modos, podrias verificarla ???
+   */
+  char *running;
+  char *aux;
+  char *aux2;
+  char **submsgs;
+  char *buffer = (char *) malloc(strlen(message) * 2);
+  int maxnlines = 50;
+  int i = 0;
+
+  submsgs = (char **) malloc(maxnlines * sizeof(char *));
+
+  running = strdup(message);
+  aux2 = strdup(message);
+
+  aux = index(running, '\n');     /* is there a CR? */
+
+  while ((strlen(aux2) > maxlong) || (aux)) {
+    memset(buffer, 0, strlen(message) * 2);
+    running[maxlong] = '\0';	    /* cut at $maxlong chars */
+
+    if (aux != NULL) {              /* there is a CR */
+      strncpy(buffer, running, strlen(running) - strlen(aux));
+    } else {
+      aux = rindex(running, ' ');   /* look for last blank */
+      if (aux != NULL)		    /* hay blanco! */
+        strncpy(buffer, running, strlen(running) - strlen(aux));
+      else
+        strcpy(buffer, running);    /* se supone que esto es pa evitar  el bug explicado arriba, pero no rula */
+    }
+
+    submsgs[i] = (char *) malloc(strlen(buffer) + 1);	/*reservamos memoria */
+    strcpy(submsgs[i], buffer);	/*copiamos el buffer de arriba */
+    i++;			/*aumentamos numero de mensajillos */
+    aux2 += strlen(buffer) + 1;	/*eliminamos texto particionado */
+    sprintf(running, "%s", aux2);	/*y lo copiamos de nuevo a la string de "curro" */
+
+    // Check if we have allocated enough space
+    if (i >= maxnlines) {
+      maxnlines += 50;
+      submsgs = (char **) realloc(submsgs, maxnlines * sizeof(char *));
+    }
+    aux = index(running, '\n');     /* is there is a CR now? */
+  }
+  /* last part of the message */
+  if (strlen(aux2) > 0) {
+    submsgs[i] = (char *) malloc(strlen(aux2) + 1);
+    strcpy(submsgs[i], aux2);
+    i++;
+  }
+  (*nsubmsgs) = i;
+  free(buffer);
+  return submsgs;
+}
+
+/* Desc: get the rightmost substring
+ *
+ * In  : string, match
+ * Out : ptr to substring (or NULL if not found)
+ *
+ * Note: this one has no namespace, cos it belongs to <string.h>
+ */
+char *ut_strrstr(const char *s1, const char *s2)
+{
+  int l = strlen(s2);
+
+  if (l) {
+    const char *s = strchr(s1, '\0') - l;
+    while (s >= s1) {
+      if (*s == *s2) {
+	int _l = l - 1;
+	const char *_s = s + 1, *_s2 = s2 + 1;
+	while (_l) {
+	  if (*_s++ != *_s2++) {
+	    break;
+	  }
+	  _l--;
+	}
+	if (!_l) {
+	  return (char *) s;
+	}
+      }
+      s--;
+    }
+  }
+
+  return NULL;
+}
+
+char *gettag(char *buffer, char *what)
+{
+  char *aux;
+  char *aux2;
+  char *result = (char *) malloc(1024);
+  char *tmp = (char *) malloc(1024);
+  memset(result, 0, 1024);
+  memset(tmp, 0, 1024);
+
+  sprintf(tmp, "<%s>", what);
+  aux = strstr(buffer, tmp);
+  if (aux) {
+    aux += strlen(tmp);
+    sprintf(tmp, "</%s>", what);
+    aux2 = strstr(aux, tmp);
+    if (aux2) {
+      strncpy(result, aux, strlen(aux) - strlen(aux2));
+      free(tmp);
+      return result;
+    }
+  }
+  free(tmp);
+  free(result);
+  return "UNKtag";
+}
+
+
+char *getattr(char *buffer, char *what)
+{
+  char *aux;
+  char *aux2;
+  char *result = (char *) malloc(1024);
+  memset(result, 0, 1024);
+
+  aux = strstr(buffer, what);
+  if (aux) {
+    aux += strlen(what);
+    aux2 = strstr(aux, "'");
+    if (aux2) {
+      strncpy(result, aux, strlen(aux) - strlen(aux2));
+      return result;
+    }
+  }
+  free(result);
+  return "UNKattr";
+}
+
+void ut_CenterMessage(char *text, int width, char *output)
+{
+  char *blank;
+  int ntest, nn;
+
+  memset(output, 0, strlen(output));
+
+  ntest = (width - strlen(text)) / 2;
+  blank = (char *) malloc(ntest + 1);
+
+  for (nn = 0; nn < ntest; nn++)
+    blank[nn] = ' ';
+  blank[ntest] = '\0';
+
+  strcpy(output, blank);
+  strcat(output, text);
+  strcat(output, blank);
+
+  free(blank);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/src/utils.h	Sun Mar 27 20:16:02 2005 +0000
@@ -0,0 +1,16 @@
+#ifndef __UTILS_H__
+#define __UTILS_H__ 1
+
+#include <ncurses.h>
+
+char **ut_SplitMessage(char *mensaje, int *nsubmsgs, unsigned int maxlong);
+void ut_InitDebug(int level);
+void ut_WriteLog(const char *fmt, ...);
+char *ut_strrstr(const char *s1, const char *s2);
+char *getattr(char *buffer, char *what);
+char *gettag(char *buffer, char *what);
+void ut_CenterMessage(char *text, int width, char *output);
+
+
+
+#endif
--- a/mcabber/utf8.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-#include "utf8.h"
-
-
-/* Desc: convert UTF8 -> ASCII
- * 
- * In  : UTF8 string
- * Out : ASCII string
- *
- * Note: it is up to the caller to free the returned string
- */
-char *utf8_decode(const char *src)
-{
-  char *ret = calloc(1, strlen(src) + 1);
-  char *aux = ret;
-
-  while (*src) {
-    unsigned char lead = *src++;
-    if ((lead & 0xe0) == 0xc0) {
-      unsigned char ch2 = *src++;
-      *aux = ((lead & 0x1f) << 6) | (ch2 & 0x3f);
-    } else {
-      *aux = lead;
-    }
-    aux++;
-  }
-
-  return ret;
-}
-
-
-/* Desc: convert ASCII -> UTF8
- * 
- * In  : ASCII string
- * Out : UTF8 string
- *
- * Note: it is up to the caller to free the returned string
- */
-char *utf8_encode(const char *src)
-{
-  char *ret = calloc(1, (strlen(src) * 2) + 1);
-  char *aux = ret;
-
-  while (*src) {
-    unsigned char ch = *src++;
-    if (ch < 0x80) {
-      *aux = ch;
-    } else {			/* if (ch < 0x800) { */
-      *aux++ = 0xc0 | (ch >> 6 & 0x1f);
-      *aux = 0xc0 | (0x80 | (ch & 0x3f));
-    }
-    aux++;
-  }
-
-  return ret;
-}
--- a/mcabber/utf8.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-#ifndef __UTF8_H__
-#define __UTF8_H__ 1
-
-char *utf8_decode(const char *src);
-char *utf8_encode(const char *src);
-
-#endif
--- a/mcabber/utils.c	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ncurses.h>
-#include <stdarg.h>
-#include <time.h>
-
-/* Variables globales a UTILS.C */
-int DebugEnabled = 0;
-
-void ut_InitDebug(int level)
-{
-  FILE *fp = fopen("/tmp/mcabberlog", "w");
-
-  DebugEnabled = level;
-  fprintf(fp, "Debugging mode started...\n"
-	  "-----------------------------------\n");
-  fclose(fp);
-}
-
-void ut_WriteLog(const char *fmt, ...)
-{
-  FILE *fp = NULL;
-  time_t ahora;
-  va_list ap;
-  char *buffer = NULL;
-
-  if (DebugEnabled) {
-    fp = fopen("/tmp/mcabberlog", "a+");
-    buffer = (char *) calloc(1, 64);
-
-    ahora = time(NULL);
-    strftime(buffer, 64, "[%H:%M:%S] ", localtime(&ahora));
-    fprintf(fp, "%s", buffer);
-
-    va_start(ap, fmt);
-    vfprintf(fp, fmt, ap);
-    va_end(ap);
-
-    free(buffer);
-    fclose(fp);
-  }
-}
-
-char **ut_SplitMessage(char *message, int *nsubmsgs, unsigned int maxlong)
-{
-  /* BUGs:    recorta la palabra si la longitud maxlong es menor que la palabra
-     //  maxlong = 4
-     // message = "peaso bug!"
-     // submsgs[0] = "peas"
-     // submsgs[1] = "bug!"
-     // por lo demas, rula de arte. De todos modos, podrias verificarla ???
-   */
-  char *running;
-  char *aux;
-  char *aux2;
-  char **submsgs;
-  char *buffer = (char *) malloc(strlen(message) * 2);
-  int maxnlines = 50;
-  int i = 0;
-
-  submsgs = (char **) malloc(maxnlines * sizeof(char *));
-
-  running = strdup(message);
-  aux2 = strdup(message);
-
-  aux = index(running, '\n');     /* is there a CR? */
-
-  while ((strlen(aux2) > maxlong) || (aux)) {
-    memset(buffer, 0, strlen(message) * 2);
-    running[maxlong] = '\0';	    /* cut at $maxlong chars */
-
-    if (aux != NULL) {              /* there is a CR */
-      strncpy(buffer, running, strlen(running) - strlen(aux));
-    } else {
-      aux = rindex(running, ' ');   /* look for last blank */
-      if (aux != NULL)		    /* hay blanco! */
-        strncpy(buffer, running, strlen(running) - strlen(aux));
-      else
-        strcpy(buffer, running);    /* se supone que esto es pa evitar  el bug explicado arriba, pero no rula */
-    }
-
-    submsgs[i] = (char *) malloc(strlen(buffer) + 1);	/*reservamos memoria */
-    strcpy(submsgs[i], buffer);	/*copiamos el buffer de arriba */
-    i++;			/*aumentamos numero de mensajillos */
-    aux2 += strlen(buffer) + 1;	/*eliminamos texto particionado */
-    sprintf(running, "%s", aux2);	/*y lo copiamos de nuevo a la string de "curro" */
-
-    // Check if we have allocated enough space
-    if (i >= maxnlines) {
-      maxnlines += 50;
-      submsgs = (char **) realloc(submsgs, maxnlines * sizeof(char *));
-    }
-    aux = index(running, '\n');     /* is there is a CR now? */
-  }
-  /* last part of the message */
-  if (strlen(aux2) > 0) {
-    submsgs[i] = (char *) malloc(strlen(aux2) + 1);
-    strcpy(submsgs[i], aux2);
-    i++;
-  }
-  (*nsubmsgs) = i;
-  free(buffer);
-  return submsgs;
-}
-
-/* Desc: get the rightmost substring
- *
- * In  : string, match
- * Out : ptr to substring (or NULL if not found)
- *
- * Note: this one has no namespace, cos it belongs to <string.h>
- */
-char *ut_strrstr(const char *s1, const char *s2)
-{
-  int l = strlen(s2);
-
-  if (l) {
-    const char *s = strchr(s1, '\0') - l;
-    while (s >= s1) {
-      if (*s == *s2) {
-	int _l = l - 1;
-	const char *_s = s + 1, *_s2 = s2 + 1;
-	while (_l) {
-	  if (*_s++ != *_s2++) {
-	    break;
-	  }
-	  _l--;
-	}
-	if (!_l) {
-	  return (char *) s;
-	}
-      }
-      s--;
-    }
-  }
-
-  return NULL;
-}
-
-char *gettag(char *buffer, char *what)
-{
-  char *aux;
-  char *aux2;
-  char *result = (char *) malloc(1024);
-  char *tmp = (char *) malloc(1024);
-  memset(result, 0, 1024);
-  memset(tmp, 0, 1024);
-
-  sprintf(tmp, "<%s>", what);
-  aux = strstr(buffer, tmp);
-  if (aux) {
-    aux += strlen(tmp);
-    sprintf(tmp, "</%s>", what);
-    aux2 = strstr(aux, tmp);
-    if (aux2) {
-      strncpy(result, aux, strlen(aux) - strlen(aux2));
-      free(tmp);
-      return result;
-    }
-  }
-  free(tmp);
-  free(result);
-  return "UNKtag";
-}
-
-
-char *getattr(char *buffer, char *what)
-{
-  char *aux;
-  char *aux2;
-  char *result = (char *) malloc(1024);
-  memset(result, 0, 1024);
-
-  aux = strstr(buffer, what);
-  if (aux) {
-    aux += strlen(what);
-    aux2 = strstr(aux, "'");
-    if (aux2) {
-      strncpy(result, aux, strlen(aux) - strlen(aux2));
-      return result;
-    }
-  }
-  free(result);
-  return "UNKattr";
-}
-
-void ut_CenterMessage(char *text, int width, char *output)
-{
-  char *blank;
-  int ntest, nn;
-
-  memset(output, 0, strlen(output));
-
-  ntest = (width - strlen(text)) / 2;
-  blank = (char *) malloc(ntest + 1);
-
-  for (nn = 0; nn < ntest; nn++)
-    blank[nn] = ' ';
-  blank[ntest] = '\0';
-
-  strcpy(output, blank);
-  strcat(output, text);
-  strcat(output, blank);
-
-  free(blank);
-}
--- a/mcabber/utils.h	Sun Mar 27 20:09:05 2005 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#ifndef __UTILS_H__
-#define __UTILS_H__ 1
-
-#include <ncurses.h>
-
-char **ut_SplitMessage(char *mensaje, int *nsubmsgs, unsigned int maxlong);
-void ut_InitDebug(int level);
-void ut_WriteLog(const char *fmt, ...);
-char *ut_strrstr(const char *s1, const char *s2);
-char *getattr(char *buffer, char *what);
-char *gettag(char *buffer, char *what);
-void ut_CenterMessage(char *text, int width, char *output);
-
-
-
-#endif