Jabber WindowGram Client (JWGC)

Introduction Screenshots Installation Downloads
Documentation Browse Source Resources Project Site

Stable Version
-none-

Latest Version
beta5



Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

tty_filter.c File Reference

#include "mit-copyright.h"
#include "main.h"
#include "new_string.h"
#include "string_dictionary_aux.h"
#include "formatter.h"
#include "error.h"

Go to the source code of this file.

Data Structures

struct  _tty_str_info

Defines

#define TD_SET(k, v)
#define EXPAND(k)
#define max(a, b)   ((a)>(b)?(a):(b))

Typedefs

typedef _tty_str_info tty_str_info

Functions

int tgetent ()
char * tgetstr ()
char ** getenv ()
void tputs ()
int tty_filter_init (char *drivername, char notfirst, int *pargc, char **argv)
string tty_filter (string text, int use_fonts)

Variables

short ospeed
char PC


Define Documentation

#define EXPAND  ) 
 

Value:

(code = code_buf_pos, tputs(tmp, 1, tty_outc), \
                   *code_buf_pos++ = 0, TD_SET(k, code))

Definition at line 61 of file tty_filter.c.

Referenced by tty_filter_init().

#define max a,
 )     ((a)>(b)?(a):(b))
 

Definition at line 382 of file tty_filter.c.

Referenced by fixup_and_draw().

#define TD_SET k,
 ) 
 

Value:

(string_dictionary_Define(termcap_dict, (k), &ex)->value \
                     = (v))

Definition at line 59 of file tty_filter.c.

Referenced by tty_filter_init().


Typedef Documentation

typedef struct _tty_str_info tty_str_info
 

Referenced by tty_filter().


Function Documentation

char* * getenv  ) 
 

Referenced by eval_expr(), get_home_directory(), JCleanupSocket(), JConnect(), JSetupComm(), jVars_init(), open_display_and_load_resources(), tty_filter_init(), x_gram_init(), xode_from_file(), and xode_to_file().

int tgetent  ) 
 

Referenced by tty_filter_init().

char* tgetstr  ) 
 

Referenced by tty_filter_init().

void tputs  ) 
 

string tty_filter string  text,
int  use_fonts
 

Definition at line 441 of file tty_filter.c.

References _tty_str_info::alignment, _tty_str_info::bold_p, desctype, disp_get_cmds(), dOutput, dprintf(), free_desc(), _tty_str_info::ignore, _tty_str_info::italic_p, _tty_str_info::len, _tty_str_info::next, _tty_str_info::str, string, string_Concat2, string_Copy, string_CreateFromData, string_dictionary_Fetch(), string_Length, and tty_str_info.

00444 {
00445         string text_copy = string_Copy(text);
00446         string result_so_far = string_Copy("");
00447         desctype *desc;
00448         int number_of_strs;
00449         int number_of_lines;
00450         tty_str_info *info;
00451         int max_line_width;
00452 
00453         desc = disp_get_cmds(text_copy, &number_of_strs, &number_of_lines);
00454         info = convert_desc_to_tty_str_info(desc);
00455         free_desc(desc);
00456 
00457         max_line_width = calc_max_line_width(info);
00458         dprintf(dOutput, "max width = %d\n", max_line_width);
00459 
00460         while (info) {
00461                 string left, center, right;
00462                 int left_width, center_width, right_width;
00463                 char *temp;
00464 
00465                 left_width = center_width = right_width = 0;
00466                 left = string_Copy("");
00467                 center = string_Copy("");
00468                 right = string_Copy("");
00469 
00470                 for (; info && info->alignment != ' '; info = info->next) {
00471                         string item;
00472 
00473                         if (info->ignore)
00474                                 continue;
00475 
00476                         item = string_Copy("");
00477 
00478                         if (info->bold_p && use_fonts) {
00479                                 if ((temp = string_dictionary_Fetch(termcap_dict, "B.bold")))
00480                                         item = string_Concat2(item, temp);
00481                         }
00482                         else if (info->italic_p && use_fonts) {
00483                                 if ((temp = string_dictionary_Fetch(termcap_dict, "B.u")))
00484                                         item = string_Concat2(item, temp);
00485                         }
00486                         temp = string_CreateFromData(info->str, info->len);
00487                         item = string_Concat2(item, temp);
00488                         free(temp);
00489 
00490                         if (info->bold_p && use_fonts) {
00491                                 if ((temp = string_dictionary_Fetch(termcap_dict, "E.bold")))
00492                                         item = string_Concat2(item, temp);
00493                         }
00494                         else if (info->italic_p && use_fonts) {
00495                                 if ((temp = string_dictionary_Fetch(termcap_dict, "E.u")))
00496                                         item = string_Concat2(item, temp);
00497                         }
00498 
00499                         switch (info->alignment) {
00500                                 default:
00501                                 case 'l':
00502                                         left = string_Concat2(left, item);
00503                                         left_width += info->len;
00504                                         break;
00505 
00506                                 case 'c':
00507                                         center = string_Concat2(center, item);
00508                                         center_width += info->len;
00509                                         break;
00510 
00511                                 case 'r':
00512                                         right = string_Concat2(right, item);
00513                                         right_width += info->len;
00514                                         break;
00515                         }
00516                         free(item);
00517                 }
00518 
00519                 result_so_far = string_Concat2(result_so_far, left);
00520                 if (center_width)
00521                         while (left_width < (max_line_width - center_width) / 2) {
00522                                 result_so_far = string_Concat2(result_so_far, " ");
00523                                 left_width++;
00524                         }
00525                 result_so_far = string_Concat2(result_so_far, center);
00526                 left_width += center_width;
00527 
00528                 if (right_width)
00529                         while (left_width < max_line_width - right_width) {
00530                                 result_so_far = string_Concat2(result_so_far, " ");
00531                                 left_width++;
00532                         }
00533                 result_so_far = string_Concat2(result_so_far, right);
00534                 free(left);
00535                 free(center);
00536                 free(right);
00537 
00538                 if (info && info->alignment == ' ') {
00539                         info = info->next;
00540                         result_so_far = string_Concat2(result_so_far, "\r\n");
00541                 }
00542         }
00543 
00544         free_info(info);
00545         free(text_copy);
00546         if (number_of_lines &&
00547             (result_so_far[string_Length(result_so_far) - 1] != '\n'))
00548                 /* CRLF-terminate all results */
00549                 result_so_far = string_Concat2(result_so_far, "\r\n");
00550         return (result_so_far);
00551 }

int tty_filter_init char *  drivername,
char  notfirst,
int *  pargc,
char **  argv
 

Definition at line 74 of file tty_filter.c.

References ERROR, EXPAND, getenv(), NULL, ospeed, PC, string_dictionary, string_dictionary_binding, string_dictionary_Create(), string_dictionary_Lookup(), string_Eq, TD_SET, tgetent(), tgetstr(), and _string_dictionary_binding::value.

00079 {
00080         static char st_buf[128];
00081         char tc_buf[1024], *p = st_buf, *tmp, *term;
00082         int ex;
00083         string_dictionary_binding *b;
00084         int isrealtty = string_Eq(drivername, "tty");
00085 #ifdef HAVE_TERMIOS_H
00086         struct termios tbuf;
00087 
00088         ospeed = (tcgetattr(STDIN_FILENO, &tbuf) == 0) ? cfgetospeed(&tbuf) : 2400;
00089 #else
00090         struct sgttyb sgttyb;
00091 
00092         ospeed = (ioctl(0, TIOCGETP, &sgttyb) == 0) ? sgttyb.sg_ospeed : 2400;
00093 #endif
00094 
00095         if (termcap_dict == (string_dictionary) NULL)
00096                 termcap_dict = string_dictionary_Create(7);
00097 
00098         if (!(term = getenv("TERM"))) { /* Only use termcap if $TERM.    */
00099                 if (isrealtty && !notfirst)
00100                         /*
00101                          * only complain if initializing tty mode, and would
00102                          * be first available port
00103                          */
00104                         ERROR("$TERM not set.  tty mode will be plain.\n");
00105         }
00106 #ifdef _AIX
00107         /*
00108          * This is a temporary KLUDGE to get around the problem where some
00109          * people might start jwgc in their ~/.startup.X and it hangs on the
00110          * RISC/6000. Apparently, the call to tgetent() with the Athena
00111          * console window causes the process to get stopped on tty access.
00112          * Since the terminal type is "dumb" (set by tcsh), we can pretty
00113          * much assume there isn't anything to setup from the termcap
00114          * information.
00115          */
00116         else if (!strcmp(term, "dumb")) {
00117         }
00118 #endif
00119         else {
00120                 tgetent(tc_buf, term);
00121 
00122                 /*
00123                  * Step 1: get all of {rv,bold,u,bell,blink} that are
00124                  * available.
00125                  */
00126 
00127                 /*
00128                  * We cheat here, and ignore the padding (if any) specified
00129                  * for the mode-change strings (it's a real pain to do
00130                  * "right")
00131                  */
00132 
00133                 tmp = tgetstr("pc", &p);
00134                 PC = (tmp) ? *tmp : 0;
00135                 if ((tmp = tgetstr("md", &p))) {        /* bold ? */
00136                         EXPAND("B.bold");
00137                         tmp = tgetstr("me", &p);
00138                         EXPAND("E.bold");
00139                 }
00140                 if ((tmp = tgetstr("mr", &p))) {        /* reverse video? */
00141                         EXPAND("B.rw");
00142                         tmp = tgetstr("me", &p);
00143                         EXPAND("E.rw");
00144                 }
00145                 if ((tmp = tgetstr("bl", &p))) {        /* Bell ? */
00146                         EXPAND("B.bell");
00147                         TD_SET("E.bell", NULL);
00148                 }
00149                 if ((tmp = tgetstr("mb", &p))) {        /* Blink ? */
00150                         EXPAND("B.blink");
00151                         tmp = tgetstr("me", &p);
00152                         EXPAND("E.blink");
00153                 }
00154                 if ((tmp = tgetstr("us", &p))) {        /* Underline ? */
00155                         EXPAND("B.u");
00156                         tmp = tgetstr("ue", &p);
00157                         EXPAND("E.u");
00158                 }
00159                 if ((tmp = tgetstr("so", &p))) {        /* Standout ? */
00160                         EXPAND("B.so");
00161                         tmp = tgetstr("se", &p);
00162                         EXPAND("E.so");
00163                 }
00164         }
00165         /* Step 2: alias others to the nearest substitute */
00166 
00167         /* Bold = so, else rv, else ul */
00168         if (NULL == string_dictionary_Lookup(termcap_dict, "B.bold")) {
00169                 if ((b = string_dictionary_Lookup(termcap_dict, "B.so"))) {
00170                         TD_SET("B.bold", b->value);
00171                         TD_SET("E.bold",
00172                                string_dictionary_Lookup(termcap_dict, "E.so")->value);
00173                 }
00174                 else if ((b = string_dictionary_Lookup(termcap_dict, "B.rv"))) {
00175                         TD_SET("B.bold", b->value);
00176                         TD_SET("E.bold",
00177                                string_dictionary_Lookup(termcap_dict, "E.rv")->value);
00178                 }
00179                 else if ((b = string_dictionary_Lookup(termcap_dict, "B.u"))) {
00180                         TD_SET("B.bold", b->value);
00181                         TD_SET("E.bold",
00182                                string_dictionary_Lookup(termcap_dict, "E.u")->value);
00183                 }
00184         }
00185 
00186         /* Bell = ^G */
00187         if (NULL == string_dictionary_Lookup(termcap_dict, "B.bell")) {
00188                 TD_SET("B.bell", "\007");
00189                 TD_SET("E.bell", NULL);
00190         }
00191 
00192         /* Underline -> nothing */
00193         /* Blink -> nothing */
00194 
00195         return (0);
00196 }


Variable Documentation

short ospeed
 

Definition at line 28 of file tty_filter.c.

Referenced by tty_filter_init().

char PC
 

Definition at line 29 of file tty_filter.c.

Referenced by tty_filter_init().



Last updated at Tue Dec 18 21:07:42 PST 2007. This site and project hosted by...SourceForge.net Logo

Source Perspective by Fisheye