/*
 * Return the default preference base directory
 */
const char *PrefDefUserDirReal (Preferences *pref)
{
    if (!pref->defaultbasedir)
    {
        const char *home;
#if HAVE_GETPWUID && HAVE_GETUID
        struct passwd *pwd = getpwuid (getuid ());
#endif
#if defined(_WIN32) || (defined(__CYGWIN__) && defined(_X86_))
        home = getenv ("USERPROFILE");
        if (!home || !*home)
#endif
        home = getenv ("HOME");
#if HAVE_GETPWUID && HAVE_GETUID
        if ((!home || !*home) && pwd && pwd->pw_dir)
            home = pwd->pw_dir;
#endif
#if defined(_WIN32) || (defined(__CYGWIN__) && defined(_X86_))
        if (!home || !*home)
            home = os_packagehomedir ();
#endif
        if (!home || !*home)
            home = _OS_PREFPATH;

        if (!home || !*home)
            pref->defaultbasedir = strdup (".micq" _OS_PATHSEPSTR);
        else if (home[strlen (home) - 1] != _OS_PATHSEP)
            pref->defaultbasedir = strdup (s_sprintf ("%s%c.micq%c", home, _OS_PATHSEP, _OS_PATHSEP));
        else
            pref->defaultbasedir = strdup (s_sprintf ("%s.micq%c", home, _OS_PATHSEP));
    }
    return pref->defaultbasedir;
}
Exemple #2
0
static void updateval(char *var, int val, char *onchange)
{
    ident *id = getident(var);
    string assign;
    if(!id) return;
    else if(id->_type==ID_VAR) s_sprintf(assign)("%s %d", var, val);
    else if(id->_type==ID_ALIAS) s_sprintf(assign)("%s = %d", var, val);
    else return;
    executelater.add(newstring(assign));
    if(onchange[0]) executelater.add(newstring(onchange));
};
/*
 * Print a given SNAC.
 */
void SnacPrint (Packet *pak)
{
    UWORD fam, cmd, flag, opos = pak->rpos;
    UDWORD ref, len;

    pak->rpos = 6;
    fam  = PacketReadB2 (pak);
    cmd  = PacketReadB2 (pak);
    flag = PacketReadB2 (pak);
    ref  = PacketReadB4 (pak);
    len  = PacketReadAtB2 (pak, pak->rpos);

    rl_printf ("%s %sSNAC     (%x,%x) [%s] flags %x ref %lx",
             s_dumpnd (pak->data + 6, flag & 0x8000 ? 10 + len : 10),
             COLDEBUG, fam, cmd, SnacName (fam, cmd), flag, ref);
    if (flag & 0x8000)
    {
        rl_printf (" extra (%ld)", len);
        pak->rpos += len + 2;
    }
    rl_printf ("%s\n", COLNONE);

    if (prG->verbose & DEB_PACK8DATA || ~prG->verbose & DEB_PACK8)
    {
        char *f, *syn = strdup (s_sprintf ("gs%dx%ds", fam, cmd));
        rl_print (f = PacketDump (pak, syn, COLDEBUG, COLNONE));
        free (f);
        free (syn);
    }

    pak->rpos = opos;
}
/*
 * Open preference file.
 */
static FILE *PrefOpenRC (Preferences *pref)
{
    if (!pref->rcfile)
        pref->rcfile = strdup (s_sprintf ("%smicqrc", PrefUserDir (pref)));
    
    return fopen (pref->rcfile, "r");
}
/*
 * Open status file.
 */
static FILE *PrefOpenStat (Preferences *pref)
{
    if (!pref->statfile)
        pref->statfile = strdup (s_sprintf ("%sstatus", PrefUserDir (pref)));

    return fopen (pref->statfile, "r");
}
/*
 * Resets prompt to default prompt
 */
void ReadLinePromptReset (void)
{
    Contact *cont;
    if (prG->flags & FLAG_UINPROMPT && (cont = uiG.last_sent))
        ReadLinePromptSet (s_sprintf ("[%s]", cont->nick));
    else
        ReadLinePromptSet (i18n (2467, "mICQ>"));
}
/*
 * Determine for a character is display string and columns width
 */
static void rl_analyze_ucs (wint_tt ucs, const char **display, UWORD *columns)
{
   char *utf = NULL;
#if HAVE_WCWIDTH
   int width;
#endif
  
   utf = strdup (ConvUTF8 (ucs));
   *display = ConvTo (utf, ENC(enc_loc))->txt;

    if (ucs < 32 || ucs == 127 || ucs == 173) /* control code */
    {
        *display = s_sprintf ("%s^%c%s", COLINVCHAR, (char)((ucs - 1 + 'A') & 0x7f), COLNONE);
        *columns = 2;
    }
    else if (ucs < 127)
        *columns = 1;
#if HAVE_WCWIDTH
    else if (!prG->locale_broken && (width = rl_wcwidth (ucs, *display)) != -1)
        *columns = 256 | width;
#else
    else if (ucs >= 160) /* no way I'll hard-code double-width or combining marks here */
        *columns = 257;
#endif
    else if (prG->locale_broken && !strcmp (ConvFrom (ConvTo (utf, ENC(enc_loc)), ENC(enc_loc))->txt, utf))
        *columns = 257;
    else if (!(ucs & 0xffff0000)) /* more control code, or unknown */
    {
        *display = s_sprintf ("%s\\u%c%c%c%c%s", COLINVCHAR,
           rl_hex (ucs / 4096), rl_hex (ucs /  256),
           rl_hex (ucs /   16), rl_hex (ucs),
           COLNONE);
        *columns = 6;
    }
    else /* unknown stellar planes */
    {
        *display = s_sprintf ("%s\\U%c%c%c%c%c%c%c%c%s", COLINVCHAR,
           rl_hex (ucs / 268435456), rl_hex (ucs /  16777216),
           rl_hex (ucs /   1048576), rl_hex (ucs /     65536),
           rl_hex (ucs /      4096), rl_hex (ucs /       256),
           rl_hex (ucs /        16), rl_hex (ucs),
           COLNONE);
        *columns = 10;
    }
    free (utf);
}
Exemple #8
0
// here use Liu eng. 's cam method.
int today_is_holiday( int group_id, int year, int month, int day )
{
	char buf[20];
	char date_str[20];
	s_sprintf( date_str, "%02d%04d%02d%02d", group_id,year, month, day );
	if( txt_file_search_line( "holiday.txt", date_str, buf, sizeof( buf ) ) == 1 )
		return 1;
	return 0;
}
const char *ReadLinePrintWidth (const char *text, const char *left, const char *right, UWORD *width)
{
    UWORD pwidth = *width, twidth;
    strc_t txt;
    
    txt = ReadLineAnalyzeWidth (text, &twidth);
    if (twidth > pwidth)
        *width = pwidth = twidth;
    return s_sprintf ("%s%s%s%*.*s", left, txt->txt, right, pwidth - twidth, pwidth - twidth, "");
}
Exemple #10
0
void setnames(const char *fname, const char *cname = 0)
{
    if(!cname) cname = fname;
    string name, pakname, mapname, cfgname;
    s_strncpy(name, cname, 100);
    char *slash = strpbrk(name, "/\\");
    if(slash)
    {
        s_strncpy(pakname, name, slash-name+1);
        s_strcpy(cfgname, slash+1);
    }
    else
    {
        s_strcpy(pakname, "base");
        s_strcpy(cfgname, name);
    };
    if(strpbrk(fname, "/\\")) s_strcpy(mapname, fname);
    else s_sprintf(mapname)("base/%s", fname);

    s_sprintf(cgzname)("packages/%s.tmf", mapname);
    if(savebak==1) s_sprintf(bakname)("packages/%s.BAK", mapname);
    else s_sprintf(bakname)("packages/%s_%d.BAK", mapname, lastmillis);
    s_sprintf(pcfname)("packages/%s/package.cfg", pakname);
    s_sprintf(mcfname)("packages/%s/%s.cfg",      pakname, cfgname);

    path(cgzname);
    path(bakname);
};
Exemple #11
0
    void slider(int &val, int vmin, int vmax, int color, char *label)
    {
        autotab();
        int x = curx;
        int y = cury;
        line_(10);
        if(visible())
        {
            if(!label)
            {
                static string s;
                s_sprintf(s)("%d", val);
                label = s;
            }
            int w = text_width(label);

            bool hit;
            int px, py;
            if(ishorizontal())
            {
                hit = ishit(FONTH, ysize, x, y);
                px = x + (FONTH-w)/2;
                py = y + (ysize-FONTH) - ((ysize-FONTH)*(val-vmin))/((vmax==vmin) ? 1 : (vmax-vmin)); //vmin at bottom
            }
            else
            {
                hit = ishit(xsize, FONTH, x, y);
                px = x + FONTH/2 - w/2 + ((xsize-w)*(val-vmin))/((vmax==vmin) ? 1 : (vmax-vmin)); //vmin at left
                py = y;
            }

            if(hit) color = 0xFF0000;
            text_(label, px, py, color, hit && actionon);
            if(hit && actionon)
            {
                int vnew = (vmin < vmax ? 1 : -1)+vmax-vmin;
                if(ishorizontal()) vnew = int(vnew*(y+ysize-FONTH/2-hity)/(ysize-FONTH));
                else vnew = int(vnew*(hitx-x-FONTH/2)/(xsize-w));
                vnew += vmin;
                vnew = vmin < vmax ? clamp(vnew, vmin, vmax) : clamp(vnew, vmax, vmin);
                if(vnew != val) val = vnew;
            }
        }
    }
/*
 * Handle tab key - continue tabbing backwards
 */
static void rl_key_shifttab (void)
{
    str_s str = { NULL, 0, 0 };
    const char *display;
    int off;
    UWORD columns;

    if (rl_tab_state <= 0)
    {
        printf ("\a");
        return;
    }

    rl_linecompress (&rl_temp, rl_tab_pos, rl_ucspos);
    rl_tab_cont = rl_tab_getprev (&rl_temp);
    rl_left (rl_tab_common);

    for ( ; rl_tab_len; rl_tab_len--)
        rl_delete ();
    if (!rl_tab_cont)
    {
        printf ("\a");
        rl_tab_state = 0;
        rl_recheck (TRUE);
        return;
    }

    str.txt = rl_tab_alias ? rl_tab_alias->alias : rl_tab_cont->nick;
    str.len = strlen (str.txt);
    for (off = 0; off < str.len; )
    {
        wint_tt ucs = ConvGetUTF8 (&str, &off);
        rl_analyze_ucs (ucs, &display, &columns);
        rl_insert_basic (ucs, s_sprintf ("%s%s%s", rl_colon.txt, display, rl_coloff.txt),
                         strlen (display) + rl_colon.len + rl_coloff.len, columns & 0xff);
        rl_tab_len++;
    }
    rl_left (rl_tab_len - rl_tab_common);
    rl_recheck (TRUE);
}
Exemple #13
0
int cam_read_time_area_list_from_week_table( int group_id, DWORD time, char* buf, int buf_size )
{
	DATETIME dt;
	char key[16];
	char *week_table_file_name;
	// use normal week plan
	week_table_file_name = "week_table.txt";
	RelatvieToDateTime( &dt, time );
	if( today_is_holiday( group_id, dt.year, dt.month, dt.day ) == 1 ){
		_d_str( "use holiday week plan" );
		week_table_file_name = "holiday_week_table.txt";
	}

	_d_str( week_table_file_name );
	dt.weekday = date_to_week_day( &dt );
	s_sprintf( key, "%02d%d", group_id, dt.weekday );
	_d_str( key );
	if( txt_file_search_line( week_table_file_name, key, buf, buf_size ) == 1 ){
		return 1;
	}
	return -1;
}
Exemple #14
0
 //tab is always at top of page
 void tab(const char *name, int color) 
 {
     if(curdepth != 0) return;
     if(color) tcolor = color;
     tpos++; 
     if(!name) 
     {
         static string title;
         s_sprintf(title)("%d", tpos);
         name = title;
     }
     int w = text_width(name) - 2*INSERT;
     if(layoutpass) 
     {  
         ty = max(ty, ysize); 
         ysize = 0;
     }
     else 
     {	
         cury = -ysize;
         int h = FONTH-2*INSERT,
             x1 = curx + tx,
             x2 = x1 + w + ((skinx[3]-skinx[2]) + (skinx[5]-skinx[4]))*SKIN_SCALE,
             y1 = cury - ((skiny[5]-skiny[1])-(skiny[3]-skiny[2]))*SKIN_SCALE-h,
             y2 = cury;
         bool hit = tcurrent && windowhit==this && hitx>=x1 && hity>=y1 && hitx<x2 && hity<y2;
         if(hit && (!guiclicktab || mousebuttons&G3D_DOWN)) 
         {	
             *tcurrent = tpos; //roll-over to switch tab
             color = 0xFF0000;
         }
         
         skin_(x1-skinx[visible()?2:6]*SKIN_SCALE, y1-skiny[1]*SKIN_SCALE, w, h, visible()?10:19, 9);
         text_(name, x1 + (skinx[3]-skinx[2])*SKIN_SCALE - INSERT, y1 + (skiny[2]-skiny[1])*SKIN_SCALE - INSERT, tcolor, visible());
     }
     tx += w + ((skinx[5]-skinx[4]) + (skinx[3]-skinx[2]))*SKIN_SCALE; 
 }
Exemple #15
0
int main(const carg, const char *varg[])
{
	char *s;
	int i;

	s = NULL;
	i = 0;

	fprintf(stdout, "s_strcpy(NULL, \"\") == FALSE: ");
	if (s_strcpy(NULL, "") == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strncpy(NULL, \"\", 10) == FALSE: ");
	if (s_strncpy(NULL, "", 10) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strcat(NULL, \"\") == FALSE: ");
	if (s_strcat(NULL, "") == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strncat(NULL, \"\", 10) == FALSE: ");
	if (s_strncat(NULL, "", 10) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strcpy(&s, NULL) == FALSE: ");
	if (s_strcpy(&s, NULL) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strncpy(&s, NULL, 10) == FALSE: ");
	if (s_strncpy(&s, NULL, 10) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strcat(&s, NULL) == FALSE: ");
	if (s_strcat(&s, NULL) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strncat(&s, NULL, 10) == FALSE: ");
	if (s_strncat(&s, NULL, 10) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}


	fprintf(stdout, "s_strcpy(&s, \"ab\"), strcmp(s, \"ab\") == 0: ");
	s_strcpy(&s, "ab");
	if (strcmp(s, "ab") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strncpy(&s, \"ab\", 1), strcmp(s, \"a\") == 0: ");
	s_strncpy(&s, "ab", 1);
	if (strcmp(s, "a") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	
	fprintf(stdout, "s_strcat(&s, \"ab\"), strcmp(s, \"aab\") == 0: ");
	s_strcat(&s, "ab");
	if (strcmp(s, "aab") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strncat(&s, \"ab\", 1), strcmp(s, \"aaba\") == 0: ");
	s_strncat(&s, "ab", 1);
	if (strcmp(s, "aaba") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_strcpy(&s, \"abcdefghij klmnop\"), s_strcpy(&s, s), strcmp(s, \"abcdefghij klmnop\") == 0: ");
	s_strcpy(&s, "abcdefghij klmnop");
	s_strcpy(&s, s);
	if (strcmp(s, "abcdefghij klmnop") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}
	
	fprintf(stdout, "s_strncpy(&s, s, 10), strcmp(s, \"abcdefghij\") == 0: ");
	s_strncpy(&s, s, 10);
	if (strcmp(s, "abcdefghij") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}
	
	fprintf(stdout, "s_strcat(&s, s), strcmp(s, \"abcdefghijabcdefghij\") == 0: ");
	s_strcat(&s, s);
	if (strcmp(s, "abcdefghijabcdefghij") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}
	
	fprintf(stdout, "s_strncat(&s, s, 10), strcmp(s, \"abcdefghijabcdefghijabcdefghij\") == 0: ");
	s_strncat(&s, s, 10);
	if (strcmp(s, "abcdefghijabcdefghijabcdefghij") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_path(NULL, \"\", SYS_PATH_DELIM) == FALSE: ");
	if (s_path(NULL, "", SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_pathname(NULL, \"\", SYS_PATH_DELIM) == FALSE: ");
	if (s_pathname(NULL, "", SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_name(NULL, \"\", SYS_PATH_DELIM) == FALSE: ");
	if (s_name(NULL, "", SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_nameext(NULL, \"\", SYS_PATH_DELIM) == FALSE: ");
	if (s_nameext(NULL, "", SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_ext(NULL, \"\", SYS_PATH_DELIM) == FALSE: ");
	if (s_ext(NULL, "", SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_path(&s, NULL, SYS_PATH_DELIM) == FALSE: ");
	if (s_path(&s, NULL, SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_pathname(&s, NULL, SYS_PATH_DELIM) == FALSE: ");
	if (s_pathname(&s, NULL, SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_name(&s, NULL, SYS_PATH_DELIM) == FALSE: ");
	if (s_name(&s, NULL, SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_nameext(&s, NULL, SYS_PATH_DELIM) == FALSE: ");
	if (s_nameext(&s, NULL, SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	fprintf(stdout, "s_ext(&s, NULL, SYS_PATH_DELIM) == FALSE: ");
	if (s_ext(&s, NULL, SYS_PATH_DELIM) == FALSE)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	s_strcpy(&s, "/path/name.ext");
	s_path(&s, s, SYS_PATH_DELIM);
	fprintf(stdout, "s_strcpy(&s, \"/path/name.ext\"), s_path(&s, s, SYS_PATH_DELIM), strcmp(s, \"/path/\") == 0: ");
	if (strcmp(s, "/path/") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}	
	
	s_strcpy(&s, "/path/name.ext");
	s_pathname(&s, s, SYS_PATH_DELIM);
	fprintf(stdout, "s_strcpy(&s, \"/path/name.ext\"), s_pathname(&s, s, SYS_PATH_DELIM), strcmp(s, \"/path/name\") == 0: ");
	if (strcmp(s, "/path/name") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	s_strcpy(&s, "/path/name.ext");
	s_name(&s, s, SYS_PATH_DELIM);
	fprintf(stdout, "s_strcpy(&s, \"/path/name.ext\"), s_name(&s, s, SYS_PATH_DELIM), strcmp(s, \"name\") == 0: ");
	if (strcmp(s, "name") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}

	s_strcpy(&s, "/path/name.ext");
	s_nameext(&s, s, SYS_PATH_DELIM);
	fprintf(stdout, "s_strcpy(&s, \"/path/name.ext\"), s_nameext(&s, s, SYS_PATH_DELIM), strcmp(s, \"name.ext\") == 0: ");
	if (strcmp(s, "name.ext") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}
	
	s_strcpy(&s, "/path/name.ext");
	s_ext(&s, s, SYS_PATH_DELIM);
	fprintf(stdout, "s_strcpy(&s, \"/path/name.ext\"), s_ext(&s, s, SYS_PATH_DELIM), strcmp(s, \".ext\") == 0: ");
	if (strcmp(s, ".ext") == 0)
		fprintf(stdout, "OK\n");
	else
	{
		fprintf(stdout, "failed.\n");
		i++;
	}
	
	i += check_pathnameext("", "", "", "", "", "");
	i += check_pathnameext("/", "/", "/", "", "", "");
	i += check_pathnameext("path/", "path/", "path/", "", "", "");
	i += check_pathnameext("name", "", "name", "name", "name", "");
	i += check_pathnameext(".ext", "", "", "", ".ext", ".ext");
	i += check_pathnameext("path/name", "path/", "path/name", "name", "name", "");
	i += check_pathnameext("path/.ext", "path/", "path/", "", ".ext", ".ext");
	i += check_pathnameext("name.ext", "", "name", "name", "name.ext", ".ext");
	i += check_pathnameext("path/name.ext", "path/", "path/name", "name", "name.ext", ".ext");
	i += check_pathnameext("path.e/", "path.e/", "path.e/", "", "", "");
	i += check_pathnameext("path.e/name", "path.e/", "path.e/name", "name", "name", "");
	i += check_pathnameext("path.e/.ext", "path.e/", "path.e/", "", ".ext", ".ext");
	i += check_pathnameext("path.e/name.ext", "path.e/", "path.e/name", "name", "name.ext", ".ext");

	fprintf(stdout, "s_sprintf(NULL, \"%%d abc %%s\", -2147483648, \"def\") == FALSE: ");
	if (s_sprintf(NULL, "%d abc %s", -2147483648, "def") == FALSE)
                fprintf(stdout, "OK\n");
        else
        {
                fprintf(stdout, "failed.\n");
                i++;
        }

	fprintf(stdout, "s_sprintf(&s, NULL, -2147483648, \"def\") == FALSE: ");
	if (s_sprintf(&s, NULL, -2147483648, "def") == FALSE)
                fprintf(stdout, "OK\n");
        else
        {
                fprintf(stdout, "failed.\n");
                i++;
        }

	s_sprintf(&s, "%d abc %s", -2147483648, "def");
	fprintf(stdout, "s_sprintf(&s, \"%%d abc %%s\", -2147483648, \"def\"), strcmp(s, \"-2147483648 abc def\") == 0: ");
	if (strcmp(s, "-2147483648 abc def") == 0)
                fprintf(stdout, "OK\n");
        else
        {
                fprintf(stdout, "failed.\n");
                i++;
        }

	fprintf(stdout, "is_equal_files(\"%s\", \"%s\") == TRUE: ", varg[0], varg[0]);
	if (is_equal_files(varg[0], varg[0]) == TRUE)
                fprintf(stdout, "OK\n");
        else
        {
                fprintf(stdout, "failed.\n");
                i++;
        }

	s_free(&s);
	fprintf(stderr, "Found %d errors.\n", i);
	return i;
}
Exemple #16
0
io_err_t UtilIOShowError (Connection *conn, io_err_t rc)
{
    int e = errno;
    const char *t = NULL;

    switch (rc) {
    
        case IO_CONNECTED: 
            rl_print ("");
            if (prG->verbose || (conn->serv && conn == conn->serv->conn))
                if (rl_pos () > 0)
                     rl_print (i18n (1634, "ok.\n"));
            return IO_CONNECTED;

        case IO_OK:
            return IO_OK;

        case IO_NO_MEM:
        case IO_NO_PARAM:
            assert (0);

        case IO_NO_SOCKET:
            if (1) t = i18n (1638, "Couldn't create socket"); else
        case IO_NO_NONBLOCK:
            if (1) t = i18n (1950, "Couldn't set socket nonblocking"); else
        case IO_NO_HOSTNAME:
            if (1) t = i18n (2743, "Can't find hostname"); else
        case IO_CONN_TO:
            if (1) t = i18n (2744, "Connection timed out"); else
        case IO_NO_CONN:
                   t = i18n (1952, "Couldn't open connection");
            if (prG->verbose || (conn->serv && conn == conn->serv->conn))
            {
                Contact *cont = conn->cont;
                char *semi = strchr (conn->server, ';');
                if (semi)
                    *semi = 0;
                rl_log_for (cont->nick, COLCONTACT);
                rl_printf (i18n (2745, "Opening connection to %s:%s%ld%s "),
                          s_wordquote (conn->server), COLQUOTE, UD2UL (conn->port), COLNONE);
                if (semi)
                    *semi = ';';
                rl_print (i18n (1949, "failed:\n"));
                rl_printf ("%s [%d]\n",
                    s_sprintf  ("%s: %s (%d).", t, conn->dispatcher->funcs->f_err (conn, conn->dispatcher), e),
                    __LINE__);
            }
            UtilIOClose (conn);
            return IO_RW;
        case IO_CLOSED:
#ifdef ECONNRESET
            if (!errno)
                errno = ECONNRESET;
#endif
        case IO_RW:
            if (prG->verbose || (conn->serv && conn == conn->serv->conn))
            {
                Contact *cont;
                if ((cont = conn->cont))
                {
                    rl_log_for (cont->nick, COLCONTACT);
                    rl_printf (i18n (1878, "Error while reading from socket: %s (%d, %d)\n"), conn->dispatcher->funcs->f_err (conn, conn->dispatcher), rc, errno);
                }
            }
            UtilIOClose (conn);
            return IO_RW;
        default:
            assert (0);
    }
}
Exemple #17
0
int sub_do_cam( int device_no, DWORD card_id, DWORD time, char* show_buf, int max_show_buf )
{
	char buf[64];
	char time_area_list[32];
	int group_id;
	int allow_id;
	int not_allow_id;
	char white_name_content[32];
	int no, time_area_no;
	DWORD begin_time, end_time;
	int password = 0;

	//cam_read_white_name_record( card_id, buf );
	_d_u( card_id );
	if( cam_read_group_id_from_white_name_record( card_id, buf, sizeof(buf) ) < 0 ){
		error_message( (char*)"can not search this card_id", card_id );
		goto do_cam_error_exit;
	}
	//old design: 职员工号,职员姓名,物理卡号,组别,用户密码,反潜会控制
	// card_id,group_id,show_mode_id,data....
	//_d_str( buf );
	strcpy( white_name_content, buf );
	_d_str( white_name_content );
	if( white_name_list_get_value( buf, &group_id, &allow_id, &not_allow_id, &password ) < 0 )
		goto not_allow_enter;
	//goto do_cam_error_exit;

	//_d_str( white_name_content );
	if( cam_read_time_area_list_from_week_table( group_id, time, time_area_list, sizeof(time_area_list) ) < 0 ){
		error_message( (char*)"read time_area_list error", group_id );
		goto not_allow_enter;
		//goto do_cam_error_exit;
	}
	// loop check the time_area
	_d_str( time_area_list );
	no = 0;
	while( 1 ){
		_d_int( no );
		time_area_no = cam_get_no_from_time_area_list( time_area_list, no );
		if( time_area_no <= 0 )
			break;
		_d_int( time_area_no );
		//get time area, and check ok.
		if( cam_read_time_area_from_time_area_file( time_area_no, &begin_time, &end_time ) < 0 ){
			error_message( (char*)"read time_area from time_area_file error", time_area_no );
			break;
		}
		_d_int( begin_time );
		_d_int( end_time );
		_d_int( time );
		if( begin_time <= time && time <= end_time ){
			if( show_buf ){
				// check the password.
#if 0
				if( password ){
					buf[0] = 0;
					if( main_basic_gui_get_string( buf, sizeof(buf) ) < 0 ){
						// or hint password input problem?
						goto not_allow_enter;
					}
					if( password != atoi( buf ) ){
						// or hint password error?
						goto not_allow_enter;
					}
				}
#endif
				if( card_group_operate() < 0 )
					goto not_allow_enter;

#if 0
				// the password is ok.
				// deal the show info.
				if( txt_file_read_line( "/c/show", allow_id, buf, sizeof(buf) ) > 0 ){
					//_d_str( buf );
					cam_show( buf, white_name_content, show_buf, max_show_buf );
				}
				else{
					s_sprintf( show_buf, "%u, Allowed", card_id );
				}
#endif
			}
			return allow_id;
		}
		no ++;
	}
	_d_line();
not_allow_enter:
	_d_line();
#if 0	
	if( show_buf ){
		_d_line();
		// deal the show info.
		if( txt_file_read_line( "/c/show", not_allow_id, buf, sizeof(buf) ) > 0 ){
			//_d_str( buf );
			cam_show( buf, white_name_content, show_buf, max_show_buf );
		}
		else{
			s_sprintf( show_buf, "%u, Not Allowed", card_id );
		}
		return -1;
	}
#endif
	return -1;

do_cam_error_exit: 	
	_d_line();
#if 0	
	if( show_buf ){
		_d_line();
		if( txt_file_read_line( "/c/show", 0, buf, sizeof(buf) ) > 0 ){
			char *po = show_buf;
			char *buf_po;
			int len ;
			//_d_str( buf );
			white_name_content[0] = 0;
			s_sprintf( po, "%u", card_id );
			len = strlen( po );
			po += len;
			buf_po = buf;
			_d_hex( buf_po[0] );
			_d_hex( buf_po[1] );
			_d_hex( buf_po[2] );
			_d_hex( buf_po[3] );
			if( (unsigned char)buf_po[0] == (unsigned char)0xef && (unsigned char)buf_po[1] == (unsigned char)0xbb && (unsigned char)buf_po[2] == (unsigned char)0xbf )
				buf_po += 3;
			cam_show( buf_po, white_name_content, po, max_show_buf-len );
		}
		else{
			s_sprintf( show_buf, "%u, Error", card_id );
		}
	}
#endif	
	//return -1;
	// illegal card
	return -2;

}
Exemple #18
0
void PeerFileResend (Event *event)
{
    Contact *cont;
    Connection *fpeer = event->conn;
    Packet *pak;
    Event *event2;
    int rc;
    const char *opt_text;
    
    if (!fpeer)
    {
        EventD (event);
        return;
    }
    
    ASSERT_FILEDIRECT (fpeer);

    cont = event->cont;
    assert (cont);
    
    if (!OptGetStr (event->opt, CO_FILENAME, &opt_text))
        opt_text = "";

    if (event->attempts >= MAX_RETRY_P2PFILE_ATTEMPTS || (!event->pak && !event->seq))
    {
        rl_log_for (cont->nick, COLCONTACT);
        rl_printf (i18n (2168, "File transfer #%ld (%s) dropped after %ld attempts because of timeout.\n"),
                   UD2UL (event->seq), opt_text, UD2UL (event->attempts));
        TCPClose (fpeer);
    }
    else if (!(fpeer->connect & CONNECT_MASK))
    {
        rl_log_for (cont->nick, COLCONTACT);
        rl_printf (i18n (2072, "File transfer #%ld (%s) canceled because of closed connection.\n"),
                   UD2UL (event->seq), opt_text);
    }
    else if (~fpeer->connect & CONNECT_OK)
    {
        if (!event->seq)
            event->attempts++;
        event->due = time (NULL) + 20;
        QueueEnqueue (event);
        return;
    }
    else if (!event->seq)
    {
        fpeer->oscar_dc_seq = 0;
        PeerPacketSend (fpeer, event->pak);
        PacketD (event->pak);
        event->pak = NULL;
    }
    else if (event->seq != fpeer->oscar_dc_seq)
    {
        event->due = time (NULL) + 10;
        QueueEnqueue (event);
        return;
    }
    else if (event->pak)
    {
        Connection *ffile;
        struct stat finfo;
        
        PeerPacketSend (fpeer, event->pak);
        PacketD (event->pak);
        event->pak = NULL;
        QueueEnqueue (event);
        
        ffile = ServerChild (fpeer->serv, fpeer->cont, TYPE_FILE);
        fpeer->oscar_file = ffile;

        if (stat (opt_text, &finfo))
        {
            rc = errno;
            rl_printf (i18n (2071, "Couldn't stat file %s: %s (%d)\n"),
                      s_wordquote (opt_text), strerror (rc), rc);
        }
        ffile->oscar_file_len = finfo.st_size;

        ffile->sok = open (opt_text, O_RDONLY);
        if (ffile->sok == -1)
        {
            int rc = errno;
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2083, "Cannot open file %s: %s (%d).\n"),
                      opt_text, strerror (rc), rc);
            TCPClose (fpeer);
            ConnectionD (ffile);
            ConnectionD (fpeer);
            return;
        }
        return;
    }
    else if (!fpeer->oscar_file || fpeer->connect & CONNECT_SELECT_W)
    {
        event->attempts++;
        event->due = time (NULL) + 3;
        QueueEnqueue (event);
        return;
    }
    else
    {
        int len = 0;

        pak = PeerPacketC (fpeer, 6);
        len = read (fpeer->oscar_file->sok, pak->data + 1, 2048);
        if (len == -1)
        {
            len = errno;
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2086, "Error while reading file %s: %s (%d).\n"),
                      opt_text, strerror (len), len);
            TCPClose (fpeer);
        }
        else
        {
            pak->len += len;
            fpeer->oscar_file->oscar_file_done += len;
            PeerPacketSend (fpeer, pak);
            PacketD (pak);

            if (len > 0)
            {
                if (fpeer->oscar_file->oscar_file_len)
                    ReadLinePromptUpdate (s_sprintf ("[%s%ld %02d%%%s] %s%s",
                                  COLCONTACT, UD2UL (fpeer->oscar_file->oscar_file_done), (int)((100.0 * fpeer->oscar_file->oscar_file_done) / fpeer->oscar_file->oscar_file_len),
                                  COLNONE, COLSERVER, i18n (2467, "climm>")));
                else
                    ReadLinePromptUpdate (s_sprintf ("[%s%ld%s] %s%s",
                                  COLCONTACT, UD2UL (fpeer->oscar_file->oscar_file_done),
                                  COLNONE, COLSERVER, i18n (2467, "climm>")));
                event->attempts = 0;
                QueueEnqueue (event);
                return;
            }

            ReadLinePromptReset ();
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2087, "Finished sending file %s.\n"), opt_text);
            ConnectionD (fpeer->oscar_file);
            fpeer->oscar_dc_seq++;
            event2 = QueueDequeue (fpeer, QUEUE_PEER_FILE, fpeer->oscar_dc_seq);
            if (event2)
            {
                QueueEnqueue (event2);
                QueueRetry (fpeer, QUEUE_PEER_FILE, fpeer->cont);
                return;
            }
            else
            {
                rl_log_for (cont->nick, COLCONTACT);
                rl_printf (i18n (2088, "Finished sending all %d files.\n"), fpeer->oscar_dc_seq - 1);
                ConnectionD (fpeer);
            }
        }
    }
    EventD (event);
}
Exemple #19
0
/*
 * Dispatches incoming packets on the file transfer connection.
 */
void PeerFileDispatch (Connection *fpeer)
{
    Contact *cont;
    Packet *pak;
    int err = 0;
    
    ASSERT_FILEDIRECT (fpeer);
    assert (fpeer->cont);

    cont = fpeer->cont;

    if (fpeer->connect & CONNECT_SELECT_W && UtilIOSelectIs (fpeer->sok, WRITEFDS))
    {
        fpeer->connect &= ~CONNECT_SELECT_W;
        if (fpeer->oscar_file->oscar_file_len)
            ReadLinePromptUpdate (s_sprintf ("[%s%ld:%02d%%%s] %s%s",
                          COLCONTACT, UD2UL (fpeer->oscar_file->oscar_file_done), (int)((100.0 * fpeer->oscar_file->oscar_file_done) / fpeer->oscar_file->oscar_file_len),
                          COLNONE, COLSERVER, i18n (2467, "climm>")));
        UtilIOSendTCP2 (fpeer, NULL);
        QueueRetry (fpeer, QUEUE_PEER_FILE, fpeer->cont);
        if (!UtilIOSelectIs (fpeer->sok, READFDS))
            return;
    }
    if (!(pak = UtilIOReceiveTCP2 (fpeer)))
        return;

    if (prG->verbose & DEB_PACKTCP)
        TCPPrint (pak, fpeer, FALSE);

    switch (PacketRead1 (pak))
    {
        strc_t name, text;
        UDWORD len, off, nr, speed;

        case 0:
                   PacketRead4 (pak); /* EMPTY */
            nr   = PacketRead4 (pak); /* COUNT */
            len  = PacketRead4 (pak); /* BYTES */
            speed= PacketRead4 (pak); /* SPEED */
            name = PacketReadL2Str (pak, NULL); /* NICK  */
            PacketD (pak);
            
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2161, "Receiving %ld files with total size %ld bytes at speed %lx from %s.\n"),
                     UD2UL (nr), UD2UL (len), UD2UL (speed), ConvFromCont (name, cont));
            
            if (len != fpeer->oscar_file_len)
            {
                rl_printf ("FIXME: byte len different than in file request: requested %ld, sending %ld.\n",
                           UD2UL (fpeer->oscar_file_len), UD2UL (len));
                fpeer->oscar_file_len = len;
            }
            
            pak = PeerPacketC (fpeer, 1);
            PacketWrite4 (pak, 64);
            PacketWriteLNTS (pak, cont->nick);
            PeerPacketSend (fpeer, pak);
            PacketD (pak);
            return;
        
        case 1:
            speed = PacketRead4 (pak); /* SPEED */
            name  = PacketReadL2Str (pak, NULL); /* NICK  */
            PacketD (pak);
            
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2170, "Sending file at speed %lx to %s.\n"), UD2UL (speed), s_wordquote (ConvFromCont (name, cont)));
            
            fpeer->oscar_dc_seq = 1;
            QueueRetry (fpeer, QUEUE_PEER_FILE, cont);
            return;
            
        case 2:
                   PacketRead1 (pak); /* EMPTY */
            name = PacketReadL2Str (pak, NULL);
            text = PacketReadL2Str (pak, NULL);
            len  = PacketRead4 (pak);
                   PacketRead4 (pak); /* EMPTY */
                   PacketRead4 (pak); /* SPEED */
            off  = 0;
            PacketD (pak);
            
            {
                Connection *ffile = ServerChild (fpeer->serv, fpeer->cont, TYPE_FILE);
                char buf[200], *p;
                int pos = 0;
                struct stat finfo;

                assert (ffile);
                pos = snprintf (buf, sizeof (buf), "%sfiles" _OS_PATHSEPSTR "%s" _OS_PATHSEPSTR,
                                PrefUserDir (prG), cont->screen);
                snprintf (buf + pos, sizeof (buf) - pos, "%s", ConvFromCont (name, cont));
                for (p = buf + pos; *p; p++)
                    if (*p == '/')
                        *p = '_';
                finfo.st_size = 0;
                if (!stat (buf, &finfo))
                    if ((UDWORD)finfo.st_size < len)
                        off = finfo.st_size;
                fpeer->oscar_file = ffile;
                ffile->sok = open (buf, O_CREAT | O_WRONLY | (off ? O_APPEND : O_TRUNC), 0660);
                if (ffile->sok == -1)
                {
                    int rc = errno;
                    if (rc == ENOENT)
                    {
                        mkdir (s_sprintf ("%sfiles", PrefUserDir (prG)), 0700);
                        mkdir (s_sprintf ("%sfiles" _OS_PATHSEPSTR "%s", PrefUserDir (prG), cont->screen), 0700);
                        ffile->sok = open (buf, O_CREAT | O_WRONLY | (off ? O_APPEND : O_TRUNC), 0660);
                    }
                    if (ffile->sok == -1)
                    {
                        rl_log_for (cont->nick, COLCONTACT);
                        rl_printf (i18n (2083, "Cannot open file %s: %s (%d).\n"),
                                 buf, strerror (rc), rc);
                        ConnectionD (fpeer);
                        return;
                    }
                }
                ffile->connect = CONNECT_OK;
                ffile->oscar_file_len = len;
                ffile->oscar_file_done = off;

                rl_log_for (cont->nick, COLCONTACT);
                rl_printf (i18n (2162, "Receiving file %s (%s) with %ld bytes as %s.\n"),
                         name->txt, text->txt, UD2UL (len), buf);
            }
            pak = PeerPacketC (fpeer, 3);
            PacketWrite4 (pak, off);
            PacketWrite4 (pak, 0);
            PacketWrite4 (pak, 64);
            PacketWrite4 (pak, 1);
            PeerPacketSend (fpeer, pak);
            PacketD (pak);
            return;

        case 3:
            off = PacketRead4 (pak);
                  PacketRead4 (pak); /* EMPTY */
                  PacketRead4 (pak); /* SPEED */
            nr  = PacketRead4 (pak); /* NR */
            PacketD (pak);
            
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2163, "Sending file %ld at offset %ld.\n"),
                       UD2UL (nr), UD2UL (off));
            
            err = lseek (fpeer->oscar_file->sok, off, SEEK_SET);
            if (err == -1)
            {
                err = errno;
                rl_log_for (cont->nick, COLCONTACT);
                rl_printf (i18n (2084, "Error while seeking to offset %ld: %s (%d).\n"),
                           UD2UL (off), strerror (err), err);
                TCPClose (fpeer);
                return;
            }
            fpeer->oscar_file->oscar_file_done = off;
            fpeer->oscar_file->connect = CONNECT_OK;
            
            QueueRetry (fpeer, QUEUE_PEER_FILE, cont);
            return;
            
        case 4:
            rl_log_for (cont->nick, COLCONTACT);
            rl_printf (i18n (2169, "File transfer aborted by peer (%d).\n"),
                     PacketRead1 (pak));
            PacketD (pak);
            PeerFileClose (fpeer);
            return;

        case 5:
            rl_printf ("FIXME: Ignoring speed change to %d.\n",
                     PacketRead1 (pak));
            PacketD (pak);
            return;

        case 6:
            if (fpeer->oscar_file->oscar_file_done + pak->len - 1 > fpeer->oscar_file->oscar_file_len)
            {
                rl_log_for (cont->nick, COLCONTACT);
                rl_printf (i18n (2165, "The peer sent more bytes (%ld) than the file length (%ld).\n"),
                           UD2UL (fpeer->oscar_file->oscar_file_done + pak->len - 1), UD2UL (fpeer->oscar_file->oscar_file_len));
                PacketD (pak);
                TCPClose (fpeer);
                return;
            }
            if (pak->len <= 1)
            {
                PacketD (pak);
                return;
            }
            len = write (fpeer->oscar_file->sok, pak->data + 1, pak->len - 1);
            if (len + 1 != pak->len)
            {
                rl_log_for (cont->nick, COLCONTACT);
                rl_printf (i18n (2575, "Error writing to file (%lu bytes written out of %u).\n"), UD2UL (len), pak->len - 1);
                PacketD (pak);
                TCPClose (fpeer);
                return;
            }
            fpeer->oscar_file->oscar_file_done += len;
            if (fpeer->oscar_file->oscar_file_len == fpeer->oscar_file->oscar_file_done)
            {
                ReadLinePromptReset ();
                rl_log_for (cont->nick, COLCONTACT);
                rl_print  (i18n (2166, "Finished receiving file.\n"));
#if HAVE_FSYNC
                fsync (fpeer->oscar_file->sok);
#endif
                close (fpeer->oscar_file->sok);
                fpeer->oscar_file->sok = -1;
                fpeer->oscar_file->connect = CONNECT_OK;
            }
            else if (fpeer->oscar_file->oscar_file_len)
            {
                ReadLinePromptUpdate (s_sprintf ("[%s%ld %02d%%%s] %s%s",
                              COLINCOMING, UD2UL (fpeer->oscar_file->oscar_file_done), (int)((100.0 * fpeer->oscar_file->oscar_file_done) / fpeer->oscar_file->oscar_file_len),
                              COLNONE, COLSERVER, i18n (2467, "climm>")));
            }
            PacketD (pak);
            return;
        default:
            rl_log_for (cont->nick, COLCONTACT);
            rl_print  (i18n (2167, "Error - unknown packet.\n"));
            rl_print  (s_dump (pak->data, pak->len));
            PacketD (pak);
            PeerFileClose (fpeer);
    }
    if ((prG->verbose & DEB_TCP) && err)
    {
        rl_printf ("%s %s: %d\n", s_now, i18n (2029, "Protocol error on peer-to-peer connection"), err);
        PeerFileClose (fpeer);
    }
}
/*
 * Handle tab key - start or continue tabbing
 */
static void rl_key_tab (void)
{
    str_s str = { NULL, 0, 0 };
    strc_t ins;
    const char *display;
    int i, off;
    UWORD columns;

    if (rl_tab_state == -1)
    {
        rl_insert (9);
        return;
    }

    if (!rl_tab_state)
    {
        if (!rl_ucs.len)
        {
            rl_insert ('m');
            rl_insert ('s');
            rl_insert ('g');
            rl_insert (' ');
        }
        for (i = 0; i < rl_ucspos; i++)
        {
            if (rl_ucs_at (&rl_ucs, i) == ' ')
            {
                rl_tab_index = 0;
                rl_tab_state = 1;
                rl_tab_pos = i + 1;
                rl_linecompress (&rl_temp, rl_tab_pos, rl_ucspos);
                if ((rl_tab_cont = rl_tab_getnext (&rl_temp)))
                {
                    ins = ConvTo (COLQUOTE, ENC(enc_loc));
                    s_init (&rl_colon, "", 0);
                    s_catn (&rl_colon, ins->txt, ins->len);
                    ins = ConvTo (COLNONE, ENC(enc_loc));
                    s_init (&rl_coloff, "", 0);
                    s_catn (&rl_coloff, ins->txt, ins->len);

                    while (rl_ucspos > rl_tab_pos)
                        rl_left (1), rl_tab_len++;
                    rl_tab_common = rl_tab_len;
                    break;
                }
            }
        }
        if (!rl_tab_state)
        {
            printf ("\a");
            return;
        }
    }
    else
    {
        rl_linecompress (&rl_temp, rl_tab_pos, rl_ucspos);
        rl_tab_cont = rl_tab_getnext (&rl_temp);
        rl_left (rl_tab_common);
    }
    for ( ; rl_tab_len; rl_tab_len--)
        rl_delete ();
    if (!rl_tab_cont)
    {
        printf ("\a");
        rl_tab_state = 0;
        rl_recheck (TRUE);
        return;
    }

    str.txt = rl_tab_alias ? rl_tab_alias->alias : rl_tab_cont->nick;
    str.len = strlen (str.txt);
    for (off = 0; off < str.len; )
    {
        wint_tt ucs = ConvGetUTF8 (&str, &off);
        rl_analyze_ucs (ucs, &display, &columns);
        rl_insert_basic (ucs, s_sprintf ("%s%s%s", rl_colon.txt, display, rl_coloff.txt),
                         strlen (display) + rl_colon.len + rl_coloff.len, columns & 0xff);
        rl_tab_len++;
    }
    rl_left (rl_tab_len - rl_tab_common);
    rl_recheck (TRUE);
}