diff options
Diffstat (limited to 'src')
59 files changed, 5271 insertions, 749 deletions
diff --git a/src/GridText.c b/src/GridText.c index 174b29cd..f50cac68 100644 --- a/src/GridText.c +++ b/src/GridText.c @@ -1,4 +1,4 @@ -/* Character grid hypertext object +/* ** =============================== */ @@ -45,6 +45,10 @@ #include <LYexit.h> #include <LYLeaks.h> +#ifdef SH_EX /* for DEBUG (1997/10/10 (Fri) 07:58:47) */ +#define NOTUSED_BAD_FOR_SCREEN +#endif + #undef DEBUG_APPCH #ifdef SOURCE_CACHE @@ -59,12 +63,15 @@ unsigned int cached_styles[CACHEH][CACHEW]; #endif +#include <LYJustify.h> + + #ifdef USE_COLOR_STYLE_UNUSED void LynxClearScreenCache NOARGS { int i,j; - CTRACE(tfp, "flushing cached screen styles\n"); + CTRACE(tfp, "GridText: flushing cached screen styles\n"); for (i=0;i<CACHEH;i++) for (j=0;j<CACHEW;j++) cached_styles[i][j]=s_a; @@ -92,9 +99,16 @@ struct _HTStream { /* only know it as object */ ((unsigned char)(ch)&0xc0) == 0x80) extern BOOL HTPassHighCtrlRaw; -extern HTkcode kanji_code; extern HTCJKlang HTCJK; +#ifdef CJK_EX +PUBLIC HTkcode last_kcode = NOKANJI; /* 1997/11/14 (Fri) 09:09:26 */ +extern char *str_kcode(HTkcode code); +#define CHAR_WIDTH 6 +#else +#define CHAR_WIDTH 1 +#endif + /* Exports */ PUBLIC HText * HTMainText = NULL; /* Equivalent of main window */ @@ -250,6 +264,63 @@ struct _HText { PRIVATE void HText_AddHiddenLink PARAMS((HText *text, TextAnchor *textanchor)); + +#ifdef EXP_JUSTIFY_ELTS +PUBLIC BOOL can_justify_here; +PUBLIC BOOL can_justify_here_saved; + +PUBLIC BOOL can_justify_this_line;/* =FALSE if line contains form objects */ +PUBLIC int wait_for_this_stacked_elt;/* -1 if can justify contents of the + element on the op of stack. If positive - specifies minimal stack depth + plus 1 at which we can justify element (can be MAX_LINE+2 if + ok_justify ==FALSE or in psrcview. */ +PUBLIC BOOL form_in_htext;/*to indicate that we are in form (since HTML_FORM is + not stacked in the HTML.c */ +#ifdef DEBUG_JUSTIFY +PUBLIC BOOL can_justify_stack_depth;/* can be 0 or 1 if all code is correct*/ +#endif + + +typedef struct ht_run_info_ { + int byte_len; /*length in bytes*/ + int cell_len; /*length in cells*/ +} ht_run_info; + +static int justify_start_position;/* this is an index of char from which + justification can start (eg after "* " preceeding <li> text) */ + +static int ht_num_runs;/*the number of runs filled*/ +static ht_run_info ht_runs[MAX_LINE]; +static BOOL this_line_was_splitted; +static TextAnchor* last_anchor_of_previous_line; +static int justified_text_map[MAX_LINE]; /* this is a map - for each index i + it tells to which position j=justified_text_map[i] in justified text + i-th character is mapped - it's used for anchor positions fixup and for + color style's positions adjustment. */ + +PUBLIC void ht_justify_cleanup NOARGS +{ + last_anchor_of_previous_line = NULL; + this_line_was_splitted = FALSE; +} + +PUBLIC void mark_justify_start_position ARGS1(void*,text) +{ + if (text && ((HText*)text)->last_line) + justify_start_position = ((HText*)text )->last_line->size; +} + + +#define REALLY_CAN_JUSTIFY(text) ( (wait_for_this_stacked_elt<0) && \ + ( text->style->alignment == HT_LEFT || \ + text->style->alignment == HT_JUSTIFY) && \ + HTCJK == NOCJK && \ + can_justify_here && can_justify_this_line && !form_in_htext ) + +#endif /* EXP_JUSTIFY_ELTS */ + + + /* * Boring static variable used for moving cursor across */ @@ -288,6 +359,7 @@ PRIVATE int HText_TrueLineSize PARAMS(( #define CHECK_FREE_MEM #endif + #ifdef CHECK_FREE_MEM /* @@ -546,7 +618,7 @@ PUBLIC HText * HText_new ARGS1( self->LastChar = '\0'; self->IgnoreExcess = FALSE; -#ifndef PSRC_TEST +#ifndef USE_PSRC if (HTOutputFormat == WWW_SOURCE) self->source = YES; else @@ -855,7 +927,14 @@ PRIVATE int display_line ARGS2( addch('_'); i++; } else { +#if (defined(DOSPATH) || defined(WIN_EX)) && !defined(USE_SLANG) + if (LYShowColor == SHOW_COLOR_NEVER) + start_bold(); + else + start_underline(); +#else start_underline(); +#endif /* DOSPATH ... */ } break; @@ -864,7 +943,14 @@ PRIVATE int display_line ARGS2( addch('_'); i++; } else { +#if (defined(DOSPATH) || defined(WIN_EX)) && !defined(USE_SLANG) + if (LYShowColor == SHOW_COLOR_NEVER) + stop_bold(); + else + stop_underline(); +#else stop_underline(); +#endif /* DOSPATH ... */ } break; @@ -1020,7 +1106,7 @@ PRIVATE void display_title ARGS1( */ StrAllocCopy(title, (HTAnchor_title(text->node_anchor) ? - HTAnchor_title(text->node_anchor) : "")); + HTAnchor_title(text->node_anchor) : " ")); /* "" -> " " */ /* * There shouldn't be any \n in the title field, @@ -1073,7 +1159,7 @@ PRIVATE void display_title ARGS1( */ if (HTCJK != NOCJK) { if (*title && - (tmp = (unsigned char *)calloc(1, (strlen(title) + 1)))) { + (tmp = (unsigned char *)calloc(1, (strlen(title) + 256)))) { if (kanji_code == EUC) { TO_EUC((unsigned char *)title, tmp); } else if (kanji_code == SJIS) { @@ -1092,11 +1178,14 @@ PRIVATE void display_title ARGS1( } move(0, 0); clrtoeol(); +#ifdef CJK_EX + addstr(str_kcode(last_kcode)); +#endif if (text->top_of_screen > 0 && HText_hasToolbar(text)) { addch('#'); } i = (LYcols - 1) - strlen(percent) - strlen(title); - if (i > 0) { + if (i >= CHAR_WIDTH) { move(0, i); } else { /* @@ -1104,9 +1193,9 @@ PRIVATE void display_title ARGS1( * account the possibility that multibyte * characters might be present. - FM */ - if (LYcols - 2 >= (int)strlen(percent)) - title[((LYcols - 2) - strlen(percent))] = '\0'; - move(0, 1); + if ((i = ((LYcols - 2) - strlen(percent)) - CHAR_WIDTH) >= 0) + title[i] = '\0'; + move(0, CHAR_WIDTH); } addstr(title); if (percent[0] != '\0') @@ -1554,7 +1643,7 @@ PRIVATE void display_page ARGS3( if (link_dest_intl && link_dest_intl != link_dest) { CTRACE(tfp, - "display_page: unexpected typed link to %s!\n", + "GridText: display_page: unexpected typed link to %s!\n", link_dest_intl->parent->address); link_dest_intl = NULL; } @@ -1854,7 +1943,17 @@ PRIVATE void split_line ARGS2( * of our new line. - FM */ p = prevdata + split; - while ((*p == ' ' && + while (( +#ifdef EXP_JUSTIFY_ELTS + /* if justification is allowed for prev line, then raw + * HT_NON_BREAK_SPACE are still present in data[] (they'll be + * substituted at the end of this function with ' ') - VH + */ + (*p == ' ' || *p == HT_NON_BREAK_SPACE ) && +#else + (*p == ' ') && +#endif + (HeadTrim || text->first_anchor || underline_on || bold_on || text->style->alignment != HT_LEFT || @@ -1970,7 +2069,16 @@ PRIVATE void split_line ARGS2( * Economize on space. */ while ((previous->size > 0) && +#ifdef EXP_JUSTIFY_ELTS + /* if justification is allowed for prev line, then raw + * HT_NON_BREAK_SPACE are still present in data[] (they'll be + * substituted at the end of this function with ' ') - VH + */ + ((previous->data[previous->size-1] == ' ') || + (previous->data[previous->size-1] == HT_NON_BREAK_SPACE)) && +#else (previous->data[previous->size-1] == ' ') && +#endif (ctrl_chars_on_this_line || HeadTrim || text->first_anchor || underline_on || bold_on || text->style->alignment != HT_LEFT || @@ -2089,7 +2197,7 @@ PRIVATE void split_line ARGS2( (previous->styles[spare - 1].direction == ABS_ON && previous->styles[spare - 2].direction == ABS_OFF) )) { - /* + /* * Skip pairs of adjacent ON/OFF or OFF/ON changes. */ spare -= 2; @@ -2167,8 +2275,13 @@ PRIVATE void split_line ARGS2( * Align left, right or center. */ spare = 0; - if (style->alignment == HT_CENTER || - style->alignment == HT_RIGHT) { + ctrl_chars_on_previous_line = 0; /* - VH */ + if ( +#ifdef EXP_JUSTIFY_ELTS + this_line_was_splitted || +#endif + (style->alignment == HT_CENTER || + style->alignment == HT_RIGHT) ) { /* Calculate spare character positions if needed */ for (cp = previous->data; *cp; cp++) { if (*cp == LY_UNDERLINE_START_CHAR || @@ -2359,6 +2472,287 @@ PRIVATE void split_line ARGS2( } } } + +#ifdef EXP_JUSTIFY_ELTS + /* now perform justification - by VH */ + + if (this_line_was_splitted && spare ) { + /* this is the only case when we need justification*/ + char* jp = previous->data + justify_start_position; + ht_run_info* r = ht_runs; + char c; + int total_byte_len = 0, total_cell_len = 0; + int d_, r_, i, j, cur_byte_num, *m; + HTLine * jline; + char *jdata; + char *prevdata = previous->data; + + ht_num_runs = 0; + r->byte_len = r->cell_len = 0; + + for(; (c = *jp) != 0; ++jp) { + if (c == ' ') { + total_byte_len += r->byte_len; + total_cell_len += r->cell_len; + ++r; + ++ht_num_runs; + r->byte_len = r->cell_len = 0; + continue; + } + ++r->byte_len; + if ( IsSpecialAttrChar(c) ) + continue; + + ++r->cell_len; + if (c == HT_NON_BREAK_SPACE) { + *jp = ' '; /* substitute it */ + continue; + } + if (text->T.output_utf8 && !isascii(c)) { + int utf_extra = 0; + if ((c & 0xe0) == 0xc0) { + utf_extra = 1; + } else if ((c & 0xf0) == 0xe0) { + utf_extra = 2; + } else if ((c & 0xf8) == 0xf0) { + utf_extra = 3; + } else if ((c & 0xfc) == 0xf8) { + utf_extra = 4; + } else if ((c & 0xfe) == 0xfc) { + utf_extra = 5; + } else + utf_extra = 0; + if ( (int) strlen(jp+1) < utf_extra) + utf_extra = 0; + r->byte_len += utf_extra; + jp += utf_extra; + } + } + total_byte_len += r->byte_len; + total_cell_len += r->cell_len; + ++ht_num_runs; + + if (ht_num_runs != 1) { + + jline = (HTLine *)LY_CALLOC(1, LINE_SIZE(previous->size+spare)); + if (jline == NULL) + outofmem(__FILE__, "split_line_1"); + + jdata = jline->data; + + /* + * we have to spread num_spaces among (ht_num_runs-1) runs - we + * fill justified_text_map in order to apply changes caused by + * justification to anchor data and color styles, and justify + * original string on the fly + */ + d_ = spare/(ht_num_runs-1); + r_ = spare % (ht_num_runs-1); + + m = justified_text_map; + for(jp=previous->data,i=0;i<justify_start_position;++i) { + *m++ = i; + *jdata++ = ( *prevdata == HT_NON_BREAK_SPACE ? ' ' : *prevdata); + ++prevdata; + } + + cur_byte_num = i; + + for (r = ht_runs; r < ht_runs + ht_num_runs; ++r ) { + + /* copy the reference to run content */ + for(i=0; i < r->byte_len; ++i) { + *m++ = cur_byte_num++; + *jdata++ = *prevdata++; + } + if ( r - ht_runs == ht_num_runs - 1 ) { /* nop on last run */ + *jdata++ = '\0'; + break; + } + + /* the space that was in original string */ + *m++ = cur_byte_num++; + *jdata++ = ' '; + prevdata++;/* skip that space */ + + cur_byte_num += j=( d_ + ( r_-- > 0 ) ); + for (i=0; i<j; ++i) + *jdata++ = ' '; + } + *m++ = justify_start_position + total_cell_len + + spare + ht_num_runs - 1; /*map the end*/ + + text->chars += spare; + + jline->offset = previous->offset; + jline->size = previous->size + spare; + jline->split_after = previous->split_after; + jline->bullet = previous->bullet; + jline->expansion_line = previous->expansion_line; + + jline->prev = previous->prev; + jline->next = previous->next; + previous->next->prev = jline; + previous->prev->next = jline; + +#if defined(USE_COLOR_STYLE) + jline->numstyles = previous->numstyles; + + /* now copy and fix colorstyles */ + for(i = 0; i < jline->numstyles; ++i) { + jline->styles[i].style = previous->styles[i].style; + jline->styles[i].direction = previous->styles[i].direction; + jline->styles[i].previous = previous->styles[i].previous; + jline->styles[i].horizpos = justified_text_map[previous->styles[i].horizpos]; + } +#endif + /* we have to fix anchors*/ + { + /*a2 is the last anchor on the line preceeding 'previous'*/ + TextAnchor* a2 = last_anchor_of_previous_line; + + if (!a2) + a2 = text->first_anchor; + else if (a2 == text->last_anchor) + a2 = NULL; + else + a2 = a2->next; /*1st anchor on line we justify */ + + if (a2) { + for (; a2 /*&& a2->line_num == text->Lines-1*/; + last_anchor_of_previous_line = a2, a2 = a2->next) { + int oldpos = a2->line_pos, + newpos = justified_text_map[a2->line_pos], + shift = newpos - oldpos; + + if (a2->line_num == text->Lines) + break;/*new line not yet completed*/ + + if (a2->line_num == text->Lines-1) { + a2->line_pos = newpos; + a2->start += shift; + + if (!a2->extent && a2->number && + (a2->link_type & HYPERTEXT_ANCHOR) && + !a2->show_anchor && + a2->number == text->last_anchor_number) + /* seems endAnchor wasn't called for it */ { + a2 = a2->next; /*don't allow .start to be incremented + by 'spare' once more */ + break; + } + + if ( a2->extent + oldpos > (int) previous->size) + /*anchor content wrapped to new line */ + a2->extent += (jline->size - newpos) - + (previous->size - oldpos); + else + a2->extent = justified_text_map[oldpos+a2->extent] + - newpos; + + } else { + /* This is the anchor that was started on previous + * line. Its .line_pos and .start were updated. + * So we have to update only extent. If anchor + * text is longer than two lines, we don't bother + * setting it to correct value. + */ + if (a2->line_num != text->Lines-2) + continue; /* don't bother */ + if (!a2->extent && a2->number && + (a2->link_type & HYPERTEXT_ANCHOR) && + !a2->show_anchor && + a2->number == text->last_anchor_number) + /* seems endAnchor wasn't called for it */ + continue; + /* anchor is started at text->Lines-2, and there + * are two cases - either it was wrapped to newline + * or it ended in previous text->Lines-1. + */ + { + int p2sz = previous->prev->size, + p1sz = previous->size, + onp2sz = p2sz - a2->line_pos, + onp1sz = a2->extent - 1 - onp2sz; + + if (onp1sz >= p1sz) + /* this anchor will be skipped at the next + * split_line here, since its line_num will + * be text->Lines-3 + */ + a2->extent += spare; + else { + a2->extent += justified_text_map[onp1sz-1] + - onp1sz + 1; + } + } + + } + + } + + /* iterate on anchors in the last line */ + for (; a2; a2 = a2->next) + a2->start += spare; + } + } + + FREE(previous); + + } else { /* (ht_num_runs==1) */ + /* keep maintaining 'last_anchor_of_previous_line' */ + TextAnchor* a2 = last_anchor_of_previous_line; + if (!a2) + a2 = text->first_anchor; + else if (a2 == text->last_anchor) + a2 = NULL; + else + a2 = a2->next; /* 1st anchor on line we justify */ + + if (a2) + for (; a2 && a2->line_num <= text->Lines-1; + last_anchor_of_previous_line = a2, a2 = a2->next); + } + } else { + if (REALLY_CAN_JUSTIFY(text) ) { + char* p; + + /* it was permitted to justify line, but this function was called + * to end paragraph - we must subsitute HT_NON_BREAK_SPACEs with + * spaces in previous line + */ + if (line->size) { + CTRACE(tfp,"justification: shouldn't happen - new line is not empty!\n"); + } + + for (p=previous->data;*p;++p) + if (*p == HT_NON_BREAK_SPACE) + *p = ' '; + } + + /* HT_NON_BREAK_SPACEs were subsituted with spaces in + HText_appendCharacter */ + { + /* keep maintaining 'last_anchor_of_previous_line' */ + TextAnchor* a2 = last_anchor_of_previous_line; + if (!a2) + a2 = text->first_anchor; + else if (a2 == text->last_anchor) + a2 = NULL; + else + a2 = a2->next; /*1st anchor on line we justify */ + + if (a2) + for (; a2 && a2->line_num <= text->Lines-1; + last_anchor_of_previous_line = a2, a2 = a2->next); + } + } + + /* cleanup */ + can_justify_this_line = TRUE; + justify_start_position = 0; + this_line_was_splitted = FALSE; +#endif } /* split_line */ @@ -2439,6 +2833,10 @@ PUBLIC void HText_appendCharacter ARGS2( int indent; #ifdef DEBUG_APPCH +#ifdef CJK_EX + static unsigned char save_ch = 0; +#endif + if (TRACE) { char * special = NULL; /* make trace a little more readable */ switch(ch) { @@ -2475,8 +2873,28 @@ PUBLIC void HText_appendCharacter ARGS2( CTRACE(tfp, "add(%s %d special char) %d/%d\n", special, ch, HTisDocumentSource(), HTOutputFormat != WWW_SOURCE); } else { - CTRACE(tfp, "add(%c) %d/%d\n", ch, - HTisDocumentSource(), HTOutputFormat != WWW_SOURCE); +#ifdef CJK_EX /* 1998/08/30 (Sun) 13:26:23 */ + if (save_ch == 0) { + if (IS_SJIS_HI1(ch) || IS_SJIS_HI2(ch)) { + save_ch = ch; + } else { + CTRACE(tfp, "add(%c) %d/%d\n", ch, + HTisDocumentSource(), HTOutputFormat != WWW_SOURCE); + } + } else { + CTRACE(tfp, "add(%c%c) %d/%d\n", save_ch, ch, + HTisDocumentSource(), HTOutputFormat != WWW_SOURCE); + save_ch = 0; + } +#else + if (ch < 0x80) { + CTRACE(tfp, "add(%c) %d/%d\n", ch, + HTisDocumentSource(), HTOutputFormat != WWW_SOURCE); + } else { + CTRACE(tfp, "add(%02x) %d/%d\n", ch, + HTisDocumentSource(), HTOutputFormat != WWW_SOURCE); + } +#endif /* CJK_EX */ } } /* trace only */ #endif /* DEBUG_APPCH */ @@ -2642,9 +3060,19 @@ PUBLIC void HText_appendCharacter ARGS2( } else { text->kanji_buf = '\216'; ch |= 0200; +#ifdef SH_EX + /**** Add Next Line by patakuti ****/ + text->permissible_split = (int)text->last_line->size; + { + unsigned char hi, low; + JISx0201TO0208_EUC(0x8e, ch, &hi, &low); + text->kanji_buf = hi; + ch = low; } - break; +#endif } + break; + } /* end switch */ if (!text->kanji_buf) { if ((ch & 0200) != 0) { @@ -2653,7 +3081,8 @@ PUBLIC void HText_appendCharacter ARGS2( */ if ((text->kcode == SJIS) && ((unsigned char)ch >= 0xA1) && - ((unsigned char)ch <= 0xDF)) { + ((unsigned char)ch <= 0xDF)) + { unsigned char c = (unsigned char)ch; unsigned char kb = (unsigned char)text->kanji_buf; JISx0201TO0208_SJIS(c, @@ -2661,6 +3090,8 @@ PUBLIC void HText_appendCharacter ARGS2( (unsigned char *)&c); ch = (char)c; text->kanji_buf = kb; + /* 1998/01/19 (Mon) 09:06:15 */ + text->permissible_split = (int)text->last_line->size; } else { text->kanji_buf = ch; /* @@ -2677,9 +3108,20 @@ PUBLIC void HText_appendCharacter ARGS2( return; } +#ifdef CJK_EX /* MOJI-BAKE Fix! 1997/10/12 -- 10/31 (Fri) 00:22:57 - JH7AYN */ + if (ch == LY_BOLD_START_CHAR || ch == LY_BOLD_END_CHAR) { + text->permissible_split = (int)line->size; /* Can split here */ + if (HTCJK == JAPANESE) + text->kcode = NOKANJI; + } +#endif + if (IsSpecialAttrChar(ch) && ch != LY_SOFT_NEWLINE) { -#ifndef USE_COLOR_STYLE +#if !defined(USE_COLOR_STYLE) || !defined(NO_DUMP_WITH_BACKSPACES) if (line->size >= (MAX_LINE-1)) return; +#if defined(USE_COLOR_STYLE) && !defined(NO_DUMP_WITH_BACKSPACES) + if (with_backspaces && HTCJK==NOCJK && !text->T.output_utf8) { +#endif if (ch == LY_UNDERLINE_START_CHAR) { line->data[line->size++] = LY_UNDERLINE_START_CHAR; line->data[line->size] = '\0'; @@ -2730,6 +3172,12 @@ PUBLIC void HText_appendCharacter ARGS2( return; } } +#if defined(USE_COLOR_STYLE) && !defined(NO_DUMP_WITH_BACKSPACES) + } /* if (with_backspaces && HTCJK==HTNOCJK && !text->T.output_utf8) */ + else + return; +#endif + #else return; #endif @@ -2767,6 +3215,15 @@ PUBLIC void HText_appendCharacter ARGS2( if (ch == HT_EN_SPACE) ch = ' '; +#ifdef SH_EX /* 1997/11/01 (Sat) 12:08:54 */ + if (ch == 0x0b) { /* ^K ??? */ + ch = '\r'; + } + if (ch == 0x1a) { /* ^Z ??? */ + ch = '\r'; + } +#endif + /* * I'm going to cheat here in a BIG way. Since I know that all * \r's will be trapped by HTML_put_character I'm going to use @@ -2898,6 +3355,10 @@ check_IgnoreExcess: 1 : 0))) >= (LYcols - 1)) { if (style->wordWrap && HTOutputFormat != WWW_SOURCE) { +#ifdef EXP_JUSTIFY_ELTS + if (REALLY_CAN_JUSTIFY(text)) + this_line_was_splitted=TRUE; +#endif split_line(text, text->permissible_split); if (ch == ' ') return; /* Ignore space causing split */ @@ -2916,7 +3377,14 @@ check_IgnoreExcess: * For normal stuff like pre let's go ahead and * wrap so the user can see all of the text. */ - new_line(text); + + if ( (dump_output_immediately|| (crawl && traversal) ) + && dont_wrap_pre) { + if ((int)line->size >= (int)(MAX_LINE-1)) + new_line(text); + } else + new_line(text); + } } else if ((int)line->size >= (int)(MAX_LINE-1)) { /* @@ -2928,18 +3396,93 @@ check_IgnoreExcess: /* * Insert normal characters. */ - if (ch == HT_NON_BREAK_SPACE) { + if (ch == HT_NON_BREAK_SPACE +#ifdef EXP_JUSTIFY_ELTS + && !REALLY_CAN_JUSTIFY(text) +#endif + ) ch = ' '; - } + /* we leave raw HT_NON_BREAK_SPACE otherwise (we'll substitute it later) */ if (ch & 0x80) text->have_8bit_chars = YES; + /* + * Kanji charactor handling. + */ { HTFont font = style->font; unsigned char hi, lo, tmp[2]; line = text->last_line; /* May have changed */ + +#ifdef CJK_EX /* 1997/11/14 (Fri) 09:10:03 */ + if (HTCJK != NOCJK && text->kanji_buf) { + hi = (unsigned char)text->kanji_buf; + lo = (unsigned char)ch; + + if (HTCJK == JAPANESE) { + if (text->kcode == NOKANJI) + { + if (IS_SJIS(hi, lo, text->in_sjis) && IS_EUC(hi, lo)) { + text->kcode = NOKANJI; + } else if (IS_SJIS(hi, lo, text->in_sjis)) { + text->kcode = SJIS; + } else if (IS_EUC(hi, lo)) { + text->kcode = EUC; + } + } + + switch (kanji_code) { + case EUC: + if (text->kcode == SJIS) { + SJIS_TO_EUC1(hi, lo, tmp); + line->data[line->size++] = tmp[0]; + line->data[line->size++] = tmp[1]; + } else if (text->kcode == EUC) { + JISx0201TO0208_EUC(hi, lo, &hi, &lo); + line->data[line->size++] = hi; + line->data[line->size++] = lo; + } + break; + + case SJIS: + if (last_kcode != SJIS && text->kcode == EUC) + { + EUC_TO_SJIS1(hi, lo, tmp); + line->data[line->size++] = tmp[0]; + line->data[line->size++] = tmp[1]; + } else { + /* text->kcode == (SJIS or NOKANJI) */ +#ifdef CJK_EX /* 1998/01/20 (Tue) 16:46:34 */ + if (last_kcode == EUC) { + if (lo == 0) { /* BAD EUC code */ + hi = '='; + lo = '='; + } else if (hi == 0x8e) { + text->kcode = NOKANJI; + JISx0201TO0208_EUC(hi, lo, &hi, &lo); + EUC_TO_SJIS1(hi, lo, tmp); + hi = tmp[0]; + lo = tmp[1]; + } + } +#endif + line->data[line->size++] = hi; + line->data[line->size++] = lo; + } + break; + + default: + break; + } + } else { + line->data[line->size++] = hi; + line->data[line->size++] = lo; + } + text->kanji_buf = 0; + } +#else if (HTCJK != NOCJK && text->kanji_buf) { hi = (unsigned char)text->kanji_buf, lo = (unsigned char)ch; if (HTCJK == JAPANESE && text->kcode == NOKANJI) { @@ -2971,7 +3514,9 @@ check_IgnoreExcess: line->data[line->size++] = lo; } text->kanji_buf = 0; - } else if (HTCJK != NOCJK) { + } +#endif + else if (HTCJK != NOCJK) { line->data[line->size++] = (kanji_code != NOKANJI) ? ch : (font & HT_CAPITALS) ? @@ -3113,7 +3658,7 @@ PUBLIC int HText_beginAnchor ARGS3( */ if ((a->number > 0) && (keypad_mode == LINKS_ARE_NUMBERED || - keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED)) { + keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED)) { char saved_lastchar = text->LastChar; int saved_linenum = text->Lines; sprintf(marker,"[%d]", a->number); @@ -3163,7 +3708,7 @@ PUBLIC void HText_endAnchor ARGS2( } } - CTRACE(tfp, "HText_endAnchor: number:%d link_type:%d\n", + CTRACE(tfp, "GridText:HText_endAnchor: number:%d link_type:%d\n", a->number, a->link_type); if (a->link_type == INPUT_ANCHOR) { /* @@ -3181,7 +3726,7 @@ PUBLIC void HText_endAnchor ARGS2( int i, j, k, l; BOOL remove_numbers_on_empty = ((keypad_mode == LINKS_ARE_NUMBERED || - keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) && + keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) && (text->hiddenlinkflag != HIDDENLINKS_MERGE || (LYNoISMAPifUSEMAP && !(text->node_anchor && text->node_anchor->bookmark) && @@ -3672,8 +4217,7 @@ PUBLIC void HText_endAppend ARGS1( while (text->last_line->data[0] == '\0' && text->Lines > 2) { HTLine *next_to_the_last_line = text->last_line->prev; - - CTRACE(tfp, "GridText: Removing bottom blank line: %s\n", + CTRACE(tfp, "GridText: Removing bottom blank line: `%s'\n", text->last_line->data); /* * line_ptr points to the first line. @@ -3683,7 +4227,7 @@ PUBLIC void HText_endAppend ARGS1( FREE(text->last_line); text->last_line = next_to_the_last_line; text->Lines--; - CTRACE(tfp, "GridText: New bottom line: %s\n", + CTRACE(tfp, "GridText: New bottom line: `%s'\n", text->last_line->data); } @@ -3733,7 +4277,7 @@ PUBLIC void HText_trimHightext ARGS2( return; CTRACE(tfp, "Gridtext: Entering HText_trimHightext %s\n", - final ? "(final)" : "(partial)"); + final ? "(final)" : "(partial)"); /* * Get the first line. @@ -3825,8 +4369,7 @@ re_parse: } anchor_ptr->start += cur_shift; - CTRACE(tfp, "anchor text: '%s'\n", - line_ptr->data); + CTRACE(tfp, "anchor text: '%s'\n", line_ptr->data); /* * If the link begins with an end of line and we have more * lines, then start the highlighting on the next line. - FM @@ -5582,6 +6125,11 @@ PUBLIC void print_wwwfile_to_fd ARGS2( register int i; int first = TRUE; HTLine * line; +#ifndef NO_DUMP_WITH_BACKSPACES + HText* text = HTMainText; + BOOL in_b=FALSE,in_u=FALSE, + bs=text && with_backspaces && HTCJK==NOCJK && !text->T.output_utf8; +#endif if (!HTMainText) return; @@ -5612,6 +6160,17 @@ PUBLIC void print_wwwfile_to_fd ARGS2( */ for (i = 0; line->data[i] != '\0'; i++) { if (!IsSpecialAttrChar(line->data[i])) { +#ifndef NO_DUMP_WITH_BACKSPACES + if (in_b) { + fputc(line->data[i], fp); + fputc('\b',fp); + fputc(line->data[i], fp); + } else if (in_u) { + fputc('_',fp); + fputc('\b',fp); + fputc(line->data[i], fp); + } else +#endif fputc(line->data[i], fp); } else if (line->data[i] == LY_SOFT_HYPHEN && line->data[i + 1] == '\0') { /* last char on line */ @@ -5636,6 +6195,27 @@ PUBLIC void print_wwwfile_to_fd ARGS2( break; } } +#ifndef NO_DUMP_WITH_BACKSPACES + else if (bs) { + switch (line->data[i]) { + case LY_UNDERLINE_START_CHAR: + if (!in_b) + in_u = TRUE; /*favor bold over underline*/ + break; + case LY_UNDERLINE_END_CHAR: + in_u = FALSE; + break; + case LY_BOLD_START_CHAR: + if (in_u) + in_u = FALSE; /* turn it off*/ + in_b = TRUE; + break; + case LY_BOLD_END_CHAR: + in_b = FALSE; + break; + } + } +#endif } if (line == HTMainText->last_line) @@ -5663,6 +6243,12 @@ PUBLIC void print_crawl_to_fd ARGS3( register int i; int first = TRUE; HTLine * line; +#ifndef NO_DUMP_WITH_BACKSPACES + HText* text = HTMainText; + BOOL in_b=FALSE,in_u=FALSE, + bs=text && with_backspaces && HTCJK==NOCJK && !text->T.output_utf8; +#endif + if (!HTMainText) return; @@ -5704,6 +6290,28 @@ PUBLIC void print_crawl_to_fd ARGS3( fputc('-', fp); } } +#ifndef NO_DUMP_WITH_BACKSPACES + else if (bs) { + switch (line->data[i]) { + case LY_UNDERLINE_START_CHAR: + if (!in_b) + in_u = TRUE; /*favor bold over underline*/ + break; + case LY_UNDERLINE_END_CHAR: + in_u = FALSE; + break; + case LY_BOLD_START_CHAR: + if (in_u) + in_u = FALSE; /* turn it off*/ + in_b = TRUE; + break; + case LY_BOLD_END_CHAR: + in_b = FALSE; + break; + } + } +#endif + } if (line == HTMainText->last_line) { @@ -5717,7 +6325,7 @@ PUBLIC void print_crawl_to_fd ARGS3( */ if ((nolist == FALSE) && (keypad_mode == LINKS_ARE_NUMBERED || - keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED)) { + keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED)) { printlist(fp,FALSE); } @@ -6969,7 +7577,7 @@ PRIVATE char * HText_skipOptionNumPrefix ARGS1( /* * Check if we are in the correct keypad mode. */ - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { /* * Skip the option number embedded in the option name so the * extra chars won't mess up cgi scripts processing the value. @@ -7057,7 +7665,7 @@ PUBLIC char * HText_setLastOptionValue ARGS7( cp++; if (HTCurSelectGroupType == F_RADIO_TYPE && LYSelectPopups && - keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { /* * Collapse any space between the popup option * prefix and actual value. - FM @@ -7162,6 +7770,10 @@ PUBLIC char * HText_setLastOptionValue ARGS7( if (HTCJK != NOCJK) { if (cp && (tmp = (unsigned char *)calloc(1, strlen(cp)+1))) { +#ifdef SH_EX + if (tmp == NULL) + outofmem(__FILE__, "HText_setLastOptionValue"); +#endif if (kanji_code == EUC) { TO_EUC((unsigned char *)cp, tmp); val_cs = current_char_set; @@ -7296,7 +7908,7 @@ PUBLIC int HText_beginInput ARGS3( unsigned char *tmp = NULL; int i, j; - CTRACE(tfp,"Entering HText_beginInput\n"); + CTRACE(tfp, "GridText: Entering HText_beginInput\n"); if (a == NULL || f == NULL) outofmem(__FILE__, "HText_beginInput"); @@ -7380,6 +7992,10 @@ PUBLIC int HText_beginInput ARGS3( StrAllocCopy(IValue, I->value); if (IValue && HTCJK != NOCJK) { if ((tmp = (unsigned char *)calloc(1, (strlen(IValue) + 1)))) { +#ifdef SH_EX + if (tmp == NULL) + outofmem(__FILE__, "HText_beginInput"); +#endif if (kanji_code == EUC) { TO_EUC((unsigned char *)IValue, tmp); I->value_cs = current_char_set; @@ -7643,13 +8259,13 @@ PUBLIC int HText_beginInput ARGS3( break; default: - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) a->number = ++(text->last_anchor_number); else a->number = 0; break; } - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED && a->number > 0) { + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED && a->number > 0) { char marker[16]; if (f->type != F_OPTION_LIST_TYPE) @@ -7698,7 +8314,7 @@ PUBLIC int HText_beginInput ARGS3( * If we are numbering form links, take that into * account as well. - FM */ - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) MaximumSize -= ((a->number/10) + 3); if (f->size > MaximumSize) f->size = MaximumSize; @@ -8254,9 +8870,9 @@ PUBLIC int HText_SubmitForm ARGS4( CTRACE(tfp, "I'd submit %s (from %s), but you've not finished it\n", form_ptr->value, form_ptr->name); name_used = (form_ptr->name ? form_ptr->name : ""); val_used = (form_ptr->value ? form_ptr->value : ""); - break; + break; #endif - + /* fall through */ case F_RADIO_TYPE: case F_CHECKBOX_TYPE: @@ -8491,7 +9107,7 @@ PUBLIC int HText_SubmitForm ARGS4( cdisp_name_startpos = strlen(escaped1); StrAllocCat(escaped1, name_used); StrAllocCat(escaped1, "; filename=\""); - StrAllocCat(escaped1, val_used); + StrAllocCat(escaped1, val_used); StrAllocCat(escaped1, "\""); if (MultipartContentType) { StrAllocCat(escaped1, MultipartContentType); @@ -8768,7 +9384,7 @@ PUBLIC int HText_SubmitForm ARGS4( } else { /* * This is a continuation of a previous textarea - * add %0a (\n) and the escaped string. + * add %0d%0a (\r\n) and the escaped string. */ if (escaped2[0] != '\0') { if (previous_blanks) { @@ -8780,7 +9396,7 @@ PUBLIC int HText_SubmitForm ARGS4( } else if (Boundary) { HTSprintf(&query, "%s\r\n", escaped2); } else { - HTSprintf(&query, "%%0a%s", escaped2); + HTSprintf(&query, "%%0d%%0a%s", escaped2); } } else { if (PlainText) { @@ -8788,7 +9404,7 @@ PUBLIC int HText_SubmitForm ARGS4( } else if (Boundary) { StrAllocCat(previous_blanks, "\r\n"); } else { - StrAllocCat(previous_blanks, "%0a"); + StrAllocCat(previous_blanks, "%0d%0a"); } } } @@ -8872,7 +9488,7 @@ PUBLIC int HText_SubmitForm ARGS4( StrAllocCopy(query, ""); } FREE(previous_blanks); - + CTRACE(tfp, "QUERY (%d) >> \n%s\n", strlen(query), query); if (submit_item->submit_method == URL_MAIL_METHOD) { @@ -9227,9 +9843,12 @@ PUBLIC void HText_setKcode ARGS3( ** appropriately. - FM */ if (!strcmp(charset, "shift_jis") || - !strcmp(charset, "x-shift-jis")) { + !strcmp(charset, "x-sjis") || /* 1997/11/28 (Fri) 18:11:33 */ + !strcmp(charset, "x-shift-jis")) + { text->kcode = SJIS; } else if ((p_in && (p_in->enc == UCT_ENC_CJK)) || + !strcmp(charset, "x-euc") || /* 1997/11/28 (Fri) 18:11:24 */ !strcmp(charset, "euc-jp") || !strncmp(charset, "x-euc-", 6) || !strcmp(charset, "iso-2022-jp") || @@ -9248,7 +9867,11 @@ PUBLIC void HText_setKcode ARGS3( ** If we get to here, it's not CJK, so disable that if ** it is enabled. But only if we are quite sure. - FM & kw */ +#ifdef CJK_EX + last_kcode = text->kcode = NOKANJI; +#else text->kcode = NOKANJI; +#endif if (HTCJK != NOCJK) { if (!p_in || p_in->enc != UCT_ENC_CJK) HTCJK = NOCJK; @@ -9830,7 +10453,7 @@ PRIVATE void insert_new_textarea_anchor ARGS2( l->numstyles = htline->numstyles; #endif strcpy (l->data, htline->data); - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { a->number++; increment_tagged_htline (l, a, &lx, &curr_tag, 1, CHOP); } @@ -9883,10 +10506,10 @@ PRIVATE void update_subsequent_anchors ARGS4( HTLine *htline = start_htline; int form_chars_added = (start_anchor->input_field->size + 1) * n; - int line_adj = 0; - int tag_adj = 0; - int lx = 0; - int hang = 0; /* for HANG detection of a nasty intermittent */ + int line_adj = 0; + int tag_adj = 0; + int lx = 0; + int hang = 0; /* for HANG detection of a nasty intermittent */ int hang_detect = 100000; /* ditto */ @@ -9902,7 +10525,7 @@ PRIVATE void update_subsequent_anchors ARGS4( */ anchor = start_anchor->next; /* begin updating with the NEXT anchor */ while (anchor) { - if ((keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) && + if ((keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) && (anchor->number != 0)) anchor->number += n; anchor->line_num += n; @@ -9940,7 +10563,7 @@ PRIVATE void update_subsequent_anchors ARGS4( * relocating an anchor to the following line, when [tag] digits * expansion pushes things too far in that direction.] */ - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { anchor = start_anchor->next; while (htline != HTMainText->last_line->next) { @@ -10897,6 +11520,21 @@ PUBLIC void HTMark_asSource NOARGS } #endif +#ifdef CJK_EX +PUBLIC HTkcode HText_getKcode ARGS1( + HText *, text) +{ + return text->kcode; +} + +PUBLIC void HText_updateKcode ARGS2( + HText *, text, + HTkcode, kcode) +{ + text->kcode = kcode; +} +#endif + PUBLIC int HTMainText_Get_UCLYhndl NOARGS { return (HTMainText ? HTMainText->node_anchor->UCStages->s[0].C.UChndl : 0); diff --git a/src/GridText.h b/src/GridText.h index a26f709a..b8705e7a 100644 --- a/src/GridText.h +++ b/src/GridText.h @@ -47,6 +47,13 @@ #define NOCHOP 0 #define CHOP 1 +#define TABSTOP 8 +#define SPACES " " /* must be at least TABSTOP spaces long */ +#define SPLAT '.' + +#define NOCHOP 0 +#define CHOP 1 + /* just for information: US-ASCII control characters <32 which are not defined in Unicode standard =00 U+0000 NULL @@ -286,4 +293,14 @@ extern void HTMark_asSource NOPARAMS; extern int HTMainText_Get_UCLYhndl NOPARAMS; +#ifdef CJK_EX + +#include <HTCJK.h> +extern HTkcode last_kcode; + +extern HTkcode HText_getKcode PARAMS((HText * text)); +extern void HText_updateKcode PARAMS((HText * text, HTkcode kcode)); + +#endif + #endif /* LYGRIDTEXT_H */ diff --git a/src/HTAlert.c b/src/HTAlert.c index 29abf7c1..0730e8a5 100644 --- a/src/HTAlert.c +++ b/src/HTAlert.c @@ -22,6 +22,10 @@ #include <LYLeaks.h> +#if _WIN_CC +#include <HTParse.h> +#endif + /* Issue a message about a problem. HTAlert() ** -------------------------------- */ @@ -106,6 +110,53 @@ PUBLIC void HTUserMsg2 ARGS2( } } +#ifdef WIN_EX /* 1997/10/28 (Tue) 17:19:43 */ + +#define MAX_LEN 512 + +void ws_title(CONST char *str) +{ + char buff[MAX_LEN]; + char *p; + int len; + +#define TITLE_CUT 32 + + p = (char *)str; + len = strlen(p); + if (len > (MAX_LEN - 1)) { + strncpy(buff, p, (MAX_LEN - 1)); + len = MAX_LEN - 1; + buff[MAX_LEN - 1] = '\0'; + } else { + strcpy(buff, p); + } + + if (len > LYcols) { + buff[TITLE_CUT] = '.'; + buff[TITLE_CUT+1] = '.'; + strcpy(buff + TITLE_CUT + 2, (buff + len) - LYcols + TITLE_CUT + 1); + } + if (strchr(buff, '%')) { + HTUnEscape(buff); + } + + p = buff; + while (*p++) { + if (*p == '\r') { + *p = '\0'; + break; + } else if (*p == '\n') { + *p = '\0'; + break; + } + } + + /* Quick hack. buff is SJIS only ??? */ + SetConsoleTitle(buff); +} +#endif + /* Issue a progress message. HTProgress() ** ------------------------- */ @@ -115,6 +166,12 @@ PUBLIC void HTProgress ARGS1( statusline(Msg); LYstore_message(Msg); CTRACE(tfp, "%s\n", Msg); +#if defined(SH_EX) && defined(WIN_EX) /* 1997/10/11 (Sat) 12:51:02 */ + { + if (debug_delay != 0) + Sleep(debug_delay); /* XXX msec */ + } +#endif } /* Issue a read-progress message. HTReadProgress() @@ -124,6 +181,67 @@ PUBLIC void HTReadProgress ARGS2( long, bytes, long, total) { +#ifdef WIN_EX /* 1998/07/08 (Wed) 16:09:47 */ + +#include <sys/timeb.h> +#define kb_units 1024L + static double now, first, last; + static long bytes_last; + + double transfer_rate; + char line[80]; + struct timeb tb; + char *units = "bytes"; + + ftime(&tb); + now = tb.time + (double)tb.millitm / 1000; + + if (bytes == 0) { + first = last = now; + bytes_last = bytes; + } else if ((bytes > 0) && (now > first)) { + transfer_rate = (double)bytes / (now - first); /* bytes/sec */ + + if (now != last) { + last = now; + bytes_last = bytes; + } + if (total >= kb_units || bytes >= kb_units) { + if (total > 0) + total /= 1024; + bytes /= 1024; + units = "KB"; + } + + if (total > 0) + sprintf (line, "Read %3d%%, %ld of %ld %s.", + (int) (bytes * 100 / total), bytes, total, units); + else + sprintf (line, "Read %ld %s of data.", bytes, units); + + if (transfer_rate > 0.0) { + int n; + n = strlen(line); + if (LYshow_kb_rate) { + sprintf (line + n, " %6.2lf KB/sec.", transfer_rate / 1024.0); + } else { + int t_rate; + + t_rate = (int)transfer_rate; + if (t_rate < 1000) + sprintf (line + n, " %6d bytes/sec.", t_rate); + else + sprintf (line + n, " %6d,%03d bytes/sec.", + t_rate / 1000, t_rate % 1000); + } + } + if (total < 0) { + if (total < -1) + strcat(line, " (Press 'z' to abort)"); + } + _HTProgress(line); + } +#else static long kb_units = 1024; static time_t first, last; static long bytes_last; @@ -186,6 +304,7 @@ PUBLIC void HTReadProgress ARGS2( CTRACE(tfp, "%s\n", line); } } +#endif } PRIVATE BOOL conf_cancelled = NO; /* used by HTConfirm only - kw */ diff --git a/src/HTFWriter.c b/src/HTFWriter.c index 7211c3ef..fd1f4bd5 100644 --- a/src/HTFWriter.c +++ b/src/HTFWriter.c @@ -13,6 +13,11 @@ #include <HTFWriter.h> #include <HTSaveToFile.h> +#if _WIN_CC +#include <HTParse.h> +extern int exec_command(char * cmd, int wait_flag); /* xsystem.c */ +#endif + #include <HTFormat.h> #include <UCDefs.h> #include <HTAlert.h> @@ -80,7 +85,8 @@ struct _HTStream { */ PRIVATE void HTFWriter_put_character ARGS2(HTStream *, me, char, c) { - putc(c, me->fp); + if (me->fp) + putc(c, me->fp); } /* String handling @@ -90,7 +96,8 @@ PRIVATE void HTFWriter_put_character ARGS2(HTStream *, me, char, c) */ PRIVATE void HTFWriter_put_string ARGS2(HTStream *, me, CONST char*, s) { - fputs(s, me->fp); + if (me->fp) + fputs(s, me->fp); } /* Buffer write. Buffers can (and should!) be big. @@ -98,7 +105,8 @@ PRIVATE void HTFWriter_put_string ARGS2(HTStream *, me, CONST char*, s) */ PRIVATE void HTFWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l) { - fwrite(s, 1, l, me->fp); + if (me->fp) + fwrite(s, 1, l, me->fp); } @@ -119,8 +127,14 @@ PRIVATE void HTFWriter_free ARGS1(HTStream *, me) char *addr = NULL; int status; BOOL use_gzread = NO; +#ifdef WIN_EX + HANDLE cur_handle; + + cur_handle = GetForegroundWindow(); +#endif - fflush(me->fp); + if (me->fp) + fflush(me->fp); if (me->end_command) { /* Temp file */ LYCloseTempFP(me->fp); #ifdef VMS @@ -294,16 +308,29 @@ PRIVATE void HTFWriter_free ARGS1(HTStream *, me) * Tell user what's happening. - FM */ HTProgress(me->end_command); +#ifndef WIN_EX stop_curses(); +#endif } +#ifdef _WIN_CC + exec_command(me->end_command, FALSE); +#else LYSystem(me->end_command); - +#endif if (me->remove_command) { /* NEVER REMOVE THE FILE unless during an abort!!!*/ FREE(me->remove_command); } - if (!dump_output_immediately) + if (!dump_output_immediately) { +#ifdef WIN_EX + if (focus_window) { + HTInfoMsg("Set focus1"); + status = SetForegroundWindow(cur_handle); + } +#else start_curses(); +#endif + } } else status = HTLoadFile(addr, me->anchor, @@ -337,16 +364,30 @@ PRIVATE void HTFWriter_free ARGS1(HTStream *, me) * Tell user what's happening. - FM */ _HTProgress(me->end_command); +#ifndef WIN_EX stop_curses(); +#endif } +#ifdef _WIN_CC + exec_command(me->end_command, FALSE); +#else LYSystem(me->end_command); +#endif if (me->remove_command) { /* NEVER REMOVE THE FILE unless during an abort!!!*/ FREE(me->remove_command); } - if (!dump_output_immediately) + if (!dump_output_immediately) { +#ifdef WIN_EX + if (focus_window) { + HTInfoMsg("Set focus2"); + status = SetForegroundWindow(cur_handle); + } +#else start_curses(); +#endif + } } else { /* * It's a file we saved to disk for handling @@ -356,6 +397,16 @@ PRIVATE void HTFWriter_free ARGS1(HTStream *, me) /* NEVER REMOVE THE FILE unless during an abort!!!*/ FREE(me->remove_command); } + if (!dump_output_immediately) { +#ifdef WIN_EX + if (focus_window) { + HTInfoMsg("Set focus3"); + status = SetForegroundWindow(cur_handle); + } +#else + start_curses(); +#endif + } } FREE(me->end_command); } @@ -466,7 +517,6 @@ PUBLIC HTStream* HTSaveAndExecute ARGS3( LYCancelledFetch = TRUE; return(NULL); } - #if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS) if (pres->quality == 999.0) { /* exec link */ if (dump_output_immediately) { @@ -510,6 +560,56 @@ PUBLIC HTStream* HTSaveAndExecute ARGS3( if (LYCachedTemp(fnam, &(anchor->FileCache))) { me->fp = LYNewBinFile (fnam); } else { +#if defined(WIN_EX) && !defined(__CYGWIN__) /* 1998/01/04 (Sun) */ + if (!strncmp(anchor->address,"file://localhost",16)) { + + /* 1998/01/23 (Fri) 17:38:26 */ + extern char windows_drive[]; + unsigned char *cp, *view_fname; + +#define IS_SJIS_HI1(hi) ((0x81<=hi)&&(hi<=0x9F)) /* 1st lev. */ +#define IS_SJIS_HI2(hi) ((0xE0<=hi)&&(hi<=0xEF)) /* 2nd lev. */ + + me->fp = NULL; + + view_fname = fnam + 3; + strcpy(view_fname, anchor->address + 17); + HTUnEscape(view_fname); + + if (strchr(view_fname, ':')==NULL) { + fnam[0] = windows_drive[0]; + fnam[1] = windows_drive[1]; + fnam[2] = '/'; + view_fname = fnam; + } + + /* 1998/04/21 (Tue) 11:04:16 */ + cp = view_fname; + while (*cp) { + if (IS_SJIS_HI1(*cp) || IS_SJIS_HI2(*cp)) { + cp += 2; + continue; + } else if (*cp == '/') { + *cp = '\\'; + } + cp++; + } + if (strchr(view_fname, ' ')) + view_fname = quote_pathname(view_fname); + + StrAllocCopy(me->viewer_command, pres->command); + + me->end_command = (char *)calloc ( + (strlen (pres->command) + 10 + strlen(view_fname)) + * sizeof (char),1); + if (me->end_command == NULL) + outofmem(__FILE__, "HTSaveAndExecute"); + sprintf(me->end_command, pres->command, view_fname); + me->remove_command = NULL; + + return me; + } +#endif /* * Check for a suffix. * Save the file under a suitably suffixed name. @@ -521,8 +621,10 @@ PUBLIC HTStream* HTSaveAndExecute ARGS3( } else if (!strcasecomp(pres->rep->name, "application/octet-stream")) { suffix = ".bin"; - } else if ((suffix = HTFileSuffix(pres->rep, anchor->content_encoding)) == 0 - || *suffix != '.') { + } else if ( + (suffix = HTFileSuffix(pres->rep, anchor->content_encoding)) == 0 + || *suffix != '.') + { suffix = HTML_SUFFIX; } me->fp = LYOpenTemp(fnam, suffix, "wb"); diff --git a/src/HTInit.c b/src/HTInit.c index b5f39fb7..6a82af9a 100644 --- a/src/HTInit.c +++ b/src/HTInit.c @@ -49,10 +49,10 @@ PUBLIC void HTFormatInit NOARGS HTSetPresentation("image/x-xbm", XLoadImageCommand, 1.0, 3.0, 0.0, 0); HTSetPresentation("image/x-xbitmap", XLoadImageCommand, 1.0, 3.0, 0.0, 0); HTSetPresentation("image/x-png", XLoadImageCommand, 2.0, 3.0, 0.0, 0); - HTSetPresentation("image/png", XLoadImageCommand, 1.0, 3.0, 0.0, 0); + HTSetPresentation("image/png", XLoadImageCommand, 1.0, 3.0, 0.0, 0); HTSetPresentation("image/x-rgb", XLoadImageCommand, 1.0, 3.0, 0.0, 0); HTSetPresentation("image/x-tiff", XLoadImageCommand, 2.0, 3.0, 0.0, 0); - HTSetPresentation("image/tiff", XLoadImageCommand, 1.0, 3.0, 0.0, 0); + HTSetPresentation("image/tiff", XLoadImageCommand, 1.0, 3.0, 0.0, 0); HTSetPresentation("image/jpeg", XLoadImageCommand, 1.0, 3.0, 0.0, 0); HTSetPresentation("video/mpeg", "mpeg_play %s &", 1.0, 3.0, 0.0, 0); @@ -62,9 +62,9 @@ PUBLIC void HTFormatInit NOARGS #ifdef EXEC_SCRIPTS /* set quality to 999.0 for protected exec applications */ #ifndef VMS - HTSetPresentation("application/x-csh", "csh %s", 999.0, 3.0, 0.0, 0); - HTSetPresentation("application/x-sh", "sh %s", 999.0, 3.0, 0.0, 0); - HTSetPresentation("application/x-ksh", "ksh %s", 999.0, 3.0, 0.0, 0); + HTSetPresentation("application/x-csh", "csh %s", 999.0, 3.0, 0.0, 0); + HTSetPresentation("application/x-sh", "sh %s", 999.0, 3.0, 0.0, 0); + HTSetPresentation("application/x-ksh", "ksh %s", 999.0, 3.0, 0.0, 0); #else HTSetPresentation("application/x-VMS_script", "@%s", 999.0, 3.0, 0.0, 0); #endif /* not VMS */ @@ -153,7 +153,7 @@ PUBLIC void HTFormatInit NOARGS /* * Load the local maps. */ - if ((fp = fopen(personal_type_map,"r")) != NULL) { + if ((fp = fopen(personal_type_map, TXT_R)) != NULL) { fclose(fp); /* These should override everything else. */ HTLoadTypesConfigFile(personal_type_map); @@ -376,7 +376,7 @@ PRIVATE int ProcessMailcapEntry ARGS2( /* no support for now. What does this do anyways? */ /* ExceptionalNewline(mc->contenttype, atoi(eq)); */ } else if (eq && !strcmp(arg, "q")) { - mc->quality = atof(eq); + mc->quality = (float)atof(eq); if (mc->quality > 0.000 && mc->quality < 0.001) mc->quality = 0.001; } else if (eq && !strcmp(arg, "mxb")) { @@ -624,7 +624,7 @@ PRIVATE int ProcessMailcapFile ARGS1( CTRACE(tfp, "ProcessMailcapFile: Loading file '%s'.\n", file); - if ((fp = fopen(file, "r")) == NULL) { + if ((fp = fopen(file, TXT_R)) == NULL) { CTRACE(tfp, "ProcessMailcapFile: Could not open '%s'.\n", file); return(-1 == 0); @@ -755,6 +755,8 @@ PUBLIC void HTFileInit NOARGS HTSetSuffix(".bz2", "application/x-bzip2", "binary", 1.0); + HTSetSuffix(".bz2", "application/x-bzip2", "binary", 1.0); + HTSetSuffix(".uu", "application/x-UUencoded", "8bit", 1.0); HTSetSuffix(".hqx", "application/x-Binhex", "8bit", 1.0); @@ -909,7 +911,7 @@ PUBLIC void HTFileInit NOARGS /* These should override the default extensions as necessary. */ HTLoadExtensionsConfigFile(global_extension_map); - if ((fp = fopen(personal_extension_map,"r")) != NULL) { + if ((fp = fopen(personal_extension_map, TXT_R)) != NULL) { fclose(fp); /* These should override everything else. */ HTLoadExtensionsConfigFile(personal_extension_map); @@ -997,7 +999,7 @@ PRIVATE int HTLoadExtensionsConfigFile ARGS1( CTRACE(tfp, "HTLoadExtensionsConfigFile: Loading file '%s'.\n", fn); - if ((f = fopen(fn,"r")) == NULL) { + if ((f = fopen(fn, TXT_R)) == NULL) { CTRACE(tfp, "HTLoadExtensionsConfigFile: Could not open '%s'.\n", fn); return count; } diff --git a/src/HTML.c b/src/HTML.c index 4849b24b..6fda07e9 100644 --- a/src/HTML.c +++ b/src/HTML.c @@ -78,6 +78,8 @@ #include <HTAccess.h> #endif +#include <LYJustify.h> + #include <LYexit.h> #include <LYLeaks.h> @@ -226,6 +228,10 @@ PRIVATE void change_paragraph_style ARGS2(HTStructured *, me, HTStyle *,style) */ PUBLIC void HTML_put_character ARGS2(HTStructured *, me, char, c) { +#ifdef CJK_EX + static unsigned char save_ch1 = 0; + static unsigned char save_ch2 = 0; +#endif /* * Ignore all non-MAP content when just * scanning a document for MAPs. - FM @@ -406,7 +412,27 @@ PUBLIC void HTML_put_character ARGS2(HTStructured *, me, char, c) } else { me->inP = TRUE; me->inLABEL = FALSE; +#ifdef CJK_EX + if (last_kcode == EUC) { + if (save_ch1 && !save_ch2) { + if ((unsigned char)c & 0x80) { + save_ch2 = c; + } + HText_appendCharacter(me->text, save_ch1); + HText_appendCharacter(me->text, save_ch2); + save_ch1 = save_ch2 = '\0'; + } else if ((unsigned char)c & 0x80) { + save_ch1 = c; + save_ch2 = '\0'; + } else { + HText_appendCharacter(me->text, c); + } + } else { + HText_appendCharacter(me->text, c); + } +#else HText_appendCharacter(me->text, c); +#endif me->in_word = YES; } } @@ -446,7 +472,7 @@ PUBLIC void HTML_put_string ARGS2(HTStructured *, me, CONST char *, s) StrAllocCopy(translated_string,s); TRANSLATE_AND_UNESCAPE_ENTITIES(&translated_string, TRUE, FALSE); s = (CONST char *) translated_string; - }; + } #endif switch (me->sp[0].tag_number) { @@ -707,8 +733,14 @@ PRIVATE void HTMLSRC_apply_markup ARGS4( } # define START TRUE # define STOP FALSE + +#ifdef __STDC__ # define PSRCSTART(x) HTMLSRC_apply_markup(me,HTL_##x,START,tag_charset) # define PSRCSTOP(x) HTMLSRC_apply_markup(me,HTL_##x,STOP,tag_charset) +#else +# define PSRCSTART(x) HTMLSRC_apply_markup(me,HTL_/**/x,START,tag_charset) +# define PSRCSTOP(x) HTMLSRC_apply_markup(me,HTL_/**/x,STOP,tag_charset) +#endif # define PUTC(x) HTML_put_character(me,x) # define PUTS(x) HTML_put_string(me,x) @@ -1207,7 +1239,7 @@ PRIVATE void HTML_start_element ARGS6( */ /* lss and css has different syntax - lynx shouldn't try to parse them now (it tries to parse them as lss, so it exits with - error message the 1st non-empty line) - HVV + error message on the 1st non-empty line) - VH */ #ifndef USE_COLOR_STYLE if (!strcasecomp(value[HTML_LINK_REL], "StyleSheet") || @@ -1591,6 +1623,7 @@ PRIVATE void HTML_start_element ARGS6( NULL, /* Tag */ href, /* Addresss */ INTERN_LT); /* Type */ + CAN_JUSTIFY_PUSH(FALSE); LYEnsureSingleSpace(me); if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR); @@ -1609,6 +1642,7 @@ PRIVATE void HTML_start_element ARGS6( HText_appendCharacter(me->text, LY_BOLD_END_CHAR); HText_endAnchor(me->text, 0); LYEnsureSingleSpace(me); + CAN_JUSTIFY_POP; } else { CHECK_ID(HTML_FRAME_ID); } @@ -1662,6 +1696,7 @@ PRIVATE void HTML_start_element ARGS6( href, /* Addresss */ INTERN_LT); /* Type */ LYEnsureDoubleSpace(me); + CAN_JUSTIFY_PUSH_F LYResetParagraphAlignment(me); if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR); @@ -1669,6 +1704,7 @@ PRIVATE void HTML_start_element ARGS6( if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); + me->in_word = NO; CHECK_ID(HTML_IFRAME_ID); HText_beginAnchor(me->text, me->inUnderline, me->CurrentA); @@ -1680,6 +1716,7 @@ PRIVATE void HTML_start_element ARGS6( HText_appendCharacter(me->text, LY_BOLD_END_CHAR); HText_endAnchor(me->text, 0); LYEnsureSingleSpace(me); + CAN_JUSTIFY_POP; } else { CHECK_ID(HTML_IFRAME_ID); } @@ -2014,6 +2051,7 @@ PRIVATE void HTML_start_element ARGS6( } UPDATE_STYLE; + CANT_JUSTIFY_THIS_LINE if (present[HTML_TAB_ALIGN] && value[HTML_TAB_ALIGN] && (strcasecomp(value[HTML_TAB_ALIGN], "left") || !(present[HTML_TAB_TO] || present[HTML_TAB_INDENT]))) { @@ -2069,6 +2107,7 @@ PRIVATE void HTML_start_element ARGS6( * or right, just add a collapsible space, otherwise, add the * appropriate number of spaces. - FM */ + if (target < column || target > HText_getMaximumColumn(me->text)) { HTML_put_character(me, ' '); @@ -2273,8 +2312,10 @@ PRIVATE void HTML_start_element ARGS6( if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); + CAN_JUSTIFY_START; FREE(note); } + CAN_JUSTIFY_START; me->inLABEL = TRUE; me->in_word = NO; me->inP = FALSE; @@ -2305,6 +2346,7 @@ PRIVATE void HTML_start_element ARGS6( } UPDATE_STYLE; /* update to the new style */ CHECK_ID(HTML_DL_ID); + break; case HTML_DLC: @@ -2693,6 +2735,7 @@ PRIVATE void HTML_start_element ARGS6( HText_setLastChar(me->text, ' '); } } + CAN_JUSTIFY_START; me->in_word = NO; me->inP = FALSE; break; @@ -2731,6 +2774,7 @@ PRIVATE void HTML_start_element ARGS6( if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); + CAN_JUSTIFY_START me->inLABEL = TRUE; me->in_word = NO; me->inP = FALSE; @@ -2923,17 +2967,20 @@ PRIVATE void HTML_start_element ARGS6( me->inUnderline, me->CurrentA); if (me->inBoldA == TRUE && me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_START_CHAR); -#ifdef NOTUSED_FOTEMODS +#if defined(NOTUSED_FOTEMODS) || !defined(NO_EMPTY_HREFLESS_A) /* * Close an HREF-less NAMED-ed now if we aren't making their * content bold, and let the check in HTML_end_element() deal * with any dangling end tag this creates. - FM */ - if (href == NULL && me->inBoldA == FALSE) { - SET_SKIP_STACK(HTML_A); - HTML_end_element(me, HTML_A, &include); - } -#endif /* NOTUSED_FOTEMODS */ +# ifndef NO_EMPTY_HREFLESS_A + if (force_empty_hrefless_a) +# endif + if (href == NULL && me->inBoldA == FALSE) { + SET_SKIP_STACK(HTML_A); + HTML_end_element(me, HTML_A, include); + } +#endif /* NOTUSED_FOTEMODS || !defined(NO_EMPTY_HREFLESS_A)*/ FREE(href); break; @@ -4192,6 +4239,7 @@ PRIVATE void HTML_start_element ARGS6( if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); + CAN_JUSTIFY_START; if (me->inFIG) /* @@ -4223,6 +4271,7 @@ PRIVATE void HTML_start_element ARGS6( if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); + CAN_JUSTIFY_START if (me->inFIG) /* @@ -4271,6 +4320,7 @@ PRIVATE void HTML_start_element ARGS6( * Set to know we are in a new form. */ me->inFORM = TRUE; + EMIT_IFDEF_EXP_JUSTIFY_ELTS(form_in_htext=TRUE;) if (present && present[HTML_FORM_ACCEPT_CHARSET]) { accept_cs = value[HTML_FORM_ACCEPT_CHARSET] ? @@ -4593,7 +4643,9 @@ PRIVATE void HTML_start_element ARGS6( BOOL HaveSRClink = FALSE; char* ImageSrc = NULL; BOOL IsSubmitOrReset = FALSE; - +#ifdef CJK_EX + HTkcode kcode = 0; +#endif /* init */ I.align=NULL; I.accept=NULL; I.checked=NO; I.class=NULL; I.disabled=NO; I.error=NULL; I.height= NULL; I.id=NULL; @@ -5032,6 +5084,12 @@ PRIVATE void HTML_start_element ARGS6( for (; chars > 0; chars--) HTML_put_character(me, '_'); } else { +#ifdef CJK_EX + if (HTCJK != NOCJK) { + kcode = HText_getKcode(me->text); + HText_updateKcode(me->text, kanji_code); + } +#endif if (me->sp[0].tag_number == HTML_PRE || !me->sp->style->freeFormat) { /* @@ -5071,6 +5129,10 @@ PRIVATE void HTML_start_element ARGS6( while (i < chars) HTML_put_character(me, HT_NON_BREAK_SPACE); } +#ifdef CJK_EX + if (HTCJK != NOCJK) + HText_updateKcode(me->text, kcode); +#endif } HText_setIgnoreExcess(me->text, FALSE); FREE(ImageSrc); @@ -5383,7 +5445,7 @@ PRIVATE void HTML_start_element ARGS6( */ if (HTCurSelectGroupType == F_RADIO_TYPE && LYSelectPopups && - keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { char marker[8]; int opnum = HText_getOptionNum(me->text); @@ -5430,10 +5492,27 @@ PRIVATE void HTML_start_element ARGS6( if (present && present[HTML_TABLE_ALIGN] && value[HTML_TABLE_ALIGN] && *value[HTML_TABLE_ALIGN]) { if (!strcasecomp(value[HTML_TABLE_ALIGN], "center")) { +#ifdef SH_EX /* 1998/10/09 (Fri) 15:20:09 */ + if (no_table_center) { + me->DivisionAlignments[me->Division_Level] = HT_LEFT; + change_paragraph_style(me, styles[HTML_DLEFT]); + UPDATE_STYLE; + me->current_default_alignment = + styles[HTML_DLEFT]->alignment; + } else { + me->DivisionAlignments[me->Division_Level] = HT_CENTER; + change_paragraph_style(me, styles[HTML_DCENTER]); + UPDATE_STYLE; + me->current_default_alignment = + styles[HTML_DCENTER]->alignment; + } +#else me->DivisionAlignments[me->Division_Level] = HT_CENTER; change_paragraph_style(me, styles[HTML_DCENTER]); UPDATE_STYLE; me->current_default_alignment = styles[HTML_DCENTER]->alignment; + +#endif } else if (!strcasecomp(value[HTML_TABLE_ALIGN], "right")) { me->DivisionAlignments[me->Division_Level] = HT_RIGHT; change_paragraph_style(me, styles[HTML_DRIGHT]); @@ -5491,9 +5570,18 @@ PRIVATE void HTML_start_element ARGS6( me->sp->style->alignment = me->current_default_alignment; } if (present && present[HTML_TR_ALIGN] && value[HTML_TR_ALIGN]) { +#ifdef SH_EX + if (!strcasecomp(value[HTML_TR_ALIGN], "center") && + !(me->List_Nesting_Level >= 0 && !me->inP)) + if (no_table_center) + me->sp->style->alignment = HT_LEFT; + else + me->sp->style->alignment = HT_CENTER; +#else if (!strcasecomp(value[HTML_TR_ALIGN], "center") && !(me->List_Nesting_Level >= 0 && !me->inP)) me->sp->style->alignment = HT_CENTER; +#endif else if (!strcasecomp(value[HTML_TR_ALIGN], "right") && !(me->List_Nesting_Level >= 0 && !me->inP)) me->sp->style->alignment = HT_RIGHT; @@ -5593,7 +5681,8 @@ PRIVATE void HTML_start_element ARGS6( if (HTML_dtd.tags[ElementNumber].contents != SGML_EMPTY) { if (me->skip_stack > 0) { - CTRACE(tfp, "HTML:begin_element: internal call (level %d), leaving on stack - %s\n", + CTRACE(tfp, + "HTML:begin_element: internal call (level %d), leaving on stack - `%s'\n", me->skip_stack, me->sp->style->name); me->skip_stack--; return; @@ -5619,6 +5708,11 @@ PRIVATE void HTML_start_element ARGS6( (me->sp)--; me->sp[0].style = me->new_style; /* Stack new style */ me->sp[0].tag_number = ElementNumber; +#ifdef EXP_JUSTIFY_ELTS + if (wait_for_this_stacked_elt<0 && + HTML_dtd.tags[ElementNumber].can_justify==FALSE) + wait_for_this_stacked_elt=me->stack - me->sp; +#endif } #if defined(USE_COLOR_STYLE) @@ -5672,6 +5766,7 @@ PRIVATE void HTML_end_element ARGS3( int i = 0; char *temp = NULL, *cp = NULL; BOOL BreakFlag = FALSE; + EMIT_IFDEF_EXP_JUSTIFY_ELTS(BOOL reached_awaited_stacked_elt=FALSE;) #ifdef USE_PSRC if (psrc_view && !sgml_in_psrc_was_initialized) { @@ -5793,6 +5888,10 @@ PRIVATE void HTML_end_element ARGS3( */ return; } else if (me->sp < (me->stack + MAX_NESTING - 1)) { +#ifdef EXP_JUSTIFY_ELTS + if (wait_for_this_stacked_elt==me->stack-me->sp) + reached_awaited_stacked_elt=TRUE; +#endif (me->sp)++; CTRACE(tfp, "HTML:end_element[%d]: Popped style off stack - %s\n", (int) STACKLEVEL(me), @@ -5802,8 +5901,13 @@ PRIVATE void HTML_end_element ARGS3( "Stack underflow error! Tried to pop off more styles than exist in stack\n"); } } - if (BreakFlag == TRUE) + if (BreakFlag == TRUE) { +#ifdef EXP_JUSTIFY_ELTS + if (reached_awaited_stacked_elt) + wait_for_this_stacked_elt=-1; +#endif return; + } /* * Check for unclosed TEXTAREA. - FM @@ -6587,6 +6691,7 @@ End_Object: me->inBadHTML = TRUE; } } + EMIT_IFDEF_EXP_JUSTIFY_ELTS(form_in_htext=FALSE;) /* * Check if we still have a SELECT element open. @@ -7026,6 +7131,11 @@ End_Object: break; } /* switch */ + +#ifdef EXP_JUSTIFY_ELTS + if (reached_awaited_stacked_elt) + wait_for_this_stacked_elt=-1; +#endif #ifdef USE_COLOR_STYLE #if !OPT_SCN TrimColorClass(HTML_dtd.tags[element_number].name, @@ -7122,15 +7232,17 @@ PRIVATE void HTML_free ARGS1(HTStructured *, me) CTRACE(tfp,"HTML_free: Ending underline\n"); } if (me->inA) { - HTML_end_element(me, HTML_A, &include); + HTML_end_element(me, HTML_A, (char **)&include); me->inA = FALSE; + if (TRACE) + fprintf(stderr,"HTML_free: Ending HTML_A\n"); } if (me->inFONT) { - HTML_end_element(me, HTML_FONT, &include); + HTML_end_element(me, HTML_FONT, (char **)&include); me->inFONT = FALSE; } if (me->inFORM) { - HTML_end_element(me, HTML_FORM, &include); + HTML_end_element(me, HTML_FORM, (char **)&include); me->inFORM = FALSE; } if (me->option.size > 0) { @@ -7720,6 +7832,19 @@ PUBLIC HTStructured* HTML_new ARGS3( me->outUCLYhndl, me->outUCI); #endif +#ifdef EXP_JUSTIFY_ELTS + wait_for_this_stacked_elt = !ok_justify +# ifdef USE_PSRC + || psrc_view +# endif + ? MAX_NESTING+2 /*some unreachable value*/ : -1; + can_justify_here = TRUE; + can_justify_this_line = TRUE; + form_in_htext = FALSE; + + ht_justify_cleanup(); +#endif + me->target = stream; if (stream) me->targetClass = *stream->isa; /* Copy pointers */ @@ -8064,7 +8189,29 @@ PRIVATE char * MakeNewTitle ARGS2(CONST char **, value, int, src_type) } else { StrAllocCat(newtitle, ptr + 1); } +#ifdef SH_EX /* 1998/04/02 (Thu) 16:02:00 */ + + /* for proxy server 1998/12/19 (Sat) 11:53:30 */ + if (stricmp(newtitle + 1, "internal-gopher-menu") == 0) { + StrAllocCopy(newtitle, "+"); + } else if (stricmp(newtitle + 1, "internal-gopher-unknown") == 0) { + StrAllocCopy(newtitle, " "); + } else { + /* normal title */ + ptr = strrchr(newtitle, '.'); + if (ptr) { + if (stricmp(ptr, ".gif") == 0) + *ptr = '\0'; + else if (stricmp(ptr, ".jpg") == 0) + *ptr = '\0'; + else if (stricmp(ptr, ".jpeg") == 0) + *ptr = '\0'; + } + StrAllocCat(newtitle, "]"); + } +#else StrAllocCat(newtitle, "]"); +#endif return newtitle; } @@ -8091,7 +8238,7 @@ PRIVATE char * MakeNewMapValue ARGS2(CONST char **, value, CONST char*, mapstr) StrAllocCopy(newtitle, "["); StrAllocCat(newtitle,mapstr); /* ISMAP or USEMAP */ - if ( verbose_img ) { + if ( verbose_img && value[HTML_IMG_SRC] && *value[HTML_IMG_SRC] ) { StrAllocCat(newtitle,":"); ptr = strrchr(value[HTML_IMG_SRC], '/'); if (!ptr) { diff --git a/src/LYBookmark.c b/src/LYBookmark.c index 5c4de52e..50ad92bd 100644 --- a/src/LYBookmark.c +++ b/src/LYBookmark.c @@ -11,6 +11,7 @@ #include <LYCharSets.h> /* need for LYHaveCJKCharacterSet */ #include <LYCurses.h> #include <GridText.h> +#include <HTCJK.h> #ifdef VMS #include <nam.h> @@ -24,6 +25,8 @@ PUBLIC char *MBM_A_subdescript[MBM_V_MAXFILES+1]; PRIVATE BOOLEAN is_mosaic_hotlist = FALSE; PRIVATE char * convert_mosaic_bookmark_file PARAMS((char *filename_buffer)); +extern HTCJKlang HTCJK; + PRIVATE void show_bookmark_not_defined NOARGS { @@ -93,7 +96,7 @@ PUBLIC char * get_bookmark_filename ARGS1( BookmarkPage); CTRACE(tfp, "\nget_bookmark_filename: SEEKING %s\n AS %s\n\n", BookmarkPage, filename_buffer); - if ((fp = fopen(filename_buffer,"r")) != NULL) { + if ((fp = fopen(filename_buffer, TXT_R)) != NULL) { goto success; } @@ -147,7 +150,7 @@ PRIVATE char * convert_mosaic_bookmark_file ARGS1( return (""); } - if ((fp = fopen(filename_buffer, "r")) == NULL) + if ((fp = fopen(filename_buffer, TXT_R)) == NULL) return (""); /* should always open */ fprintf(nfp,"<head>\n<title>%s</title>\n</head>\n",MOSAIC_BOOKMARK_TITLE); @@ -162,6 +165,11 @@ PRIVATE char * convert_mosaic_bookmark_file ARGS1( endline = &buf[strlen(buf)-1]; if(*endline == '\n') *endline = '\0'; +#ifdef DOSPATH /* 1998/01/10 (Sat) 15:41:35 */ + endline = strchr(buf, '\r'); + if (endline == NULL) + *endline = '\0'; +#endif if((line % 2) == 0) { /* even lines */ if(*buf != '\0') { strtok(buf," "); /* kill everything after the space */ @@ -200,6 +208,7 @@ PUBLIC void save_bookmark_link ARGS2( char *bookmark_URL = NULL; char filename_buffer[LY_MAXPATH]; char string_buffer[BUFSIZ]; + char tmp_buffer[BUFSIZ]; char *Address = NULL; char *Title = NULL; int i, c; @@ -269,7 +278,21 @@ PUBLIC void save_bookmark_link ARGS2( * Allow user to change the title. - FM */ do { - LYstrncpy(string_buffer, title, sizeof(string_buffer)-1); + if (HTCJK == JAPANESE) { + switch(kanji_code) { + case EUC: + TO_EUC(title, tmp_buffer); + break; + case SJIS: + TO_SJIS(title, tmp_buffer); + break; + default: + break; + } + LYstrncpy(string_buffer, tmp_buffer, sizeof(string_buffer)-1); + } else { + LYstrncpy(string_buffer, title, sizeof(string_buffer)-1); + } convert_to_spaces(string_buffer, FALSE); LYMBM_statusline(TITLE_PROMPT); LYgetstr(string_buffer, VISIBLE, sizeof(string_buffer), NORECALL); @@ -290,7 +313,22 @@ PUBLIC void save_bookmark_link ARGS2( * from display character set which may need changing. * Do NOT convert any 8-bit chars if we have CJK display. - LP */ - StrAllocCopy(Title, string_buffer); + if (HTCJK == JAPANESE) { + switch(kanji_code) { /* 1997/11/22 (Sat) 09:28:00 */ + case EUC: + TO_EUC(string_buffer, tmp_buffer); + break; + case SJIS: + TO_SJIS(string_buffer, tmp_buffer); + break; + default: + TO_JIS(string_buffer, tmp_buffer); + break; + } + StrAllocCopy(Title, tmp_buffer); + } else { + StrAllocCopy(Title, string_buffer); + } LYEntify(&Title, TRUE); if (UCSaveBookmarksInUnicode && have8bit(Title) && (!LYHaveCJKCharacterSet)) { @@ -334,8 +372,21 @@ PUBLIC void save_bookmark_link ARGS2( */ if (first_time) { fprintf(fp,"<head>\n"); +#if defined(SH_EX) && !defined(_WINDOWS) /* 1997/12/11 (Thu) 19:13:40 */ + if (HTCJK != JAPANESE) + LYAddMETAcharsetToFD(fp, -1); + else + fprintf(fp, "<META %s %s>\n", + "http-equiv=\"content-type\"", + "conetnt=\"text/html;charset=iso-2022-jp\""); +#else LYAddMETAcharsetToFD(fp, -1); +#endif /* !_WINDOWS */ fprintf(fp,"<title>%s</title>\n</head>\n", BOOKMARK_TITLE); +#ifdef _WINDOWS + fprintf(fp, + gettext(" You can delete links by the 'R' key<br>\n<ol>\n")); +#else fprintf(fp, "%s<br>\n%s\n\n<!--\n%s\n-->\n\n<p>\n<ol>", gettext("\ You can delete links using the remove bookmark command. It is usually\n\ @@ -349,6 +400,7 @@ Note: if you edit this file manually\n\ you should not change the format within the lines\n\ or add other HTML markup.\n\ Make sure any bookmark link is saved as a single line.")); +#endif /* _WINDOWS */ } /* @@ -423,8 +475,10 @@ PUBLIC void remove_bookmark_link ARGS2( #else char filename_buffer[LY_MAXPATH]; char newfile[LY_MAXPATH]; +#ifdef UNIX struct stat stat_buf; mode_t mode; +#endif /* UNIX */ #endif /* VMS */ char homepath[LY_MAXPATH]; @@ -437,7 +491,7 @@ PUBLIC void remove_bookmark_link ARGS2( cur_bookmark_page); CTRACE(tfp, "\nremove_bookmark_link: SEEKING %s\n AS %s\n\n", cur_bookmark_page, filename_buffer); - if ((fp = fopen(filename_buffer, "r")) == NULL) { + if ((fp = fopen(filename_buffer, TXT_R)) == NULL) { HTAlert(BOOKMARK_OPEN_FAILED_FOR_DEL); return; } @@ -535,12 +589,20 @@ PUBLIC void remove_bookmark_link ARGS2( * Check if this is the case and do something appropriate. * Used to be ODD_RENAME */ -#ifdef _WINDOWS +#if defined(_WINDOWS) || defined(WIN_EX) +#if defined(WIN_EX) + if (GetLastError() == ERROR_NOT_SAME_DEVICE) +#else /* !_WIN_CC */ if (errno == ENOTSAM) -#else - if (errno == EXDEV) -#endif /* WINDOWS */ +#endif /* _WIN_CC */ { + if (rename(newfile, filename_buffer) != 0) { + if (LYCopyFile(newfile, filename_buffer) == 0) + remove(newfile); + } + } +#else + if (errno == EXDEV) { static CONST char MV_FMT[] = "%s %s %s"; char *buffer = 0; HTAddParam(&buffer, MV_FMT, 1, MV_PATH); @@ -551,6 +613,7 @@ PUBLIC void remove_bookmark_link ARGS2( FREE(buffer); return; } +#endif /* _WINDOWS */ #endif /* !VMS */ #ifdef VMS diff --git a/src/LYCgi.c b/src/LYCgi.c index 9e0bfce0..375206a6 100644 --- a/src/LYCgi.c +++ b/src/LYCgi.c @@ -238,8 +238,15 @@ PRIVATE int LYLoadCGI ARGS4( PERROR("stat() failed"); status = -4; - } else if (!(S_ISREG(stat_buf.st_mode) && - stat_buf.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH))) { + } else +#ifdef _WINDOWS /* 1998/01/14 (Wed) 09:16:04 */ + if (!(S_ISREG(stat_buf.st_mode) && + stat_buf.st_mode & (S_IXUSR))) +#else + if (!(S_ISREG(stat_buf.st_mode) && + stat_buf.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH))) +#endif + { /* * Not a runnable file, See if we can load it using "file:" code. */ diff --git a/src/LYCharSets.c b/src/LYCharSets.c index 8890f9df..5924a4f8 100644 --- a/src/LYCharSets.c +++ b/src/LYCharSets.c @@ -484,7 +484,7 @@ PUBLIC void HTMLSetCharacterHandling ARGS1(int,i) } #endif /* USE_SLANG */ - ena_csi((LYlowest_eightbit[current_char_set] > 155)); + ena_csi((BOOLEAN)(LYlowest_eightbit[current_char_set] > 155)); /* some diagnostics */ if (TRACE) { diff --git a/src/LYCharSets.h b/src/LYCharSets.h index 1f21db0f..ea132684 100644 --- a/src/LYCharSets.h +++ b/src/LYCharSets.h @@ -14,6 +14,9 @@ extern BOOLEAN LYHaveCJKCharacterSet; extern BOOLEAN DisplayCharsetMatchLocale; +#include <HTCJK.h> +extern HTkcode kanji_code; + /* * currently active character set (internal handler) */ diff --git a/src/LYCharUtils.c b/src/LYCharUtils.c index 5e15c2a2..aef1862e 100644 --- a/src/LYCharUtils.c +++ b/src/LYCharUtils.c @@ -43,7 +43,6 @@ extern BOOL HTPassEightBitRaw; extern BOOL HTPassEightBitNum; extern BOOL HTPassHighCtrlRaw; extern BOOL HTPassHighCtrlNum; -extern HTkcode kanji_code; extern HTCJKlang HTCJK; /* @@ -65,6 +64,12 @@ PUBLIC void LYEntify ARGS2( char *p = *str; char *q = NULL, *cp = NULL; int amps = 0, lts = 0, gts = 0; +#ifdef CJK_EX + enum _state + { S_text, S_esc, S_dollar, S_paren, + S_nonascii_text, S_dollar_paren } state = S_text; + int in_sjis = 0; +#endif if (p == NULL || *p == '\0') return; @@ -113,6 +118,88 @@ PUBLIC void LYEntify ARGS2( if ((cp = q) == NULL) outofmem(__FILE__, "LYEntify"); for (p = *str; *p; p++) { +#ifdef CJK_EX + if (HTCJK != NOCJK) { + switch(state) { + case S_text: + if (*p == '\033') { + state = S_esc; + *q++ = *p; + continue; + } + break; + + case S_esc: + if (*p == '$') { + state = S_dollar; + *q++ = *p; + continue; + } else if (*p == '(') { + state = S_paren; + *q++ = *p; + continue; + } else { + state = S_text; + *q++ = *p; + continue; + } + + case S_dollar: + if (*p == '@' || *p == 'B' || *p == 'A') { + state = S_nonascii_text; + *q++ = *p; + continue; + } else if (*p == '(') { + state = S_dollar_paren; + *q++ = *p; + continue; + } else { + state = S_text; + *q++ = *p; + continue; + } + + case S_dollar_paren: + if (*p == 'C') { + state = S_nonascii_text; + *q++ = *p; + continue; + } else { + state = S_text; + *q++ = *p; + continue; + } + + case S_paren: + if (*p == 'B' || *p == 'J' || *p =='T') { + state = S_text; + *q++ = *p; + continue; + } else if (*p == 'I') { + state = S_nonascii_text; + *q++ = *p; + continue; + } + + case S_nonascii_text: + if (*p == '\033') + state = S_esc; + *q++ = *p; + continue; + + default: + break; + } + if (*(p+1) != '\0' && + (IS_EUC((unsigned char)*p, (unsigned char)*(p+1)) || + IS_SJIS((unsigned char)*p, (unsigned char)*(p+1), in_sjis) || + IS_BIG5((unsigned char)*p, (unsigned char)*(p+1)))) { + *q++ = *p++; + *q++ = *p; + continue; + } + } +#endif if (*p == '&') { *q++ = '&'; *q++ = 'a'; @@ -133,6 +220,7 @@ PUBLIC void LYEntify ARGS2( *q++ = *p; } } + *q = '\0'; FREE(*str); *str = cp; } @@ -1632,6 +1720,10 @@ PRIVATE char ** LYUCFullyTranslateString_1 ARGS9( enum _parsing_what { P_text, P_utf8, P_hex, P_decimal, P_named } what = P_text; +#ifdef CJK_EX /* 1997/12/12 (Fri) 18:08:48 */ + static unsigned char sjis_1st = '\0'; + unsigned char sjis_str[3]; +#endif /* ** Make sure we have a non-empty string. - FM @@ -1732,6 +1824,24 @@ PRIVATE char ** LYUCFullyTranslateString_1 ARGS9( switch(state) { case S_text: code = (unsigned char)(*p); +#ifdef CJK_EX /* 1997/12/13 (Sat) 14:41:53 */ + if (HTCJK == JAPANESE && last_kcode == SJIS) { + if (sjis_1st == '\0' && (IS_SJIS_HI1(code)||IS_SJIS_HI2(code))){ + sjis_1st = (unsigned char)code; + } else if (sjis_1st && IS_SJIS_LO(code)) { + sjis_1st = '\0'; + } else { + if (0xA1 <= code && code <= 0xDF) { + sjis_str[2] = '\0'; + JISx0201TO0208_SJIS((unsigned char)code, + sjis_str, sjis_str + 1); + REPLACE_STRING(sjis_str); + p++; + continue; + } + } + } +#endif if (*p == '\033') { if ((HTCJK != NOCJK && !hidden) || stype != st_HTML) { state = S_esc; @@ -1850,7 +1960,7 @@ PRIVATE char ** LYUCFullyTranslateString_1 ARGS9( state = S_got_outchar; break; } else { - *p = 160; + *(unsigned char *)p = (unsigned char)160; code = 160; if (LYCharSet_UC[cs_to].enc == UCT_ENC_8859 || (LYCharSet_UC[cs_to].like8859 & UCT_R_8859SPECL)) { @@ -1859,7 +1969,7 @@ PRIVATE char ** LYUCFullyTranslateString_1 ARGS9( } } } else if ((*p) == LY_SOFT_HYPHEN) { - *p = 173; + *(unsigned char *)p = (unsigned char)173; code = 173; if (LYCharSet_UC[cs_to].enc == UCT_ENC_8859 || (LYCharSet_UC[cs_to].like8859 & UCT_R_8859SPECL)) { diff --git a/src/LYCookie.c b/src/LYCookie.c index e93b27f2..a3640e32 100644 --- a/src/LYCookie.c +++ b/src/LYCookie.c @@ -2028,7 +2028,11 @@ PUBLIC void LYLoadCookies ARGS1 ( }; time_t expires; +#ifdef DOSPATH /* 1998/12/19 (Sat) 08:10:57 */ + cookie_handle = fopen(cookie_file, "rt+"); +#else cookie_handle = fopen(cookie_file, "r+"); +#endif if (!cookie_handle) return; diff --git a/src/LYCurses.c b/src/LYCurses.c index 666d96b6..679c2f99 100644 --- a/src/LYCurses.c +++ b/src/LYCurses.c @@ -198,7 +198,7 @@ PUBLIC void VMSbox ARGS3( wmove(win, 0, 0); waddstr(win, "\033)0\016l"); for (i = 1; i < width; i++) - waddch(win, 'q'); + waddch(win, 'q'); waddch(win, 'k'); for (i = 1; i < height-1; i++) { wmove(win, i, 0); @@ -209,7 +209,7 @@ PUBLIC void VMSbox ARGS3( wmove(win, i, 0); waddch(win, 'm'); for (i = 1; i < width; i++) - waddch(win, 'q'); + waddch(win, 'q'); waddstr(win, "j\017"); } #else @@ -328,8 +328,8 @@ PUBLIC void curses_w_style ARGS3( #if !OMIT_SCN_KEEPING bucket* ds= (style == NOSTYLE ? &nostyle_bucket : &hashStyles[style]); #else - bucket* ds= (style == NOSTYLE ? &nostyle_bucket : - (style== SPECIAL_STYLE ? &special_bucket :&hashStyles[style]) ); + bucket* ds= (style == NOSTYLE ? &nostyle_bucket : + (style== SPECIAL_STYLE ? &special_bucket :&hashStyles[style]) ); #endif @@ -375,12 +375,12 @@ PUBLIC void curses_w_style ARGS3( last_styles[last_colorattr_ptr++] = getattrs(stdscr); /* don't cache style changes for active links */ #if OMIT_SCN_KEEPING - /* since we don't compute the hcode - to stack off in HTML.c, we don't know whether this style is - configured. So, we shouldn't simply return on stacking on on - unconfigured styles, we should push curr attrs on stack. -HV - */ - if (!ds->name) return; + /* since we don't compute the hcode to stack off in HTML.c, we + * don't know whether this style is configured. So, we + * shouldn't simply return on stacking on on unconfigured + * styles, we should push curr attrs on stack. -HV + */ + if (!ds->name) return; #endif if (style != s_alink) { @@ -397,7 +397,7 @@ PUBLIC void curses_w_style ARGS3( CTRACE(tfp, "CACHED: <%s> @(%d,%d)\n", ds->name, YP, XP); if (win==stdscr) cached_styles[YP][XP]=style; } - LYAttrset(win, ds->color, ds->mono); + LYAttrset(win, ds->color, ds->mono); return; } } @@ -490,7 +490,7 @@ PRIVATE void LYsetWAttr ARGS1(WINDOW *, win) int offs = 1; static int NoColorVideo = -1; -#ifdef UNIX +#if defined(UNIX) && !defined(PDCURSES) if (NoColorVideo < 0) { NoColorVideo = tigetnum("ncv"); } @@ -545,9 +545,9 @@ PRIVATE void lynx_map_color ARGS1(int, n) for (m = 0; m <= 16; m += 8) { int pair = n + m + 1; if (pair < COLOR_PAIRS) - init_pair(pair, - lynx_color_pairs[pair].fg, - lynx_color_pairs[pair].bg); + init_pair((short)pair, + (short)lynx_color_pairs[pair].fg, + (short)lynx_color_pairs[pair].bg); } if (n == 0 && LYShowColor >= SHOW_COLOR_ON) bkgd(COLOR_BKGD | ' '); @@ -602,9 +602,9 @@ PRIVATE void lynx_init_colors NOARGS for (m = 0; m <= 16; m += 8) { int pair = n + m + 1; if (pair < COLOR_PAIRS) - init_pair(pair, - lynx_color_pairs[pair].fg, - lynx_color_pairs[pair].bg); + init_pair((short)pair, + (short)lynx_color_pairs[pair].fg, + (short)lynx_color_pairs[pair].bg); } if (n == 0 && LYShowColor >= SHOW_COLOR_ON) bkgd(COLOR_BKGD | ' '); @@ -653,9 +653,9 @@ PUBLIC void start_curses NOARGS if (LYUseMouse) lynx_enable_mouse (1); - } else + } else { sock_init(); - + } LYCursesON = TRUE; CTRACE(tfp, "start_curses: done.\n"); clear(); @@ -677,7 +677,9 @@ PUBLIC void start_curses NOARGS } if (slinit == 0) { +#if !defined(USE_KEYMAPS) SLtt_get_terminfo(); +#endif #if defined(__DJGPP__) && !defined(DJGPP_KEYHANDLER) SLkp_init (); #endif /* __DJGPP__ && !DJGPP_KEYHANDLER */ @@ -737,7 +739,11 @@ PUBLIC void start_curses NOARGS #endif /* VMS || UNIX */ } #ifdef __DJGPP__ +#ifdef WATT32 + _eth_init(); +#else else sock_init(); +#endif /* WATT32 */ #endif /* __DJGPP__ */ slinit = 1; @@ -825,7 +831,7 @@ PUBLIC void start_curses NOARGS if (has_colors()) { lynx_has_color = TRUE; start_color(); -#if HAVE_USE_DEFAULT_COLORS +#if HAVE_USE_DEFAULT_COLORS && !defined(PDCURSES) if (use_default_colors() == OK) { default_fg = DEFAULT_COLOR; default_bg = DEFAULT_COLOR; @@ -875,19 +881,19 @@ PUBLIC void start_curses NOARGS fflush(stderr); #endif /* USE_SLANG */ -#ifdef _WINDOWS +#if defined(WIN_EX) clear(); #endif LYCursesON = TRUE; CTRACE(tfp, "start_curses: done.\n"); -} +} /* end of start_curses() */ PUBLIC void lynx_enable_mouse ARGS1(int,state) { -#ifdef __BORLANDC__ +#if defined(WIN_EX) /* modify lynx_enable_mouse() for pdcurses configuration so that mouse support is disabled unless -use_mouse is specified. This is ifdef'd with __BORLANDC__ for the time being (WB). @@ -911,7 +917,7 @@ PUBLIC void lynx_enable_mouse ARGS1(int,state) #else #ifdef NCURSES_MOUSE_VERSION -#if defined(__BORLANDC__) && defined(__PDCURSES__) +#if defined(WIN_EX) && defined(PDCURSES) if (state) { SetConsoleMode(hConIn, ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT); @@ -945,23 +951,27 @@ PUBLIC void lynx_enable_mouse ARGS1(int,state) NULL); } else mousemask(0, NULL); -#endif /* __BORLANDC__ and __PDCURSES__ */ +#endif /* _WIN_CC and PDCURSES */ #endif /* NCURSES_MOUSE_VERSION */ #if defined(DJGPP) && !defined(USE_SLANG) if (state) mouse_set(BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED); #endif -#endif /* NOT USE_SLANG_MOUSE */ +#endif /* NOT USE_SLANG_MOUSE */ } PUBLIC void stop_curses NOARGS { echo(); -#ifdef DJGPP +#ifdef __DJGPP__ +#ifdef WATT32 + _eth_release(); +#else sock_exit(); -#endif -#if defined (DOSPATH) && !defined(USE_SLANG) +#endif /* WATT32 */ +#endif /* __DJGPP__ */ +#if defined(DOSPATH) && !(defined(USE_SLANG) || _WIN_CC) clrscr(); #else @@ -971,8 +981,18 @@ PUBLIC void stop_curses NOARGS */ if(LYCursesON == TRUE) { lynx_enable_mouse (0); +#ifndef WIN_EX /* @@@ */ endwin(); /* stop curses */ +#endif + } +#ifdef SH_EX + { + int i; + for (i=0; i <= 3; i++) { + fprintf(stdout, "\r\n"); + } } +#endif fflush(stdout); #endif /* DJGPP */ @@ -1177,6 +1197,14 @@ PUBLIC BOOLEAN setup ARGS1( LYlines = LINES; LYcols = COLS; #endif /* HAVE_SIZECHANGE && !USE_SLANG && USE_NOTDEFINED */ +#if defined(WIN_EX) && defined(NOTDEFINED) + { + extern int current_codepage; /* PDCurses lib. */ + + if (current_codepage == 932) + LYcols = COLS - 1; + } +#endif if (LYlines <= 0) LYlines = 24; if (LYcols <= 0) @@ -1765,10 +1793,16 @@ PUBLIC void lynx_force_repaint NOARGS PUBLIC void lynx_start_title_color NOARGS { +#ifdef SH_EX + start_reverse(); +#endif } PUBLIC void lynx_stop_title_color NOARGS { +#ifdef SH_EX + stop_reverse(); +#endif } PUBLIC void lynx_start_link_color ARGS2( diff --git a/src/LYCurses.h b/src/LYCurses.h index 51c116e1..3b252afa 100644 --- a/src/LYCurses.h +++ b/src/LYCurses.h @@ -71,6 +71,10 @@ #undef PENDIN #endif +#if defined(_MSC_VER) +#undef MOUSE_MOVED /* conflict between PDCURSES and _WIN32 */ +#endif /* _MSC_VER */ + #ifdef HAVE_CONFIG_H # ifdef HAVE_NCURSES_H # include <ncurses.h> @@ -81,7 +85,11 @@ # ifdef HAVE_JCURSES_H # include <jcurses.h> /* sony_news */ # else -# include <curses.h> /* default */ +# ifdef PDCURSES +# include <pdcurses.h> /* for PDCurses */ +# else +# include <curses.h> /* default */ +# endif # endif # endif # endif @@ -315,8 +323,13 @@ extern int lynx_chg_color PARAMS((int, int, int)); #ifdef UNDERLINE_LINKS #define start_bold() LYaddAttr(A_UNDERLINE) #define stop_bold() LYsubAttr(A_UNDERLINE) +#ifdef __CYGWIN__ /* 1999/02/25 (Thu) 01:09:45 */ +#define start_underline() /* LYaddAttr(A_BOLD) */ +#define stop_underline() /* LYsubAttr(A_BOLD) */ +#else #define start_underline() LYaddAttr(A_BOLD) #define stop_underline() LYsubAttr(A_BOLD) +#endif /* __CYGWIN__ */ #else /* not UNDERLINE_LINKS: */ #define start_bold() LYaddAttr(A_BOLD) #define stop_bold() LYsubAttr(A_BOLD) @@ -327,6 +340,7 @@ extern int lynx_chg_color PARAMS((int, int, int)); #endif /* USE_COLOR_STYLE */ #define stop_underline() LYsubAttr(A_UNDERLINE) #endif /* UNDERLINE_LINKS */ + #if defined(SNAKE) && defined(HP_TERMINAL) #define start_reverse() LYaddWAttr(stdscr, A_DIM) #define wstart_reverse(a) LYaddWAttr(a, A_DIM) @@ -338,6 +352,7 @@ extern int lynx_chg_color PARAMS((int, int, int)); #define stop_reverse() LYsubAttr(A_REVERSE) #define wstop_reverse(a) LYsubWAttr(a, A_REVERSE) #endif /* SNAKE && HP_TERMINAL */ + #endif /* VMS */ #else /* Not FANCY_CURSES: */ @@ -403,7 +418,7 @@ extern void lynx_stop_all_colors NOPARAMS; * Note: EMX has no corresponding variable like _fmode on DOS, but it does * have setmode. */ -#if defined(_WINDOWS) || defined(DJGPP) || defined(__EMX__) +#if defined(_WINDOWS) || defined(DJGPP) || defined(__EMX__) || defined(WIN_EX) #define SetOutputMode(mode) setmode(fileno(stdout), mode) #else #define SetOutputMode(mode) /* nothing */ diff --git a/src/LYDownload.c b/src/LYDownload.c index 5b079b32..78b1a4cb 100644 --- a/src/LYDownload.c +++ b/src/LYDownload.c @@ -88,7 +88,7 @@ PUBLIC void LYDownload ARGS1( goto failed; } -#ifdef DIRED_SUPPORT +#if defined(DIRED_SUPPORT) /* FIXME: use HTLocalName */ if (!strncmp(file, "file://localhost", 16)) #ifdef __DJGPP__ @@ -102,6 +102,14 @@ PUBLIC void LYDownload ARGS1( else if (!strncmp(file, "file:", 5)) file += 5; HTUnEscape(file); +#else +#if defined(_WINDOWS) /* 1997/10/15 (Wed) 16:27:38 */ + if (!strncmp(file, "file://localhost/", 17)) + file += 17; + else if (!strncmp(file, "file:/", 6)) + file += 6; + HTUnEscape(file); +#endif /* _WINDOWS */ #endif /* DIRED_SUPPORT */ if ((method = (char *)strstr(Line, "Method=")) == NULL) @@ -403,7 +411,11 @@ check_recall: if (!strncasecomp(buffer, "nl:", 3) || !strncasecomp(buffer, "/nl/", 4)) #else +#if defined(DOSPATH) /* 1997/10/15 (Wed) 16:41:30 */ + if (!strcmp(buffer, "nul")) +#else if (!strcmp(buffer, "/dev/null")) +#endif /* DOSPATH */ #endif /* VMS */ { goto cancelled; @@ -490,10 +502,10 @@ PUBLIC int LYdownload_options ARGS2( change_sug_filename(sug_filename); if (LYReuseTempfiles) { - fp0 = LYOpenTempRewrite(tempfile, HTML_SUFFIX, "w"); + fp0 = LYOpenTempRewrite(tempfile, HTML_SUFFIX, "wb"); } else { LYRemoveTemp(tempfile); - fp0 = LYOpenTemp(tempfile, HTML_SUFFIX, "w"); + fp0 = LYOpenTemp(tempfile, HTML_SUFFIX, "wb"); } if (fp0 == NULL) { HTAlert(CANNOT_OPEN_TEMP); @@ -526,7 +538,7 @@ PUBLIC int LYdownload_options ARGS2( : gettext("Download options:")); if (!no_disk_save && !child_lynx) { -#ifdef DIRED_SUPPORT +#if defined(DIRED_SUPPORT) /* * Disable save to disk option for local files. */ diff --git a/src/LYEdit.c b/src/LYEdit.c index 8e2ab7a9..65d7c495 100644 --- a/src/LYEdit.c +++ b/src/LYEdit.c @@ -45,6 +45,9 @@ PUBLIC int edit_current_file ARGS3( char *colon, *number_sign; char position[80]; FILE *fp; +#ifdef __CYGWIN__ + unsigned char temp_buff[LY_MAXPATH]; +#endif /* * If its a remote file then we can't edit it. @@ -67,25 +70,41 @@ PUBLIC int edit_current_file ARGS3( * * On VMS, only try the path. */ -#if !defined (VMS) && !defined (DOSPATH) && !defined (__EMX__) +#if defined (VMS) || defined (DOSPATH) || defined (__EMX__) + filename = HTParse(newfile, "", PARSE_PATH+PARSE_PUNCTUATION); + HTUnEscape(filename); + StrAllocCopy(filename, HTSYS_name(filename)); + if ((fp = fopen(filename, "r")) == NULL) + { +#ifdef SH_EX + HTUserMsg2(COULD_NOT_EDIT_FILE, filename); +#else + HTAlert(COULD_NOT_ACCESS_FILE); +#endif + CTRACE(tfp, "filename: '%s'\n", filename); + goto done; + } +#else /* !(VMS || !DOSPATH || !__EMX__) == UNIX */ +#ifdef SH_EX /* Speed Up! */ + if (strncmp(newfile, "file://localhost/", 16) == 0) + colon = newfile + 16; + else + colon = strchr(newfile, ':'); +#else colon = strchr(newfile, ':'); +#endif StrAllocCopy(filename, (colon + 1)); HTUnEscape(filename); if ((fp = fopen(filename, "r")) == NULL) { FREE(filename); -#endif /* !VMS */ filename = HTParse(newfile, "", PARSE_PATH+PARSE_PUNCTUATION); HTUnEscape(filename); - StrAllocCopy(filename, HTSYS_name(filename)); - if ((fp = fopen(filename, "r")) == NULL) - { + if ((fp = fopen(HTSYS_name(filename), "r")) == NULL) { HTAlert(COULD_NOT_ACCESS_FILE); - CTRACE(tfp, "filename: '%s'\n", filename); goto done; } -#if !defined (VMS) && !defined (DOSPATH) && !defined (__EMX__) } -#endif /* !VMS */ +#endif /* !(VMS || !DOSPATH || !__EMX__) */ fclose(fp); #if defined(VMS) || defined(CANT_EDIT_UNWRITABLE_FILES) @@ -132,8 +151,40 @@ PUBLIC int edit_current_file ARGS3( HTAddParam(&command, format, params++, filename); HTEndParam(&command, format, params); #endif - } else { + } +#ifdef DOSPATH + else if (strncmp(editor, "VZ", 2)==0) { + /* for Vz editor */ + format = "%s %s -%s"; + HTAddXpand(&command, format, params++, editor); + HTAddParam(&command, format, params++, HTDOS_short_name(filename)); + HTAddParam(&command, format, params++, position); + HTEndParam(&command, format, params); + } else if (strncmp(editor, "edit", 4)==0) { + /* for standard editor */ + HTAddXpand(&command, format, params++, editor); + HTAddParam(&command, format, params++, HTDOS_short_name(filename)); + HTEndParam(&command, format, params); + } +#endif + else { +#ifdef _WINDOWS + if (strchr(editor, ' ')) + HTAddXpand(&command, format, params++, HTDOS_short_name(editor)); + else + HTAddXpand(&command, format, params++, editor); +#else +#if defined(__CYGWIN__) && defined(DOSPATH) + if (strchr(editor, ' ')) { + cygwin_conv_to_full_posix_path(HTDOS_short_name(editor), temp_buff); + HTAddXpand(&command, format, params++, temp_buff); + } else { + HTAddXpand(&command, format, params++, editor); + } +#else HTAddXpand(&command, format, params++, editor); +#endif /* __CYGWIN__ */ +#endif HTAddParam(&command, format, params++, filename); HTEndParam(&command, format, params); } diff --git a/src/LYEditmap.c b/src/LYEditmap.c index 8a947ac4..504f9bf7 100644 --- a/src/LYEditmap.c +++ b/src/LYEditmap.c @@ -47,7 +47,11 @@ LYE_NOP, LYE_ENTER, LYE_FORWW, LYE_ABORT, LYE_BACKW, LYE_NOP, LYE_DELN, LYE_NOP, /* ^P XON ^R XOFF */ +#ifdef WIN_EX +LYE_UPPER, LYE_ERASE, LYE_LKCMD, LYE_PASTE, +#else LYE_UPPER, LYE_ERASE, LYE_LKCMD, LYE_NOP, +#endif /* ^T ^U ^V ^W */ LYE_ERASE, LYE_NOP, LYE_NOP, LYE_NOP, @@ -88,8 +92,12 @@ LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, +#ifdef CJK_EX /* 1997/11/03 (Mon) 20:30:54 */ +LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, +#else LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_AIX, /* 97 AIX */ +#endif LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, @@ -276,7 +284,7 @@ LYE_NOP, LYE_BOL, LYE_BACK, LYE_ABORT, LYE_DELN, LYE_EOL, LYE_FORW, LYE_ABORT, /* ^D ^E ^F ^G */ -LYE_DELP, LYE_ENTER, LYE_ENTER, LYE_DELEL, +LYE_DELP, LYE_ENTER, LYE_ENTER, LYE_DELNW, /* LYE_DELEL,*/ /* bs tab nl ^K */ LYE_NOP, LYE_ENTER, LYE_FORWW, LYE_ABORT, @@ -285,7 +293,11 @@ LYE_NOP, LYE_ENTER, LYE_FORWW, LYE_ABORT, LYE_BACKW, LYE_NOP, LYE_DELPW, LYE_NOP, /* ^P XON ^R XOFF */ +#ifdef WIN_EX +LYE_DELNW, LYE_ERASE, LYE_LKCMD, LYE_PASTE, +#else LYE_DELNW, LYE_ERASE, LYE_LKCMD, LYE_NOP, +#endif /* ^T ^U ^V ^W */ LYE_DELBL, LYE_NOP, LYE_NOP, LYE_NOP, @@ -326,8 +338,12 @@ LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, +#ifdef CJK_EX /* 1997/11/03 (Mon) 20:30:54 */ +LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, +#else LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_AIX, /* 97 AIX */ +#endif LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, LYE_CHAR, diff --git a/src/LYExtern.c b/src/LYExtern.c index 5fb37840..0f8a1c4f 100644 --- a/src/LYExtern.c +++ b/src/LYExtern.c @@ -25,7 +25,120 @@ #include <LYLeaks.h> #include <LYCurses.h> -void run_external ARGS1(char *, cmd) + +#ifdef WIN_EX +/* 1997/10/15 (Wed) 17:39:50 */ + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +#define STRING_MAX 512 + +/* ASCII char -> HEX digit */ +#define ASC2HEXD(x) (((x) >= '0' && (x) <= '9') ? \ + ((x) - '0') : (toupper(x) - 'A' + 10)) + + +/* Decodes the forms %xy in a URL to the character the hexadecimal + code of which is xy. xy are hexadecimal digits from + [0123456789ABCDEF] (case-insensitive). If x or y are not hex-digits + or '%' is near '\0', the whole sequence is inserted literally. */ + + +static char *decode_string(char *s) +{ + char *save_s; + char *p = s; + + save_s = s; + for (; *s; s++, p++) { + if (*s != '%') + *p = *s; + else { + /* Do nothing if at the end of the string. Or if the chars + are not hex-digits. */ + if (!*(s + 1) || !*(s + 2) + || !(isxdigit(*(s + 1)) && isxdigit(*(s + 2)))) { + *p = *s; + continue; + } + *p = (ASC2HEXD(*(s + 1)) << 4) + ASC2HEXD(*(s + 2)); + s += 2; + } + } + *p = '\0'; + return save_s; +} +#endif /* WIN_EX */ + +#ifndef STRING_MAX +#define STRING_MAX 512 +#endif + +/* 1997/11/10 (Mon) 14:26:10 */ +PUBLIC char *string_short ARGS2( + char *, str, + int, cut_pos) +{ + char buff[STRING_MAX]; + static char s_str[STRING_MAX]; + char *p; + int len; + + p = str; + len = strlen(p); + + if (len > STRING_MAX) { + strncpy(buff, p, STRING_MAX - 1); + buff[STRING_MAX - 1] = '\0'; + len = STRING_MAX - 1; + } else { + strcpy(buff, p); + } + if (len > (LYcols - 10)) { + buff[cut_pos] = '.'; + buff[cut_pos + 1] = '.'; + strcpy(buff + cut_pos + 2, (buff + len) - (LYcols - 10) + cut_pos + 1); + } + strcpy(s_str, buff); + return (s_str); +} + +#ifdef WIN_EX +/* + * Quote the path to make it safe for shell command processing. + * + * We use a simple technique which involves quoting the entire + * string using single quotes, escaping the real single quotes + * with double quotes. This may be gross but it seems to work. + */ +PUBLIC char * quote_pathname ARGS1( + char *, pathname) +{ + size_t n = 0; + char * result; + + if (strchr(pathname, ' ') != NULL) { + n = strlen(pathname); + result = (char *)malloc(n + 3); + if (result == NULL) + outofmem(__FILE__, "quote_pathname"); + result[0] = '"'; + strcpy(result + 1, pathname); + result[n+1] = '"'; + result[n+2] = '\0'; + } else { + result = strdup(pathname); + if (result == NULL) + outofmem(__FILE__, "quote_pathname"); + } + return result; +} +#endif /* WIN_EX */ + +#if 0 /* old version */ +void run_external_ ARGS1(char *, cmd) { char *the_command = 0; lynx_html_item_type *ext = 0; @@ -56,4 +169,221 @@ void run_external ARGS1(char *, cmd) return; } -#endif /* USE_EXTERNALS */ +#endif + + +void run_external ARGS1(char *, c) +{ +#ifdef WIN_EX + HANDLE handle; + int stat; + char pram_string[PATH_MAX]; + int redraw_flag; + extern int xsystem(char *cmd); +#endif + char command[1024]; + lynx_html_item_type *externals2 = 0; + + if (externals == NULL) + return; + +#ifdef WIN_EX /* 1998/01/26 (Mon) 09:16:13 */ + if (c == NULL) { + HTInfoMsg("Not exist external command"); + return; + } +#endif + + for (externals2 = externals; externals2 != NULL; + externals2 = externals2->next) { + +#ifdef WIN_EX + handle = GetForegroundWindow(); + CTRACE(tfp, "EXTERNAL: '%s' <==> '%s'\n", externals2->name, c); +#endif + if (externals2->command != 0 + && !strncasecomp(externals2->name, c, strlen(externals2->name))) + { + char *cp; + + if (no_externals && !externals2->always_enabled) { + HTUserMsg(EXTERNALS_DISABLED); + return; + } + /* Too dangerous to leave any URL that may come along unquoted. + * They often contain '&', ';', and '?' chars, and who knows + * what else may occur. + * Prevent spoofing of the shell. + * Dunno how this needs to be modified for VMS or DOS. - kw + */ +#if (defined(VMS) || defined(DOSPATH) || defined(__EMX__)) && !defined(WIN_EX) + sprintf(command, externals2->command, c); +#else /* Unix or DOS/Win: */ +#if defined(WIN_EX) + if (*c != '\"' && strchr(c, ' ') != NULL) { + cp = quote_pathname(c); + sprintf(command, externals2->command, cp); + FREE(cp); + } else { + strcpy(pram_string, c); + decode_string(pram_string); + c = pram_string; + + /* mailto: */ + if (strnicmp("mailto:", c, 7) == 0) { + sprintf(command, externals2->command, c + 7); + } + /* telnet:// */ + else if (strnicmp("telnet://", c, 9) == 0) { + char host[STRING_MAX]; + int last_pos; + + strcpy(host, c + 9); + last_pos = strlen(host) - 1; + if (last_pos > 1 && host[last_pos] == '/') + host[last_pos] = '\0'; + + sprintf(command, externals2->command, host); + } + /* file:// */ + else if (strnicmp("file://localhost/", c, 17) == 0) { + extern char windows_drive[]; + char e_buff[PATH_MAX], *p; + + p = c + 17; + if (strchr(p, ':') == NULL) { + sprintf(e_buff, "%s/%s", windows_drive, p); + } else { + strcpy(e_buff, p); + } + p = strrchr(e_buff, '.'); + if (p) { + p = strchr(p, '#'); + if (p) { + *p = '\0'; + } + } + if (*e_buff != '\"' && strchr(e_buff, ' ') != NULL) { + p = quote_pathname(e_buff); + strcpy(e_buff, p); + FREE(p); + } + + /* Less ==> short filename, + * less ==> long filename + */ + if (isupper(externals2->command[0])) { + sprintf(command, + externals2->command, HTDOS_short_name(e_buff)); + } else { + sprintf(command, externals2->command, e_buff); + } + } else { + sprintf(command, externals2->command, c); + } + } +#else /* Unix */ + cp = HTQuoteParameter(c); + sprintf(command, externals2->command, cp); + FREE(cp); +#endif +#endif /* VMS */ + + if (*command != '\0') { +#ifdef WIN_EX /* 1997/10/17 (Fri) 14:07:50 */ + int len; + char buff[PATH_MAX]; + + CTRACE(tfp, "Lynx EXTERNAL: '%s'\n", command); +#ifdef WIN_GUI /* 1997/11/06 (Thu) 14:17:15 */ + stat = MessageBox(handle, command, + "Lynx (EXTERNAL COMMAND EXEC)", + MB_ICONQUESTION | MB_SETFOREGROUND | MB_OKCANCEL); + if (stat == IDCANCEL) { + return; + } +#else + stat = HTConfirm(string_short(command, 40)); + if (stat == NO) { + return; + } +#endif + + len = strlen(command); + if (len > 255) { + sprintf(buff, "Lynx: command line too long (%d > 255)", len); +#ifdef WIN_GUI /* 1997/11/06 (Thu) 14:17:02 */ + MessageBox(handle, buff, + "Lynx (EXTERNAL COMMAND EXEC)", + MB_ICONEXCLAMATION | MB_SETFOREGROUND | MB_OK); + SetConsoleTitle("Lynx for Win32"); +#else + stat = HTConfirm(string_short(buff, 40)); +#endif + return; + } else { + SetConsoleTitle(command); + } +#endif + +#ifdef WIN_EX + if (strnicmp(command, "start ", 6) == 0) + redraw_flag = FALSE; + else + redraw_flag = TRUE; + + if (redraw_flag) { + stop_curses(); + fflush(stdout); + } +#else + HTUserMsg(command); + stop_curses(); +#endif + + /* command running. */ +#ifdef WIN_EX /* 1997/10/17 (Fri) 14:07:50 */ +#ifdef __CYGWIN__ + stat = system(command); +#else + stat = xsystem(command); +#endif + if (stat != 0) { + sprintf(buff, + "EXEC code = %04x (%2d, %2d)\r\n" + "'%s'", + stat, (stat / 256), (stat & 0xff), + command); +#ifdef SH_EX /* WIN_GUI for ERROR only */ + MessageBox(handle, buff, + "Lynx (EXTERNAL COMMAND EXEC)", + MB_ICONSTOP | MB_SETFOREGROUND | MB_OK); +#else + stat = HTConfirm(string_short(buff, 40)); +#endif /* 1 */ + } +#else /* Not WIN_EX */ + LYSystem(command); +#endif /* WIN_EX */ + +#if defined(WIN_EX) + SetConsoleTitle("Lynx for Win32"); +#endif + +#ifdef WIN_EX + if (redraw_flag) { + fflush(stdout); + start_curses(); + } +#else + fflush(stdout); + start_curses(); +#endif + } + return; + } /* end if */ + } /* end-for */ + + return; +} +#endif /* USE_EXTERNALS */ diff --git a/src/LYExtern.h b/src/LYExtern.h index 094f4ddc..66b49b21 100644 --- a/src/LYExtern.h +++ b/src/LYExtern.h @@ -6,5 +6,6 @@ #endif /* LYSTRUCTS_H */ void run_external PARAMS((char * c)); +char *string_short PARAMS((char * str, int cut_pos)); #endif /* EXTERNALS_H */ diff --git a/src/LYForms.c b/src/LYForms.c index 2f12576f..574a857a 100644 --- a/src/LYForms.c +++ b/src/LYForms.c @@ -130,8 +130,8 @@ PUBLIC int change_form_link ARGS7( c = 23; /* CTRL-W refresh without clearok */ else #endif /* FANCY_CURSES || USE_SLANG */ - c = 12; /* CTRL-L for repaint */ - break; + c = 12; /* CTRL-L for repaint */ + break; case F_RADIO_TYPE: if (form->disabled == YES) @@ -327,6 +327,9 @@ PRIVATE int form_getstr ARGS2( BOOL HaveMaxlength = FALSE; int action, repeat; int last_xlkc = -1; +#ifdef SUPPORT_MULTIBYTE_EDIT + BOOL refresh = TRUE; +#endif EditFieldData MyEdit; BOOLEAN Edited = FALSE; /* Value might be updated? */ @@ -420,6 +423,16 @@ again: get_mouse_link(); /* Reset mouse_link. */ ch = LYgetch_for(FOR_INPUT); +#ifdef SUPPORT_MULTIBYTE_EDIT +#ifdef WIN_EX + if (!refresh && (EditBinding(ch) != LYE_CHAR)) + goto again; +#else + if (!refresh && + (EditBinding(ch) != LYE_CHAR) && (EditBinding(ch) != LYE_AIX)) + goto again; +#endif +#endif /* SUPPORT_MULTIBYTE_EDIT */ #ifdef VMS if (HadVMSInterrupt) { HadVMSInterrupt = FALSE; @@ -427,9 +440,23 @@ again: } #endif /* VMS */ # ifdef NCURSES_MOUSE_VERSION - if (ch != -1 && (ch&LKC_ISLAC)) /* already lynxactioncode? */ + if (ch != -1 && (ch & LKC_ISLAC)) /* already lynxactioncode? */ break; /* @@@ maybe move these 2 lines outside ifdef -kw */ if (ch == MOUSE_KEY) { /* Need to process ourselves */ +#if defined(WIN_EX) + int curx, cury; + + request_mouse_pos(); + LYGetYX(cury, curx); + if (MOUSE_Y_POS == cury) { + repeat = MOUSE_X_POS - curx; + if (repeat < 0) { + ch = LTARROW; + repeat = - repeat; + } else + ch = RTARROW; + } +#else MEVENT event; int curx, cury; @@ -442,7 +469,9 @@ again: repeat = - repeat; } else ch = RTARROW; - } else { + } +#endif /* WIN_EX */ + else { /* Mouse event passed to us as MOUSE_KEY, and apparently * not on this field's line? Something is not as it * should be... @@ -466,6 +495,7 @@ again: } if (peek_mouse_link() != -1) break; + action = EditBinding(ch); if ((action & LYE_DF) && !(action & LYE_FORM_LAC)) { last_xlkc = ch; @@ -473,6 +503,7 @@ again: } else { last_xlkc = -1; } + if (action == LYE_SETM1) { /* * Set flag for modifier 1. @@ -510,9 +541,61 @@ again: #endif /* VMS */ break; } + +#if defined(WIN_EX) /* 1998/10/01 (Thu) 19:19:22 */ + +#define FORM_PASTE_MAX 8192 + + if (action == LYE_PASTE) { + unsigned char buff[FORM_PASTE_MAX]; + int i, len; + + len = get_clip(buff, FORM_PASTE_MAX); + + if (len > 0) { + i = 0; + while ((ch = buff[i]) != '\0') { + + if (ch == '\r') { + i++; + continue; + } + if (ch == '\n') { + i++; + len = strlen(buff + i); + if (len > 0) { + put_clip(buff + i); + } + break; + } + + LYLineEdit(&MyEdit, ch, TRUE); + + if (MyEdit.strlen >= max_length) { + HaveMaxlength = TRUE; + } else if (HaveMaxlength && + MyEdit.strlen < max_length) { + HaveMaxlength = FALSE; + _statusline(ENTER_TEXT_ARROWS_OR_TAB); + } + i++; + } + if (strcmp(value, MyEdit.buffer) != 0) { + Edited = TRUE; + } + LYRefreshEdit(&MyEdit); + + } else { + HTInfoMsg("Clipboard empty or Not text data."); + return(DO_NOTHING); + } + break; + } +#else if (action == LYE_AIX && (HTCJK == NOCJK && LYlowest_eightbit[current_char_set] > 0x97)) break; +#endif if (action == LYE_TAB) { ch = (int)('\t'); break; @@ -522,6 +605,13 @@ again: } if (LKC_TO_LAC(keymap,ch) == LYK_REFRESH) break; +#ifdef SH_EX +/* ASATAKU emacskey hack 1997/08/26 (Tue) 09:19:23 */ + if (emacs_keys && + (EditBinding(ch) == LYE_FORWW || EditBinding(ch) == LYE_BACKW)) + goto breakfor; +/* ASATAKU emacskey hack */ +#endif switch (ch) { #ifdef NOTDEFINED /* The first four are mapped to LYE_FORM_PASS now */ case DNARROW: @@ -539,7 +629,7 @@ again: * Left arrrow in column 0 deserves special treatment here, * else you can get trapped in a form without submit button! */ - case LTARROW: + case LTARROW: /* 1999/04/14 (Wed) 15:01:33 */ if (MyEdit.pos == 0 && repeat == -1) { int c = YES; /* Go back immediately if no changes */ if (strcmp(MyEdit.buffer, value)) { @@ -564,8 +654,23 @@ again: */ if (repeat < 0) repeat = 1; - while (repeat--) + while (repeat--) { +#ifndef SUPPORT_MULTIBYTE_EDIT LYLineEdit(&MyEdit, ch, TRUE); +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (LYLineEdit(&MyEdit, ch, TRUE) == 0) { + if (HTCJK != NOCJK && (0x80 <= ch) + && (ch <= 0xfe) && refresh) + refresh = FALSE; + else + refresh = TRUE; + } else { + if (!refresh) { + LYEdit1(&MyEdit, 0, LYE_DELP, TRUE); + } + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ + } if (MyEdit.strlen >= max_length) { HaveMaxlength = TRUE; } else if (HaveMaxlength && @@ -576,11 +681,14 @@ again: if (strcmp(value, MyEdit.buffer)) { Edited = TRUE; } +#ifdef SUPPORT_MULTIBYTE_EDIT + if (refresh) +#endif LYRefreshEdit(&MyEdit); LYSetLastTFPos(MyEdit.pos); } } -#ifdef NOTDEFINED +#if defined(NOTDEFINED) || defined(SH_EX) breakfor: #endif /* NOTDEFINED */ if (Edited) { @@ -705,7 +813,7 @@ PRIVATE int get_popup_option_number ARGS2( PRIVATE void paddstr ARGS3( WINDOW *, the_window, int, width, - char *, the_string) + char *, the_string) { width -= strlen(the_string); waddstr(the_window, the_string); @@ -869,10 +977,10 @@ PRIVATE int popup_options ARGS7( #ifdef PDCURSES keypad(form_window, TRUE); #endif /* PDCURSES */ -#ifdef NCURSES +#if defined(NCURSES) LYsubwindow(form_window); #endif -#if defined(HAVE_GETBKGD) /* not defined in ncurses 1.8.7 */ +#if defined(HAVE_GETBKGD) && !defined(PDCURSES)/* not defined in ncurses 1.8.7 */ wbkgd(form_window, getbkgd(stdscr)); wbkgdset(form_window, getbkgd(stdscr)); #endif @@ -895,9 +1003,9 @@ PRIVATE int popup_options ARGS7( : 1; /* * OH! I LOVE GOTOs! hack hack hack - * 07-11-94 GAB + * 07-11-94 GAB * MORE hack hack hack - * 09-05-94 FM + * 09-05-94 FM */ redraw: opt_ptr = list; @@ -975,9 +1083,17 @@ redraw: SLsmg_refresh(); #else wmove(form_window, ((i + 1) - window_offset), 2); +#if defined(WIN_EX) /* FIX */ + wattron(form_window, A_REVERSE); +#else wstart_reverse(form_window); +#endif paddstr(form_window, width, opt_ptr->name); +#if defined(WIN_EX) /* FIX */ + wattroff(form_window, A_REVERSE); +#else wstop_reverse(form_window); +#endif /* * If LYShowCursor is ON, move the cursor to the left * of the current option, so that blind users, who are @@ -1679,7 +1795,7 @@ restore_popup_statusline: } #ifndef USE_SLANG delwin(form_window); -#ifdef NCURSES +#if defined(NCURSES) LYsubwindow(0); #endif #endif /* !USE_SLANG */ diff --git a/src/LYGlobalDefs.h b/src/LYGlobalDefs.h index 9148285e..2bbe13f1 100644 --- a/src/LYGlobalDefs.h +++ b/src/LYGlobalDefs.h @@ -88,7 +88,7 @@ extern char *LYCgiDocumentRoot; /* DOCUMENT_ROOT in the lynxcgi env */ /* Values to which keypad_mode can be set */ #define NUMBERS_AS_ARROWS 0 #define LINKS_ARE_NUMBERED 1 -#define LINKS_AND_FORM_FIELDS_ARE_NUMBERED 2 +#define LINKS_AND_FIELDS_ARE_NUMBERED 2 #define HIDDENLINKS_MERGE 0 #define HIDDENLINKS_SEPARATE 1 @@ -384,6 +384,19 @@ extern BOOLEAN LYPrependCharsetToSource; extern BOOLEAN LYQuitDefaultYes; extern BOOLEAN LYNonRestartingSIGWINCH; extern BOOLEAN LYReuseTempfiles; +extern BOOLEAN dont_wrap_pre; + +#ifdef EXP_JUSTIFY_ELTS +extern BOOL ok_justify; +#endif + +#ifndef NO_DUMP_WITH_BACKSPACES +extern BOOLEAN with_backspaces; +#endif + +#ifndef NO_EMPTY_HREFLESS_A +extern BOOL force_empty_hrefless_a; +#endif #ifndef VMS extern BOOLEAN LYNoCore; @@ -392,4 +405,34 @@ extern BOOLEAN restore_sigpipe_for_children; extern int HTNoDataOK; /* HT_NO_DATA-is-ok hack */ +#ifdef WIN_EX +/* LYMain.c */ +extern int lynx_timeout; +extern BOOLEAN system_is_NT; +extern BOOLEAN focus_window; +#endif /* _WINDOWS */ + +#ifdef SH_EX +extern BOOLEAN show_cfg; +extern BOOLEAN mail_is_blat; +extern BOOLEAN no_table_center; +extern int debug_delay; +#endif + +#if !defined(__CYGWIN__) && defined(__CYGWIN32__) +#define __CYGWIN__ + +#define cygwin_conv_to_full_win32_path(p, q) \ + cygwin32_conv_to_full_win32_path(p, q) + +#define cygwin_conv_to_full_posix_path(p, q) \ + cygwin32_conv_to_full_posix_path(p, q) +#endif + +#if defined(__CYGWIN__) +extern void cygwin_conv_to_full_win32_path(char *posix, char *dos); +extern void cygwin_conv_to_full_posix_path(char *dos, char *posix); +extern int setmode(int handle, int amode); +#endif + #endif /* LYGLOBALDEFS_H */ diff --git a/src/LYJump.c b/src/LYJump.c index 5b185d0c..7bb03e8b 100644 --- a/src/LYJump.c +++ b/src/LYJump.c @@ -9,6 +9,10 @@ #include <LYLeaks.h> +#ifdef _WINDOWS +#include <stdlib.h> /* bsearch() */ +#endif + #ifdef VMS #include <fab.h> #endif /* VMS */ diff --git a/src/LYJustify.h b/src/LYJustify.h new file mode 100644 index 00000000..fb800bc2 --- /dev/null +++ b/src/LYJustify.h @@ -0,0 +1,75 @@ +/* Justification for lynx - implemented by Vlad Harchev <hvv@hippo.ru> + 11 July 1999 +*/ + +#ifndef LYJUSTIFY_H +#define LYJUSTIFY_H + +#include <HTUtils.h> + +#ifdef EXP_JUSTIFY_ELTS + +extern BOOL ok_justify; +extern BOOL can_justify_here; +extern BOOL can_justify_here_saved; + +extern BOOL can_justify_this_line; +extern int wait_for_this_stacked_elt; +extern BOOL form_in_htext; + +/*disabled by default*/ +/*#define DEBUG_JUSTIFY*/ +#ifdef DEBUG_JUSTIFY +extern BOOL can_justify_stack_depth;/* can be 0 or 1 if all code is correct*/ +# define CAN_JUSTIFY_STACK_INC ++can_justify_stack_depth;\ + assert(can_justify_stack_depth < 2 && can_justify_stack_depth >=0 ); +# define CAN_JUSTIFY_STACK_DEC --can_justify_stack_depth;\ + assert(can_justify_stack_depth < 2 && can_justify_stack_depth >=0 ); +#else +# define CAN_JUSTIFY_STACK_INC /* nothing */ +# define CAN_JUSTIFY_STACK_DEC /* nothing */ +#endif + +#define CAN_JUSTIFY_PUSH(x) can_justify_here_saved=can_justify_here;\ + can_justify_here=(x); CAN_JUSTIFY_STACK_INC +#define CAN_JUSTIFY_POP can_justify_here=can_justify_here_saved;\ + CAN_JUSTIFY_STACK_INC +#define CAN_JUSTIFY_SET(x) can_justify_here=(x); + +/* + * This is used to indicate that starting from the current offset in current + * line justification can take place (in order the gap between some prefix and + * the word not to be enlarged. + * For example, when forming OL, + * 1.21 foo + * ^justification can start here so that gap between 1.21 and "foo" + * will not be enlarged. + * This is a macro (that uses 'me'). + */ +#define CAN_JUSTIFY_START mark_justify_start_position(me->text); +#define CANT_JUSTIFY_THIS_LINE can_justify_this_line=FALSE; +#define EMIT_IFDEF_EXP_JUSTIFY_ELTS(x) x + /*defined in order not to wrap single line of code into #ifdef/#endif */ + +extern void ht_justify_cleanup NOPARAMS; +extern void mark_justify_start_position PARAMS((void* text)); + +#else /* ! EXP_JUSTIFY_ELTS */ + +/* + * define empty macros so that they can be used without wrapping them in + * #ifdef EXP_JUSTIFY_ELTS/#endif + */ + +#define CAN_JUSTIFY_PUSH(x) +#define CAN_JUSTIFY_POP +#define CAN_JUSTIFY_SET(x) +#define CAN_JUSTIFY_START +#define CANT_JUSTIFY_THIS_LINE +#define EMIT_IFDEF_EXP_JUSTIFY_ELTS(x) + +#endif /* EXP_JUSTIFY_ELTS */ + +#define CAN_JUSTIFY_PUSH_F CAN_JUSTIFY_PUSH(FALSE) + +#endif /* LYJUSTIFY_H */ diff --git a/src/LYKeymap.c b/src/LYKeymap.c index be169559..32a2e0eb 100644 --- a/src/LYKeymap.c +++ b/src/LYKeymap.c @@ -18,7 +18,7 @@ #ifdef EXP_KEYBOARD_LAYOUT PUBLIC int current_layout = 0; /* Index into LYKbLayouts[] */ -PUBLIC unsigned short * LYKbLayouts[]={ +PUBLIC LYKeymap_t * LYKbLayouts[]={ kb_layout_rot13, kb_layout_jcuken, kb_layout_yawerty @@ -70,11 +70,19 @@ LYK_ABORT, LYK_END, LYK_NEXT_PAGE, 0, LYK_HISTORY, LYK_FASTFORW_LINK, LYK_ACTIVATE, LYK_COOKIE_JAR, /* bs */ /* ht */ /* nl */ /* ^K */ +#ifdef SH_EX /* 1998/10/02 (Fri) 08:48:44 */ +LYK_CHG_KCODE, LYK_ACTIVATE, LYK_DOWN_TWO, 0, +/* ^L */ /* cr */ /* ^N */ /* ^O */ + +LYK_UP_TWO, LYK_CHG_CENTER, LYK_RELOAD, LYK_TO_CLIPBOARD, +/* ^P */ /* XON */ /* ^R */ /* ^S */ +#else LYK_REFRESH, LYK_ACTIVATE, LYK_DOWN_TWO, 0, /* ^L */ /* cr */ /* ^N */ /* ^O */ LYK_UP_TWO, 0, LYK_RELOAD, 0, /* ^P */ /* XON */ /* ^R */ /* XOFF */ +#endif LYK_TRACE_TOGGLE, 0, LYK_SWITCH_DTD, LYK_REFRESH, /* ^T */ /* ^U */ /* ^V */ /* ^W */ @@ -753,6 +761,11 @@ PRIVATE struct rmap revmap[] = { { "UPLOAD", "upload from your computer to the current directory" }, { "INSTALL", "install file or tagged files into a system area" }, #endif /* DIRED_SUPPORT */ +#ifdef SH_EX /* 1999/01/01 (Fri) 01:18:12 */ +{ "CHANGE_CENTER", "toggle center alignment in HTML TABLE" }, +{ "TO_CLIPBOARD", "link's URL to Clip Board" }, +{ "CHANGE_KCODE", "Change Kanji code" }, +#endif #endif /* VMS */ { NULL, "" } }; @@ -899,11 +912,11 @@ PUBLIC int lkcstring_to_lkc ARGS1( } #endif #endif - } - if (c < -1) - return (-1); - else - return c; + } + if (c < -1) + return (-1); + else + return c; } PRIVATE int LYLoadKeymap ARGS4 ( @@ -1022,7 +1035,7 @@ PUBLIC void set_vms_keys NOARGS keymap['$'+1] = LYK_SHELL; } -static char saved_vi_keys[4]; +static LYKeymap_t saved_vi_keys[4]; static BOOLEAN did_vi_keys; PUBLIC void set_vi_keys NOARGS @@ -1052,7 +1065,7 @@ PUBLIC void reset_vi_keys NOARGS did_vi_keys = FALSE; } -static char saved_emacs_keys[4]; +static LYKeymap_t saved_emacs_keys[4]; static BOOLEAN did_emacs_keys; PUBLIC void set_emacs_keys NOARGS @@ -1082,7 +1095,7 @@ PUBLIC void reset_emacs_keys NOARGS did_emacs_keys = FALSE; } -static char saved_number_keys[9]; +static LYKeymap_t saved_number_keys[9]; static BOOLEAN did_number_keys; PUBLIC void set_numbers_as_arrows NOARGS diff --git a/src/LYKeymap.h b/src/LYKeymap.h index 036e4c60..518864fe 100644 --- a/src/LYKeymap.h +++ b/src/LYKeymap.h @@ -32,7 +32,7 @@ extern LYKeymap_t keymap[KEYMAP_SIZE]; /* main keymap matrix */ #ifdef EXP_KEYBOARD_LAYOUT extern int current_layout; -extern unsigned short * LYKbLayouts[]; +extern LYKeymap_t * LYKbLayouts[]; extern char * LYKbLayoutNames[]; extern int LYSetKbLayout PARAMS((char *layout_id)); #endif @@ -58,9 +58,9 @@ extern LYKeymap_t key_override[]; /* Convert lynxkeycode to lynxactioncode. Modifiers are dropped. */ -#define LKC_TO_LAC(ktab,c) (((c)==-1) ? ktab[0] : \ - ((c)&LKC_ISLAC) ? ((c)&LAC_MASK) : \ - ktab[((c)&LKC_MASK)+1]) +#define LKC_TO_LAC(ktab,c) (((c) == -1) ? ktab[0] : \ + ((c) & LKC_ISLAC) ? ((c) & LAC_MASK) : \ + ktab[((c) & LKC_MASK) + 1]) /* Mask lynxactioncode as a lynxkeycode. */ @@ -197,6 +197,12 @@ typedef enum { #define LYK_TAG_LINK LYK_UNKNOWN #endif /* DIRED_SUPPORT */ +#ifdef SH_EX + , LYK_CHG_CENTER + , LYK_TO_CLIPBOARD + , LYK_CHG_KCODE +#endif /* SH_EX */ + } LYKeymapCodes; diff --git a/src/LYList.c b/src/LYList.c index f1e111ff..368e5a8c 100644 --- a/src/LYList.c +++ b/src/LYList.c @@ -125,7 +125,7 @@ PUBLIC int showlist ARGS2( * right in connection with always treating this file as * HIDDENLINKS_MERGE in GridText.c - kw */ - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { HText_FormDescNumber(cnt, (char **)&desc); fprintf(fp0, "<li><a id=%d href=\"#%d\">form field</a> = <em>%s</em>\n", @@ -288,7 +288,7 @@ PUBLIC void printlist ARGS2( * the list page match the numbering in the original document, * but won't create a forward link to the form. - FM && LE */ - if (keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) { + if (keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED) { HText_FormDescNumber(cnt, (char **)&desc); fprintf(fp, "%4d. form field = %s\n", cnt, desc); } diff --git a/src/LYLocal.c b/src/LYLocal.c index 7409535a..58eacbfb 100644 --- a/src/LYLocal.c +++ b/src/LYLocal.c @@ -348,6 +348,11 @@ PRIVATE BOOLEAN ok_localname ARGS2(char*, dst, CONST char*, src) PRIVATE int move_file ARGS2(char *, source, char *, target) { int code; +#ifdef WIN_EX /* 1999/01/02 (Sat) 23:24:20 */ + if ((code = rename(source, target)) != 0) + if ((code = LYCopyFile(source, target)) >= 0) + code = remove(source); +#else char *msg = 0; char *args[5]; @@ -358,6 +363,7 @@ PRIVATE int move_file ARGS2(char *, source, char *, target) args[3] = (char *) 0; code = (LYExecv(MV_PATH, args, msg) <= 0) ? -1 : 1; FREE(msg); +#endif return code; } @@ -2318,7 +2324,7 @@ PRIVATE int LYExecv ARGS3( char **, argv, char *, msg) { -#if defined(VMS) || defined(_WINDOWS) +#if defined(VMS) || defined(SH_EX) || defined(_WINDOWS) CTRACE(tfp, "LYExecv: Called inappropriately!\n"); return(0); #else diff --git a/src/LYMail.c b/src/LYMail.c index 37764eab..1112eb2e 100644 --- a/src/LYMail.c +++ b/src/LYMail.c @@ -27,6 +27,90 @@ BOOLEAN term_letter; /* Global variable for async i/o. */ PRIVATE void terminate_letter PARAMS((int sig)); PRIVATE void remove_tildes PARAMS((char *string)); +#ifdef _WINDOWS +#define system(p) xsystem(p) /* 1998/06/05 (Fri) 21:53:30 */ +#endif + +#ifdef SH_EX /* 1999/01/03 (Sun) 22:00:47 */ + +extern BOOLEAN mail_is_blat; + +/* +syntax: +Blat <filename> -t <recipient> [optional switches (see below)] + +<filename> : file with the message body +-t <recipient>: recipient list (comma separated) +-s <subj> : subject line +-f <sender> : overrides the default sender address (must be known to server) +-i <addr> : a 'From:' address, not necessarily known to the SMTP server. +-c <recipient>: carbon copy recipient list (comma separated) +-b <recipient>: blind carbon copy recipient list (comma separated) +-h : displays this help. +-mime : MIME Quoted-Printable Content-Transfer-Encoding. +-q : supresses *all* output. +-server <addr>: overrides the default SMTP server to be used. + +*/ + +static char bl_cmd_file[512]; + +PRIVATE void blat_clean() +{ + if (bl_cmd_file[0]) { + bl_cmd_file[0] = '\0'; + } +} + +PRIVATE char *blat_cmd( + char *mail_cmd, + char *filename, + char *address, + char *subject, + char *ccaddr, + char *mail_addr +) +{ + FILE *fp; + static char b_cmd[512]; +#ifdef __CYGWIN__ + char dosname[LY_MAXPATH]; +#endif + + if ((fp = LYOpenTemp(bl_cmd_file, ".blt", "w")) == NULL) { + HTAlert(FORM_MAILTO_FAILED); + return NULL; + } + +#ifdef __CYGWIN__ + cygwin_conv_to_full_win32_path(filename, dosname); + fprintf(fp, "%s\n", dosname); +#else + fprintf(fp, "%s\n", filename); +#endif + fprintf(fp, "-t\n%s\n", address); + if (subject) + fprintf(fp, "-s\n%s\n", subject); + if (mail_addr && strlen(mail_addr) > 0) { + fprintf(fp, "-f\n%s\n", mail_addr); + } + if (ccaddr && strlen(ccaddr) > 0) { + fprintf(fp, "-c\n%s\n", ccaddr); + } + fclose(fp); + +#ifdef __CYGWIN__ + cygwin_conv_to_full_win32_path(bl_cmd_file, dosname); + sprintf(b_cmd, "%s \"@%s\"", mail_cmd, dosname); +#else + sprintf(b_cmd, "%s @%s", mail_cmd, bl_cmd_file); +#endif + + return b_cmd; +} + +#endif /* SH_EX */ + /* HTUnEscape with control-code nuking */ PRIVATE void SafeHTUnEscape ARGS1( char *, string) @@ -53,8 +137,8 @@ PRIVATE void SafeHTUnEscape ARGS1( ** mailform() sends form content to the mailto address(es). - FM */ PUBLIC void mailform ARGS4( - CONST char *, mailto_address, - CONST char *, mailto_subject, + CONST char *, mailto_address GCC_UNUSED, + CONST char *, mailto_subject GCC_UNUSED, CONST char *, mailto_content, CONST char *, mailto_type) { @@ -62,23 +146,26 @@ PUBLIC void mailform ARGS4( char *address = NULL; char *ccaddr = NULL; char *keywords = NULL; - char *searchpart = NULL; - char *cp = NULL, *cp0 = NULL, *cp1 = NULL; + char *cp = NULL; char subject[80]; - char self[80]; char cmd[512]; - int len, i, ch; -#if defined(VMS) || defined(DOSPATH) - char my_tmpfile[LY_MAXPATH]; - char *command = NULL; + int len, i; #ifdef VMS char *address_ptr1, *address_ptr2; - BOOLEAN first = TRUE; -#endif BOOLEAN isPMDF = FALSE; - char hdrfile[LY_MAXPATH]; + BOOLEAN first = TRUE; FILE *hfd; + char hdrfile[LY_MAXPATH]; +#endif +#if defined(VMS) || defined(DOSPATH) || defined(SH_EX) + int ch; + char self[80]; + char *searchpart = NULL; + char *cp0 = NULL, *cp1 = NULL; + char *command = NULL; + char my_tmpfile[LY_MAXPATH]; +#ifdef VMS if (!strncasecomp(system_mail, "PMDF SEND", 9)) { isPMDF = TRUE; } @@ -334,7 +421,7 @@ PUBLIC void mailform ARGS4( } } -#if defined(VMS) || defined(DOSPATH) +#if defined(VMS) || defined(DOSPATH) || defined(SH_EX) if ((fd = LYOpenTemp(my_tmpfile, ".txt", "w")) == NULL) { HTAlert(FORM_MAILTO_FAILED); FREE(address); @@ -342,6 +429,8 @@ PUBLIC void mailform ARGS4( FREE(keywords); return; } +#endif +#ifdef VMS if (isPMDF) { if ((hfd = LYOpenTemp(hdrfile, ".txt", "w")) == NULL) { HTAlert(FORM_MAILTO_FAILED); @@ -352,7 +441,6 @@ PUBLIC void mailform ARGS4( return; } } -#ifdef VMS if (isPMDF) { if (mailto_type && *mailto_type) { fprintf(hfd, "Mime-Version: 1.0\n"); @@ -369,6 +457,22 @@ PUBLIC void mailform ARGS4( */ fprintf(fd, "X-Content-Type: %s\n\n", mailto_type); } +#else /* !VMS (DOS) */ +#ifdef SH_EX + if (mail_is_blat) { + if (strlen(subject) > 70) + subject[70] = '\0'; + } else { + if (mailto_type && *mailto_type) { + fprintf(fd, "Mime-Version: 1.0\n"); + fprintf(fd, "Content-Type: %s\n", mailto_type); + } + fprintf(fd,"To: %s\n", address); + if (personal_mail_address && *personal_mail_address) + fprintf(fd,"From: %s\n", personal_mail_address); + remove_tildes(self); + fprintf(fd,"Subject: %.70s\n\n", subject); + } #else if (mailto_type && *mailto_type) { fprintf(fd, "Mime-Version: 1.0\n"); @@ -379,9 +483,10 @@ PUBLIC void mailform ARGS4( fprintf(fd,"From: %s\n", personal_mail_address); remove_tildes(self); fprintf(fd,"Subject: %.70s\n\n", subject); +#endif /* SH_EX */ #endif -#else +#else /* !(defined(VMS) || defined(DOSPATH) || defined(SH_EX)) */ sprintf(cmd, "%s %s", system_mail, system_mail_flags); if ((fd = popen(cmd, "w")) == NULL) { HTAlert(FORM_MAILTO_FAILED); @@ -438,11 +543,11 @@ PUBLIC void mailform ARGS4( if (len) fprintf(fd, "%s\n", &mailto_content[i]); -#ifdef UNIX +#if defined(UNIX) && !defined(__CYGWIN__) pclose(fd); sleep(MessageSecs); #endif /* UNIX */ -#if defined(VMS) || defined(DOSPATH) +#if defined(VMS) || defined(DOSPATH) || defined(SH_EX) LYCloseTempFP(fd); #ifdef VMS /* @@ -554,25 +659,51 @@ PUBLIC void mailform ARGS4( stop_curses(); printf("%s\n\n$ %s\n\n%s", SENDING_FORM_CONTENT, command, PLEASE_WAIT); - LYSystem(command); + LYSystem(command); /* Mail (VMS) */ FREE(command); sleep(AlertSecs); start_curses(); LYRemoveTemp(my_tmpfile); LYRemoveTemp(hdrfile); #else /* DOSPATH */ +#ifdef SH_EX /* 1998/05/04 (Mon) 22:18:44 */ + if (mail_is_blat) { + StrAllocCopy(command, + blat_cmd( + system_mail, + my_tmpfile, + address, + subject, + ccaddr, + personal_mail_address + ) + ); + } else { + /* for sendmail.exe */ + StrAllocCopy(command, system_mail); + StrAllocCat(command, " -t \""); + StrAllocCat(command, address); + StrAllocCat(command, "\" -F "); + StrAllocCat(command, my_tmpfile); + } +#else /* !SH_EX */ StrAllocCopy(command, system_mail); StrAllocCat(command, " -t \""); StrAllocCat(command, address); StrAllocCat(command, "\" -F "); StrAllocCat(command, my_tmpfile); +#endif stop_curses(); printf("%s\n\n$ %s\n\n%s", SENDING_FORM_CONTENT, command, PLEASE_WAIT); - LYSystem(command); + LYSystem(command); /* Mail sending form content (DOS/Windows) */ FREE(command); sleep(MessageSecs); start_curses(); LYRemoveTemp(my_tmpfile); +#ifdef SH_EX + if (mail_is_blat) + blat_clean(); +#endif /* SH_EX */ #endif #endif /* VMS */ @@ -599,16 +730,21 @@ PUBLIC void mailmsg ARGS4( #ifdef ALERTMAIL BOOLEAN skip_parsing = FALSE; #endif -#if defined(VMS) || defined(DOSPATH) +#if defined(DOSPATH) || defined(WIN_EX) + char *ccaddr; + char subject[128]; +#endif +#if defined(VMS) || defined(DOSPATH) || defined(WIN_EX) char my_tmpfile[LY_MAXPATH]; - char *command = NULL; +#endif #ifdef VMS char *address_ptr1, *address_ptr2; BOOLEAN first = TRUE; -#endif BOOLEAN isPMDF = FALSE; char hdrfile[LY_MAXPATH]; FILE *hfd; + char *command = NULL; + BOOLEAN first = TRUE; CTRACE(tfp, "mailmsg(%d, \"%s\", \"%s\", \"%s\")\n", cur, owner_address?owner_address:"<nil>", @@ -618,7 +754,7 @@ PUBLIC void mailmsg ARGS4( if (!strncasecomp(system_mail, "PMDF SEND", 9)) { isPMDF = TRUE; } -#endif /* VMS || DOSPATH */ +#endif /* VMS */ #ifdef ALERTMAIL if (owner_address == NULL) { @@ -721,17 +857,15 @@ PUBLIC void mailmsg ARGS4( address[(strlen(address) - 1)] = '\0'; if (*address == '\0') { FREE(address); - CTRACE(tfp, "mailmsg: No address in '%s'.\n", - owner_address); + CTRACE(tfp, "mailmsg: No address in '%s'.\n", owner_address); return; } -#ifdef UNIX +#if defined(UNIX) && !defined(__CYGWIN__) HTSprintf0(&cmd, "%s %s", system_mail, system_mail_flags); if ((fd = popen(cmd, "w")) == NULL) { FREE(address); - CTRACE(tfp, "mailmsg: '%s' failed.\n", - cmd); + CTRACE(tfp, "mailmsg: '%s' failed.\n", cmd); return; } @@ -743,17 +877,16 @@ PUBLIC void mailmsg ARGS4( fprintf(fd, "X-URL: %s\n", filename); fprintf(fd, "X-Mailer: Lynx, Version %s\n\n", LYNX_VERSION); #endif /* UNIX */ -#if defined(VMS) || defined(DOSPATH) +#if defined(VMS) || defined(DOSPATH) || defined(WIN_EX) if ((fd = LYOpenTemp(my_tmpfile, ".txt", "w")) == NULL) { - CTRACE(tfp, "mailmsg: Could not fopen '%s'.\n", - my_tmpfile); + CTRACE(tfp, "mailmsg: Could not fopen '%s'.\n", my_tmpfile); FREE(address); return; } +#ifdef VMS if (isPMDF) { if ((hfd = LYOpenTemp(hdrfile, ".txt", "w")) == NULL) { - CTRACE(tfp, "mailmsg: Could not fopen '%s'.\n", - hdrfile); + CTRACE(tfp, "mailmsg: Could not fopen '%s'.\n", hdrfile); FREE(address); return; } @@ -764,7 +897,11 @@ PUBLIC void mailmsg ARGS4( fprintf(fd, "X-URL: %s\n", filename); fprintf(fd, "X-Mailer: Lynx, Version %s\n\n", LYNX_VERSION); } +#else + sprintf(subject, "Lynx Error in %.56s", filename); + ccaddr = personal_mail_address; #endif /* VMS */ +#endif /* VMS || DOSPATH */ fprintf(fd, gettext("The link %s :?: %s \n"), links[cur].lname, links[cur].target); @@ -776,16 +913,16 @@ PUBLIC void mailmsg ARGS4( fprintf(fd, "%s\n", gettext("This message was automatically generated by")); fprintf(fd, gettext("Lynx ver. %s"), LYNX_VERSION); if ((LynxSigFile != NULL) && - (fp = fopen(LynxSigFile, "r")) != NULL) { + (fp = fopen(LynxSigFile, TXT_R)) != NULL) { fputs("-- \n", fd); while (LYSafeGets(&cmd, fp) != NULL) fputs(cmd, fd); fclose(fp); } -#ifdef UNIX +#if defined(UNIX) && !defined(__CYGWIN__) pclose(fd); #endif /* UNIX */ -#if defined(VMS) || defined(DOSPATH) +#if defined(VMS) || defined(DOSPATH) || defined(WIN_EX) LYCloseTempFP(fd); #ifdef VMS if (isPMDF) { @@ -838,10 +975,10 @@ PUBLIC void mailmsg ARGS4( HTSprintf0(&cmd, mail_adrs, address_ptr1); StrAllocCat(command, cmd); first = FALSE; - address_ptr1 = address_ptr2; + address_ptr1 = address_ptr2; } while (address_ptr1 != NULL); - LYSystem(command); + LYSystem(command); /* VMS */ FREE(command); FREE(cmd); LYRemoveTemp(my_tmpfile); @@ -849,14 +986,33 @@ PUBLIC void mailmsg ARGS4( LYRemoveTemp(hdrfile); } #else /* DOSPATH */ - StrAllocCopy(command, system_mail); - StrAllocCat(command, " -t \""); - StrAllocCat(command, address); - StrAllocCat(command, "\" -F "); - StrAllocCat(command, my_tmpfile); - LYSystem(command); +#ifdef SH_EX + if (mail_is_blat) + strcpy(cmd, + blat_cmd( + system_mail, + my_tmpfile, + address, + subject, + ccaddr, + personal_mail_address + ) + ); + else + sprintf(cmd, "%s -t \"%s\" -F %s", system_mail, address, my_tmpfile); +#else /* !SH_EX */ + sprintf(cmd, "%s -t \"%s\" -F %s", system_mail, address, my_tmpfile); +#endif /* SH_EX */ + LYSystem(cmd); /* Mail (DOS/Windows) */ + +#if 0 /* Not SH_EX */ FREE(command); +#endif LYRemoveTemp(my_tmpfile); +#ifdef SH_EX + if (mail_is_blat) + blat_clean(); +#endif #endif #endif /* VMS */ @@ -901,10 +1057,10 @@ PUBLIC void reply_by_mail ARGS4( int i, len; int c = 0; /* user input */ char my_tmpfile[LY_MAXPATH], cmd[512]; -#ifdef DOSPATH +#if defined(DOSPATH) || defined(WIN_EX) char tmpfile2[LY_MAXPATH]; #endif -#if defined(DOSPATH) || defined(VMS) +#if defined(DOSPATH) || defined(WIN_EX) || defined(VMS) char *command = NULL; #endif #ifndef NO_ANONYMOUS_EMAIL @@ -922,7 +1078,7 @@ PUBLIC void reply_by_mail ARGS4( isPMDF = TRUE; } #else - char buf[512]; + char buf[4096]; /* 512 */ char *header = NULL; int n; #endif /* VMS */ @@ -1249,7 +1405,7 @@ PUBLIC void reply_by_mail ARGS4( } #endif /* NO_ANONYMOUS_MAIL */ } -#else /* Unix: */ +#else /* Unix/DOS/Windows */ /* * Put the To: line in the header. */ @@ -1483,6 +1639,12 @@ PUBLIC void reply_by_mail ARGS4( #ifdef VMS sprintf(subject, "%.70s", user_input); #else +#ifdef SH_EX + if (mail_is_blat) + sprintf(subject, "%.70s", user_input); +#else /* @@@ */ + sprintf(subject, "%.70s", user_input); +#endif StrAllocCat(header, "Subject: "); StrAllocCat(header, user_input); StrAllocCat(header, "\n"); @@ -1529,7 +1691,7 @@ PUBLIC void reply_by_mail ARGS4( } } -#ifdef DOSPATH +#if defined(DOSPATH) || defined(SH_EX) if (*address) { StrAllocCat(header, "To: "); StrAllocCat(header, address); @@ -1610,7 +1772,7 @@ PUBLIC void reply_by_mail ARGS4( sprintf(user_input, "%s%s %s", editor, editor_arg, my_tmpfile); _statusline(SPAWNING_EDITOR_FOR_MAIL); stop_curses(); - if (LYSystem(user_input)) { + if (LYSystem(user_input)) { /* Spawn Editor */ start_curses(); HTAlert(ERROR_SPAWNING_EDITOR); } else { @@ -1708,7 +1870,7 @@ PUBLIC void reply_by_mail ARGS4( goto cleanup; } if ((body == NULL && LynxSigFile != NULL) && - (fp = fopen(LynxSigFile, "r")) != NULL) { + (fp = fopen(LynxSigFile, TXT_R)) != NULL) { LYStatusLine = (LYlines - 1); if (term_letter) { _user_message(APPEND_SIG_FILE, LynxSigFile); @@ -1721,7 +1883,7 @@ PUBLIC void reply_by_mail ARGS4( } LYStatusLine = -1; if (c == YES) { - if ((fd = fopen(my_tmpfile, "a")) != NULL) { + if ((fd = fopen(my_tmpfile, TXT_A)) != NULL) { char *buffer = NULL; fputs("-- \n", fd); while (LYSafeGets(&buffer, fp) != NULL) { @@ -1847,18 +2009,18 @@ PUBLIC void reply_by_mail ARGS4( stop_curses(); printf("%s\n\n$ %s\n\n%s", SENDING_COMMENT, command, PLEASE_WAIT); - LYSystem(command); + LYSystem(command); /* SENDING COMMENT (VMS) */ FREE(command); sleep(AlertSecs); start_curses(); goto cleandown; -#else /* not VMS: */ +#else /* Unix/DOS/Windows */ /* * Send the tmpfile into sendmail. */ _statusline(SENDING_YOUR_MSG); sprintf(cmd, "%s %s", system_mail, system_mail_flags); -#ifdef DOSPATH +#if defined(DOSPATH) || defined(WIN_EX) if ((fp = LYOpenTemp(tmpfile2, ".txt", "w")) == NULL) { HTAlert(MAILTO_URL_TEMPOPEN_FAILED); return; @@ -1871,33 +2033,64 @@ PUBLIC void reply_by_mail ARGS4( goto cleanup; } #endif /* DOSPATH */ - fd = fopen(my_tmpfile, "r"); + fd = fopen(my_tmpfile, TXT_R); if (fd == NULL) { HTInfoMsg(COMMENT_REQUEST_CANCELLED); pclose(fp); goto cleanup; } +#ifdef SH_EX + if (!mail_is_blat) + fputs(header, fp); +#else fputs(header, fp); - while ((n = fread(buf, 1, sizeof(buf), fd)) != 0) +#endif + while ((n = fread(buf, 1, sizeof(buf), fd)) != 0) { fwrite(buf, 1, n, fp); -#ifdef DOSPATH + } +#if defined(DOSPATH) || defined(SH_EX) +#ifdef SH_EX /* 1998/05/04 (Mon) 22:40:35 */ + if (mail_is_blat) { + StrAllocCopy(command, + blat_cmd( + system_mail, + tmpfile2, + address, + subject, + ccaddr, + personal_mail_address + ) + ); + } else { + StrAllocCopy(command, system_mail); + StrAllocCat(command, " -t \""); + StrAllocCat(command, address); + StrAllocCat(command, "\" -F "); + StrAllocCat(command, tmpfile2); + } +#else /* DOSPATH */ StrAllocCopy(command, system_mail); StrAllocCat(command, " -t \""); StrAllocCat(command, address); StrAllocCat(command, "\" -F "); StrAllocCat(command, tmpfile2); +#endif /* SH_EX */ LYCloseTempFP(fp); /* Close the tmpfile. */ stop_curses(); printf("%s\n\n$ %s\n\n%s", SENDING_COMMENT, command, PLEASE_WAIT); - LYSystem(command); + LYSystem(command); /* SENDING COMMENT (DOS/Windows/Unix) */ FREE(command); sleep(MessageSecs); start_curses(); LYRemoveTemp(tmpfile2); /* Delete the tmpfile. */ -#else - pclose(fp); +#ifdef SH_EX + if (mail_is_blat) + blat_clean(); #endif - LYCloseTempFP(fd); /* Close the tmpfile. */ +#else /* !DOSPATH */ + pclose(fp); +#endif /* DOSPATH */ + fclose(fd); /* Close the tmpfile. */ CTRACE(tfp, "%s\n", cmd); #endif /* VMS */ @@ -1907,21 +2100,24 @@ PUBLIC void reply_by_mail ARGS4( */ cleanup: signal(SIGINT, cleanup_sig); -#if !defined(VMS) && !defined(DOSPATH) +#if !defined(VMS) && !defined(DOSPATH) || defined(SH_EX) FREE(header); #endif /* !VMS */ -#if defined(VMS) || defined(DOSPATH) +#if defined(VMS) cleandown: #endif /* VMS */ term_letter = FALSE; #ifdef VMS FREE(command); + while (LYRemoveTemp(my_tmpfile) == 0) + ; /* Delete the tmpfile(s). */ if (isPMDF) { - LYRemoveTemp(hdrfile); + LYRemoveTemp(hdrfile); /* Delete the hdrfile. */ } +#else + LYRemoveTemp(my_tmpfile); /* Delete the tmpfile. */ #endif /* VMS */ - LYRemoveTemp(my_tmpfile); FREE(address); FREE(ccaddr); FREE(keywords); @@ -1934,7 +2130,7 @@ PRIVATE void terminate_letter ARGS1(int,sig GCC_UNUSED) term_letter = TRUE; /* Reassert the AST */ signal(SIGINT, terminate_letter); -#if defined(VMS) || defined(DOSPATH) +#if defined(VMS) || defined(DOSPATH) || defined(WIN_EX) /* * Refresh the screen to get rid of the "interrupt" message. */ diff --git a/src/LYMain.c b/src/LYMain.c index 1c7f6c87..84a9ab1c 100644 --- a/src/LYMain.c +++ b/src/LYMain.c @@ -275,6 +275,34 @@ PUBLIC BOOLEAN local_host_only = FALSE; PUBLIC BOOLEAN override_no_download = FALSE; PUBLIC BOOLEAN show_dotfiles = FALSE; /* From rcfile if no_dotfiles is false */ PUBLIC BOOLEAN LYforce_HTML_mode = FALSE; + +#ifdef WIN_EX +#undef SYSTEM_MAIL +#undef SYSTEM_MAIL_FLAGS +#define SYSTEM_MAIL "BLATJ" +#define SYSTEM_MAIL_FLAGS "" +PUBLIC BOOLEAN focus_window = FALSE; /* 1998/10/05 (Mon) 17:18:42 */ +PUBLIC char windows_drive[4]; /* 1998/01/13 (Tue) 21:13:24 */ +#endif + +#ifdef _WINDOWS +#define TIMEOUT 180 /* 1998/03/30 (Mon) 14:50:44 */ +PUBLIC int lynx_timeout = TIMEOUT; +PUBLIC CRITICAL_SECTION critSec_DNS; /* 1998/09/03 (Thu) 22:01:56 */ +PUBLIC CRITICAL_SECTION critSec_READ; /* 1998/09/03 (Thu) 22:01:56 */ +#endif /* _WINDOWS */ + +#if defined(WIN_EX) +PUBLIC BOOLEAN system_is_NT = FALSE; +#endif + +#ifdef SH_EX +PUBLIC BOOLEAN show_cfg = FALSE; +PUBLIC BOOLEAN mail_is_blat = TRUE; +PUBLIC int debug_delay = 0; /* 1998/10/06 (Tue) 08:41:20 */ +PUBLIC BOOLEAN no_table_center = FALSE; /* 1998/10/09 (Fri) 15:12:49 */ +#endif /* SH_EX */ + PUBLIC char *editor = NULL; /* the name of the current editor */ PUBLIC char *jumpfile = NULL; /* the name of the default jumps file */ PUBLIC char *jumpprompt = NULL; /* the default jumps prompt */ @@ -401,6 +429,19 @@ PUBLIC BOOLEAN LYPreparsedSource = FALSE; /* Show source as preparsed? */ PUBLIC BOOLEAN LYPrependBaseToSource = TRUE; PUBLIC BOOLEAN LYPrependCharsetToSource = TRUE; PUBLIC BOOLEAN LYQuitDefaultYes = QUIT_DEFAULT_YES; +PUBLIC BOOLEAN dont_wrap_pre = FALSE; + +#ifdef EXP_JUSTIFY_ELTS +PUBLIC BOOL ok_justify = TRUE; +#endif + +#ifndef NO_DUMP_WITH_BACKSPACES +PUBLIC BOOLEAN with_backspaces = FALSE; +#endif + +#ifndef NO_EMPTY_HREFLESS_A +PUBLIC BOOL force_empty_hrefless_a = FALSE; +#endif #ifdef DISP_PARTIAL PUBLIC BOOLEAN display_partial_flag = TRUE; /* Display document during download */ @@ -440,6 +481,12 @@ PRIVATE HTList *LYStdinArgs = NULL; #define EXTENDED_STARTFILE_RECALL 1 #endif +#ifndef OPTNAME_ALLOW_DASHES +/* if set, then will allow dashes and underscores to be used interchangeable + in commandline option's names - VH */ +#define OPTNAME_ALLOW_DASHES 1 +#endif + #if EXTENDED_OPTION_LOGIC PRIVATE BOOLEAN no_options_further=FALSE; /* set to TRUE after '--' argument */ #endif @@ -480,6 +527,20 @@ PRIVATE void reset_break(void) } #endif /* __DJGPP__ */ +#if defined(WIN_EX) +PUBLIC int is_windows_nt(void) +{ + DWORD version; + + version = GetVersion(); + if ((version & 0x80000000) == 0) + return 1; + else + return 0; +} +#endif + + #ifdef LY_FIND_LEAKS PRIVATE void free_lynx_globals NOARGS { @@ -661,7 +722,18 @@ PRIVATE int argcmp ARGS2( char*, what) { if (str[0] == '-' && str[1] == '-' ) ++str; +#if !OPTNAME_ALLOW_DASHES return strcmp(str,what); +#else + ++str; ++what; /*skip leading dash in both strings*/ + { + int l1 = strlen(str); + int l2 = strlen(what); + if (l1 != l2) + return 1; /* this function simulates strcmp!*/ + return !strn_dash_equ(str, what, l2); + } +#endif } PRIVATE int argncmp ARGS2( @@ -669,7 +741,12 @@ PRIVATE int argncmp ARGS2( char*, what) { if (str[0] == '-' && str[1] == '-' ) ++str; +#if OPTNAME_ALLOW_DASHES return strncmp(str, what, strlen(what)); +#else + ++str; ++what; /*skip leading dash in both strings*/ + return !strn_dash_equ(str, what, strlen(what)); +#endif } /* @@ -704,11 +781,35 @@ PUBLIC int main ARGS2( { printf(gettext("No Winsock found, sorry.")); sleep(5); - return; + return 1; } } + + /* 1998/09/03 (Thu) 22:02:32 */ + InitializeCriticalSection(&critSec_DNS); + InitializeCriticalSection(&critSec_READ); + #endif /* _WINDOWS */ +#if defined(__CYGWIN__) && defined(DOSPATH) + if (strcmp(ttyname(fileno(stdout)), "/dev/conout") != 0) { + printf("please \"$CYGWIN=notty\"\n"); + exit(0); + } +#endif + +#if defined(WIN_EX) + /* 1997/10/19 (Sun) 21:40:54 */ + system_is_NT = is_windows_nt(); + + /* 1998/01/13 (Tue) 21:13:47 */ + GetWindowsDirectory(filename, sizeof filename); + windows_drive[0] = filename[0]; + windows_drive[1] = filename[1]; + windows_drive[2] = '\0'; +#endif + + #ifdef __DJGPP__ if (LY_get_ctrl_break() == 0) { LY_set_ctrl_break(TRUE); @@ -740,6 +841,12 @@ PUBLIC int main ARGS2( * Set up the argument list. */ pgm = argv[0]; + cp = NULL; +#ifdef DOSPATH + if ((cp = strrchr(pgm, '\\')) != NULL) { + pgm = cp + 1; + } else if (cp == NULL) +#endif if ((cp = strrchr(pgm, '/')) != NULL) { pgm = cp + 1; } @@ -751,6 +858,11 @@ PUBLIC int main ARGS2( if (argncmp(argv[i], "-help") == 0) { parse_arg(&argv[i], &i); } +#ifdef SH_EX + if (strncmp(argv[i], "-show_cfg", 9) == 0) { + show_cfg = TRUE; + } +#endif } #ifdef LY_FIND_LEAKS @@ -849,9 +961,9 @@ PUBLIC int main ARGS2( #endif #if defined (DOSPATH) || defined (__EMX__) else if ((cp = getenv("TEMP")) != NULL) - StrAllocCopy(lynx_temp_space, HTDOS_name(cp)); + StrAllocCopy(lynx_temp_space, HTSYS_name(cp)); else if ((cp = getenv("TMP")) != NULL) - StrAllocCopy(lynx_temp_space, HTDOS_name(cp)); + StrAllocCopy(lynx_temp_space, HTSYS_name(cp)); #endif else #ifdef TEMP_SPACE @@ -1190,7 +1302,14 @@ PUBLIC int main ARGS2( /* * Set up the TRACE log path, and logging if appropriate. - FM */ - LYAddPathToHome(LYTraceLogPath = malloc(LY_MAXPATH), LY_MAXPATH, "Lynx.trace"); +#ifdef FNAMES_8_3 + LYAddPathToHome(LYTraceLogPath = + malloc(LY_MAXPATH), LY_MAXPATH, "LY-TRACE.LOG"); +#else + LYAddPathToHome(LYTraceLogPath = + malloc(LY_MAXPATH), LY_MAXPATH, "Lynx.trace"); +#endif + LYOpenTraceLog(); /* @@ -1346,7 +1465,7 @@ PUBLIC int main ARGS2( } #endif /* USE_HASH */ -#if USE_COLOR_TABLE +#ifdef USE_COLOR_TABLE /* * Set up default foreground and background colors. */ @@ -1541,6 +1660,13 @@ PUBLIC int main ARGS2( #endif /* SYSLOG_REQUESTED_URLS */ #endif /* !VMS */ +#ifdef SH_EX + if (show_cfg) { + cleanup(); + exit(0); + } +#endif + #ifdef USE_SLANG if (LYShowColor >= SHOW_COLOR_ON && !(Lynx_Color_Flags & SL_LYNX_USE_COLOR)) { @@ -1773,7 +1899,7 @@ PUBLIC int main ARGS2( ftp_ok = !no_inside_ftp && !no_outside_ftp && ftp_ok; rlogin_ok = !no_inside_rlogin && !no_outside_rlogin && rlogin_ok; #else - CTRACE(tfp,"LYMain.c: User in Local domain\n"); + CTRACE(tfp,"LYMain: User in Local domain\n"); telnet_ok = !no_inside_telnet && telnet_ok; #ifndef DISABLE_NEWS news_ok = !no_inside_news && news_ok; @@ -1782,7 +1908,7 @@ PUBLIC int main ARGS2( rlogin_ok = !no_inside_rlogin && rlogin_ok; #endif /* !HAVE_UTMP || VMS */ } else { - CTRACE(tfp,"LYMain.c: User in REMOTE domain\n"); + CTRACE(tfp,"LYMain: User in REMOTE domain\n"); telnet_ok = !no_outside_telnet && telnet_ok; #ifndef DISABLE_NEWS news_ok = !no_outside_news && news_ok; @@ -1832,7 +1958,7 @@ PUBLIC int main ARGS2( if (!nolist && !crawl && /* For -crawl it has already been done! */ (keypad_mode == LINKS_ARE_NUMBERED || - keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED)) + keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED)) printlist(stdout,FALSE); #ifdef EXP_PERSISTENT_COOKIES /* @@ -1856,7 +1982,13 @@ PUBLIC int main ARGS2( cache_tag_styles(); #endif - ena_csi((LYlowest_eightbit[current_char_set] > 155)); +#ifndef NO_DUMP_WITH_BACKSPACES + if (with_backspaces) { + /* we should warn about this somehow (nop for now) -VH */ + with_backspaces = FALSE; + } +#endif + ena_csi((BOOLEAN)(LYlowest_eightbit[current_char_set] > 155)); LYOpenCloset(); status = mainloop(); LYCloseCloset(); @@ -2671,6 +2803,22 @@ static int version_fun ARGS1( "See http://lynx.browser.org/ and the online help for more information.\n\n" )); +#ifdef SH_EX +#ifdef __CYGWIN__ + printf("Compiled by CYGWIN (%s %s).\n", __DATE__, __TIME__); +#else +#ifdef __BORLANDC__ + printf("Compiled by Borland C++ (%s %s).\n", __DATE__, __TIME__); +#else +#ifdef _MSC_VER + printf("Compiled by Microsoft Visual C++ (%s %s).\n", __DATE__, __TIME__); +#else + printf("Compiled at (%s %s).\n", __DATE__, __TIME__); +#endif /* _MSC_VER */ +#endif /* __BORLANDC__ */ +#endif /* __CYGWIN__ */ +#endif /* SH_EX */ + SetOutputMode( O_BINARY ); exit(0); @@ -2744,6 +2892,12 @@ static Parse_Args_Type Arg_Table [] = "case", SET_ARG, &case_sensitive, "enable case sensitive user searching" ), +#ifdef SH_EX + PARSE_SET( + "center", TOGGLE_ARG, &no_table_center, + "Toggle center alignment in HTML TABLE" + ), +#endif PARSE_STR( "cfg", IGNORE_ARG|NEED_NEXT_ARG, 0, "=FILENAME\nspecifies a lynx.cfg file other than the default" @@ -2785,10 +2939,20 @@ with -dump, format output as with -traversal, but to stdout" "incremental display stages with MessageSecs delay" ), #endif +#ifdef SH_EX + PARSE_SET( + "delay", NEED_INT_ARG, &debug_delay, + "=NNN\nset the NNN msec delay at statusline message" + ), +#endif PARSE_FUN( "display", NEED_FUNCTION_ARG, display_fun, "=DISPLAY\nset the display variable for X exec'ed programs" ), + PARSE_SET( + "dont_wrap_pre", SET_ARG, &dont_wrap_pre, + "inhibit wrapping of text in <pre> when -dump'ing and -crawl'ing" + ), PARSE_FUN( "dump", FUNCTION_ARG, dump_output_fun, "dump the first file to stdout and exit" @@ -2844,6 +3008,12 @@ keys (may be incompatible with some curses packages)" "from", TOGGLE_ARG, &LYNoFromHeader, "toggle transmissions of From headers" ), +#ifndef NO_EMPTY_HREFLESS_A + PARSE_SET( + "force_empty_hrefless_a", SET_ARG, &force_empty_hrefless_a, + "force HREF-less 'A' elements to be empy (close them as soon as they are seen)" + ), +#endif #if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU) PARSE_SET( "forms_options", TOGGLE_ARG, &LYUseFormsOptions, @@ -2890,6 +3060,12 @@ keys (may be incompatible with some curses packages)" "ismap", TOGGLE_ARG, &LYNoISMAPifUSEMAP, "toggles inclusion of ISMAP links when client-side\nMAPs are present" ), +#ifdef EXP_JUSTIFY_ELTS + PARSE_SET( + "justify", SET_ARG, &ok_justify, + "do justification of text" + ), +#endif PARSE_INT( "link", NEED_INT_ARG, &ccount, "=NUMBER\nstarting count for lnk#.dat files produced by -crawl" @@ -2913,6 +3089,8 @@ keys (may be incompatible with some curses packages)" "toggles minimal versus valid comment parsing" ), #ifndef DISABLE_NEWS +#endif +#ifndef DISABLE_NEWS PARSE_FUN( "newschunksize", NEED_FUNCTION_ARG, newschunksize_fun, "=NUMBER\nnumber of articles in chunked news listings" @@ -2922,6 +3100,12 @@ keys (may be incompatible with some curses packages)" "=NUMBER\nmaximum news articles in listings before chunking" ), #endif +#ifdef SH_EX + PARSE_SET( + "noblat", TOGGLE_ARG, &mail_is_blat, + "select mail tool (`BLAT' ==> `sendmail')" + ), +#endif PARSE_FUN( "nobrowse", FUNCTION_ARG, nobrowse_fun, "disable directory browsing" @@ -3026,7 +3210,8 @@ to visualize how lynx behaves with invalid HTML" ), PARSE_SET( "raw", UNSET_ARG, &LYUseDefaultRawMode, - "toggles default setting of 8-bit character translations\nor CJK mode for the startup character set" + "toggles default setting of 8-bit character translations\n\ +or CJK mode for the startup character set" ), PARSE_SET( "realm", SET_ARG, &check_realm, @@ -3054,6 +3239,12 @@ with the PREV_DOC command or from the History List" "selective", FUNCTION_ARG, selective_fun, "require .www_browsable files to browse directories" ), +#ifdef SH_EX + PARSE_SET( + "show_cfg", SET_ARG, &show_cfg, + "Show `LYNX.CFG' setting" + ), +#endif PARSE_SET( "show_cursor", TOGGLE_ARG, &LYUseDefShoCur, "toggles hiding of the cursor in the lower right corner" @@ -3099,6 +3290,12 @@ treated '>' as a co-terminator for double-quotes and tags" "tlog", IGNORE_ARG, 0, "toggles use of a Lynx Trace Log for the current session" ), +#ifdef _WINDOWS + PARSE_SET( + "timeout", SET_ARG, &lynx_timeout, + "set TCP/IP timeout" + ), +#endif PARSE_SET( "trace", IGNORE_ARG, 0, "turns on Lynx trace mode" @@ -3141,6 +3338,12 @@ treated '>' as a co-terminator for double-quotes and tags" "width", NEED_FUNCTION_ARG, width_fun, "=NUMBER\nscreen width for formatting of dumps (default is 80)" ), +#ifndef NO_DUMP_WITH_BACKSPACES + PARSE_SET( + "with_backspaces", SET_ARG, &with_backspaces, + "emit backspaces in output if -dumping or -crawling (like 'man' does)" + ), +#endif {NULL, 0, 0, NULL} }; @@ -3277,6 +3480,9 @@ static int arg_eqs_parse ARGS3( return 0; } } else { +#if OPTNAME_ALLOW_DASHES + if (!(*a == '_' && *b == '-')) +#endif return 0; } } @@ -3317,6 +3523,18 @@ PRIVATE void parse_arg ARGS2( #endif StrAllocCopy(startfile, arg_name); LYTrimStartfile(startfile); +#ifdef _WINDOWS /* 1998/01/14 (Wed) 20:11:17 */ + HTUnEscape(startfile); + { + char *p; + + p = startfile; + while (*p++) { + if (*p == '|') + *p = ':'; + } + } +#endif return; } #if EXTENDED_OPTION_LOGIC @@ -3487,6 +3705,19 @@ Do NOT mail the core file if one was generated.\r\n"); if (sig != 0) { fprintf(stderr, "\r\n\ Lynx now exiting with signal: %d\r\n\r\n", sig); +#ifdef WIN_EX /* 1998/08/09 (Sun) 09:58:25 */ + { + char *msg; + switch (sig) { + case SIGABRT: msg = "SIGABRT"; break; + case SIGFPE: msg = "SIGFPE"; break; + case SIGILL: msg = "SIGILL"; break; + case SIGSEGV: msg = "SIGSEGV"; break; + default: msg = "Not-def"; break; + } + fprintf(stderr, "signal code = %s\n", msg); + } +#endif } /* diff --git a/src/LYMainLoop.c b/src/LYMainLoop.c index 47ac1d67..3d7a737f 100644 --- a/src/LYMainLoop.c +++ b/src/LYMainLoop.c @@ -39,6 +39,107 @@ #include <LYMainLoop.h> #include <LYPrettySrc.h> +#if defined(CJK_EX) /* 1999/05/25 (Tue) 11:10:45 */ +#include <HTCJK.h> +extern HTCJKlang HTCJK; +extern char *string_short(char *str, int cut_pos); /* LYExtern.c */ + +#define CHARSET_TRANS 14 /* "Transparent" in LYCharSets.c */ + +PRIVATE char *str_sjis(char *to, char *from) +{ + if (!LYRawMode) { + strcpy(to, from); + } else if (last_kcode == EUC) { + EUC_TO_SJIS(from, to); + } else if (last_kcode == SJIS) { + strcpy(to, from); + } else { + TO_SJIS(from, to); + } + return to; +} + +PUBLIC char *str_kcode(HTkcode code) +{ + char *p; + static char buff[8]; + + if (current_char_set == CHARSET_TRANS) { + p = "THRU"; + } else { + if (!LYRawMode) { + p = "RAW"; + } else { + switch (code) { + case NOKANJI: + p = "AUTO"; + break; + + case EUC: + p = "EUC+"; + break; + + case SJIS: + p = "SJIS"; + break; + + case JIS: + p = " JIS"; + break; + + default: + p = " ???"; + break; + } + } + } + +#ifdef SH_EX /* 1999/05/25 (Tue) 11:12:05 */ + if (no_table_center) { + buff[0] = '!'; + strcpy(buff + 1, p); + } else { + strcpy(buff, p); + } +#else + strcpy(buff, p); +#endif + + return buff; +} + + +PUBLIC void set_ws_title(char * str) +{ +#ifdef WIN_EX + SetConsoleTitle(str); +#endif +} + +/* 1998/10/30 (Fri) 10:06:47 */ + +#define NOT_EQU 1 + +PRIVATE int str_n_cmp(const char *p, const char *q, int n) +{ + if (n == 0) + return 0; + + if (p == NULL) + return NOT_EQU; + + if (q == NULL) + return NOT_EQU; + + return strncmp(p, q, n); +} + +#undef strncmp +#define strncmp(p, q, r) str_n_cmp(p, q, r) + +#endif /* SH_EX */ + #ifdef USE_EXTERNALS #include <LYExtern.h> #endif @@ -239,9 +340,9 @@ PRIVATE int do_change_link ARGS1( int mouse_tmp = get_mouse_link(); /* If yes, use it as the link */ if (mouse_tmp != -1) { - if (curdoc.link >= 0 && curdoc.link < nlinks && - curdoc.link != mouse_tmp) { - highlight(OFF, curdoc.link, prev_target); + if (curdoc.link >= 0 && curdoc.link < nlinks + && curdoc.link != mouse_tmp) { + highlight(OFF, curdoc.link, prev_target); } if (mouse_tmp < 0 || mouse_tmp >= nlinks) { char *msgtmp = NULL; @@ -268,6 +369,15 @@ PRIVATE int do_change_link ARGS1( int mainloop NOARGS { +#if defined(SH_EX) /* 1997/10/08 (Wed) 14:52:06 */ +#undef STRING_MAX +#define STRING_MAX 4096 + char title_buff[STRING_MAX]; + char temp_buff[STRING_MAX]; + +#define BUFF_MAX 1024 + char sjis_buff[BUFF_MAX]; +#endif int c = 0, real_c = 0, old_c = 0; int cmd = LYK_DO_NOTHING, real_cmd = LYK_DO_NOTHING; int getresult; @@ -1155,22 +1265,22 @@ try_again: * WINDOW structures are already filled based on the old size. * So we notify the ncurses library directly here. - kw */ -#ifdef NCURSES_VERSION /* FIXME: check for specific version? */ +#if defined(NCURSES_VERSION) && !defined(PDCURSES) /* FIXME: check for specific version? */ resizeterm(LYlines, LYcols); #else - stop_curses(); - start_curses(); - clear(); + stop_curses(); + start_curses(); + clear(); #endif - refresh_screen = TRUE; /* to force a redraw */ - if (HTMainText) /* to REALLY force it... - kw */ - HText_setStale(HTMainText); - recent_sizechange = FALSE; - if (user_mode == NOVICE_MODE) { - display_lines = LYlines-4; - } else { - display_lines = LYlines-2; - } + refresh_screen = TRUE; /* to force a redraw */ + if (HTMainText) /* to REALLY force it... - kw */ + HText_setStale(HTMainText); + recent_sizechange = FALSE; + if (user_mode == NOVICE_MODE) { + display_lines = LYlines-4; + } else { + display_lines = LYlines-2; + } } if (www_search_result != -1) { @@ -1446,6 +1556,74 @@ try_again: } +#if defined(SH_EX) /* 1997/10/08 (Wed) 14:52:06 */ + if (nlinks > 0) { + char *p = "LYNX (unknown link type)"; + + /* Show the URL & kanji code . */ + if (strlen(links[curdoc.link].lname) == 0) { + + if (links[curdoc.link].type == WWW_FORM_LINK_TYPE) + + switch(links[curdoc.link].form->type) { + case F_TEXT_SUBMIT_TYPE: + case F_SUBMIT_TYPE: + case F_IMAGE_SUBMIT_TYPE: + p = "[SUBMIT]"; + break; + case F_PASSWORD_TYPE: + p = "Password"; + break; + case F_OPTION_LIST_TYPE: + p = "Option list"; + break; + case F_CHECKBOX_TYPE: + p = "Check box"; + break; + case F_RADIO_TYPE: + p = "[Radio]"; + break; + case F_RESET_TYPE: + p = "[Reset]"; + break; + case F_TEXT_TYPE: + p = "Text input"; + break; + case F_TEXTAREA_TYPE: + p = "Text input lines"; + break; + default: + break; + } + set_ws_title(p); + } else { + if (user_mode == ADVANCED_MODE) { + p = curdoc.title; + } else { + p = links[curdoc.link].lname; + } + + if (strlen(p) < 500) { + strcpy(temp_buff, p); + if (strchr(temp_buff, '%')) { + HTUnEscape(temp_buff); + } + str_sjis(sjis_buff, temp_buff); + SetConsoleTitle(string_short(sjis_buff, 10)); + } + } + } else { + if (strlen(curdoc.address) < 1000) { + if (user_mode == ADVANCED_MODE) { + str_sjis(temp_buff, curdoc.title); + } else { + strcpy(temp_buff, curdoc.address); + } + set_ws_title(HTUnEscape(temp_buff)); + } + } +#endif /* SH_EX */ + /* * Report unread or new mail, if appropriate. */ @@ -1749,6 +1927,11 @@ new_keyboard_input: } /* right link not NULL or link to another site*/ } /* traversal */ +#ifdef WIN_EX + if (c == DO_NOTHING) + cmd = LYK_DO_NOTHING; + else +#endif cmd = LKC_TO_LAC(keymap,c); /* adds 1 to map EOF to 0 */ #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) @@ -1778,9 +1961,9 @@ new_cmd: /* show_main_statusline(links[curdoc.link]); else if (more) - _statusline(MOREHELP); + HTInfoMsg(MOREHELP); else - _statusline(HELP); + HTInfoMsg(HELP); show_help = TRUE; if (TRACE) { @@ -2071,6 +2254,18 @@ new_cmd: /* LYforce_no_cache = TRUE; break; +#ifdef SH_EX /* 1999/01/01 (Fri) */ + case LYK_CHG_CENTER: /* ^Q */ + + if (no_table_center) { + no_table_center = FALSE; + HTInfoMsg("TABLE center enable."); + } else { + no_table_center = TRUE; + HTInfoMsg("TABLE center disable."); + } + /* goto RELOAD */ +#endif case LYK_RELOAD: /* control-R to reload and refresh */ /* * Check if this is a reply from a POST, and if so, @@ -2448,6 +2643,43 @@ new_cmd: /* } break; +#if defined(SH_EX) && defined(DOSPATH) /*1997/12/22 (Mon) 09:28:56 */ + case LYK_TO_CLIPBOARD: /* ^S */ + { + if (put_clip(links[curdoc.link].lname) == 0) { + HTInfoMsg("URL to Clip Borad."); + } else { + HTInfoMsg("Current URL is empty."); + } + } + break; +#endif + +#if defined(CJK_EX) && defined(SH_EX) /* 1999/02/25 (Thu) 15:29:05 */ + case LYK_CHG_KCODE: /* ^L */ + if (LYRawMode && (HTCJK == JAPANESE)) { + switch(last_kcode) { + case NOKANJI: + last_kcode = SJIS; + break; + case SJIS: + last_kcode = EUC; + break; + case EUC: + last_kcode = NOKANJI; + break; + default: + break; + } + } + move(0, 0); + lynx_start_title_color (); + addstr(str_kcode(last_kcode)); + lynx_stop_title_color (); + + break; +#endif + case LYK_REFRESH: refresh_screen = TRUE; lynx_force_repaint(); @@ -3045,7 +3277,7 @@ new_cmd: /* } } /* fall through to LYK_ACTIVATE */ - case LYK_ACTIVATE: /* follow a link */ + case LYK_ACTIVATE: /* follow a link */ case LYK_SUBMIT: /* follow a link, submit TEXT_SUBMIT input */ if (do_change_link(prev_target) == -1) { LYforce_no_cache = FALSE; @@ -3739,6 +3971,37 @@ new_cmd: /* } check_recall: +#ifdef WIN_EX /* 1998/10/11 (Sun) 10:41:05 */ + { + int len; + char last_2, last_1, last; + + len = strlen(user_input_buffer); + + if (len >= 3) { + + last_2 = user_input_buffer[len - 3]; + last_1 = user_input_buffer[len - 2]; + last = user_input_buffer[len - 1]; + + if (last_2 == '/' && isalpha(last_1) && last == ':') + LYAddHtmlSep0(user_input_buffer); + + } else if (len == 2) { + if (user_input_buffer[1] == ':') { + if (isalpha(user_input_buffer[0])) + LYAddHtmlSep0(user_input_buffer); + else { + HTUserMsg2(WWW_ILLEGAL_URL_MESSAGE, + user_input_buffer); + strcpy(user_input_buffer, temp); + FREE(temp); + break; + } + } + } + } +#endif /* * Get rid of leading spaces (and any other spaces). */ @@ -4042,6 +4305,11 @@ check_goto_URL: } } else { +#ifdef CJK_EX /* 1997/12/13 (Sat) 15:20:18 */ + if (HTCJK == JAPANESE) { + last_kcode = NOKANJI; /* AUTO */ + } +#endif StrAllocCopy(newdoc.address, indexfile); StrAllocCopy(newdoc.title, gettext("System Index")); /* name it */ FREE(newdoc.post_data); @@ -4596,6 +4864,15 @@ if (!LYUseFormsOptions) { } /* + * If we're in a forms TEXTAREA, invoke the editor on it. + */ + if (links[curdoc.link].type == WWW_FORM_LINK_TYPE && + links[curdoc.link].form->type == F_TEXTAREA_TYPE) { + cmd = LYK_EDIT_TEXTAREA; + goto new_cmd; + } + + /* * If we're in a forms TEXT type, tell user the request * is bogus (though in reality, without this trap, if the * document with the TEXT field is local, the editor *would* @@ -5389,6 +5666,11 @@ check_add_bookmark_to_self: refresh_screen = TRUE; break; } +#if defined(CJK_EX) /* 1997/12/13 (Sat) 15:20:18 */ + if (HTCJK == JAPANESE) { + last_kcode = NOKANJI; /* AUTO */ + } +#endif LYforce_no_cache = TRUE; /*force the document to be reloaded*/ StrAllocCopy(newdoc.title, BOOKMARK_TITLE); StrAllocCopy(newdoc.bookmark, BookmarkPage); @@ -5409,11 +5691,15 @@ check_add_bookmark_to_self: } break; - case LYK_SHELL: /* shell escape */ + case LYK_SHELL: /* (!) shell escape */ if (!no_shell) { stop_curses(); printf("%s\r\n", SPAWNING_MSG); +#if defined(__CYGWIN_) && defined(DOSPATH) + Cygwin_Shell(); +#else LYSystem(LYSysShell()); +#endif start_curses(); refresh_screen = TRUE; /* for an HText_pageDisplay() */ } else { @@ -6409,9 +6695,9 @@ PRIVATE void show_main_statusline ARGS1( _statusline(buf); } else if (more) { if (user_mode == NOVICE_MODE) - _statusline(MORE); + _statusline(MORE); else - _statusline(MOREHELP); + _statusline(MOREHELP); } else { _statusline(HELP); } diff --git a/src/LYNews.c b/src/LYNews.c index 1b27f644..538f1287 100644 --- a/src/LYNews.c +++ b/src/LYNews.c @@ -25,6 +25,10 @@ BOOLEAN term_message = FALSE; PRIVATE void terminate_message PARAMS((int sig)); +#ifdef CJK_EX /* 1998/05/15 (Fri) 09:10:38 */ +extern HTCJKlang HTCJK; +#endif + PRIVATE BOOLEAN message_has_content ARGS1( CONST char *, filename) { @@ -213,6 +217,23 @@ PUBLIC char *LYNewsPost ARGS2( * Add the default subject. */ kp = LYSkipCBlanks(kp); +#ifdef CJK_EX /* 1998/05/15 (Fri) 09:10:38 */ + if (HTCJK == JAPANESE) { + CJKinput[0] = '\0'; + switch(kanji_code) { + case EUC: + TO_EUC(kp, CJKinput); + kp = CJKinput; + break; + case SJIS: + TO_SJIS(kp, CJKinput); + kp = CJKinput; + break; + default: + break; + } + } +#endif if (strncasecomp(kp, "Re:", 3)) { strcat(user_input, "Re: "); } @@ -238,8 +259,9 @@ PUBLIC char *LYNewsPost ARGS2( } else if (((org = getenv("NEWS_ORGANIZATION")) != NULL) && *org != '\0') { StrAllocCat(cp, org); -#ifndef VMS - } else if ((fp = fopen("/etc/organization", "r")) != NULL) { + } +#ifdef UNIX + else if ((fp = fopen("/etc/organization", "r")) != NULL) { char *buffer = 0; if (LYSafeGets(&buffer, fp) != NULL) { if ((org = strchr(buffer, '\n')) != NULL) { @@ -251,8 +273,31 @@ PUBLIC char *LYNewsPost ARGS2( } FREE(buffer); fclose(fp); -#endif /* !VMS */ } +#else +#ifdef _WINDOWS /* 1998/05/14 (Thu) 17:47:01 */ + else { + char *p, fname[256]; + + strcpy(fname, LynxSigFile); + p = strrchr(fname, '/'); + if (p) { + strcpy(p + 1, "LYNX_ETC.TXT"); + if ((fp = fopen(fname, TXT_R)) != NULL) { + if (fgets(user_input, sizeof(user_input), fp) != NULL) { + if ((org = strchr(user_input, '\n')) != NULL) { + *org = '\0'; + } + if (user_input[0] != '\0') { + StrAllocCat(cp, user_input); + } + } + fclose(fp); + } + } + } +#endif /* _WINDOWS */ +#endif /* !UNIX */ LYstrncpy(user_input, cp, (sizeof(user_input) - 16)); FREE(cp); addstr(gettext("\n\n Please provide or edit the Organization: header\n")); @@ -375,7 +420,7 @@ PUBLIC char *LYNewsPost ARGS2( clear(); /* clear the screen */ goto cleanup; } - if ((LynxSigFile != NULL) && (fp = fopen(LynxSigFile, "r")) != NULL) { + if ((LynxSigFile != NULL) && (fp = fopen(LynxSigFile, TXT_R)) != NULL) { char *msg = NULL; HTSprintf0(&msg, APPEND_SIG_FILE, LynxSigFile); @@ -406,7 +451,7 @@ PUBLIC char *LYNewsPost ARGS2( * use the temp file as is. - FM */ if (CJKfile[0] != '\0') { - if ((fd = fopen(my_tempfile, "r")) != NULL) { + if ((fd = fopen(my_tempfile, TXT_R)) != NULL) { char *buffer = NULL; while (LYSafeGets(&buffer, fd) != NULL) { TO_JIS((unsigned char *)buffer, diff --git a/src/LYOptions.c b/src/LYOptions.c index 7bc6e1d0..3028c965 100644 --- a/src/LYOptions.c +++ b/src/LYOptions.c @@ -1683,15 +1683,15 @@ draw_options: case '>': /* Save current options to RC file. */ if (!no_option_save) { - _statusline(SAVING_OPTIONS); + HTInfoMsg(SAVING_OPTIONS); if (save_rc()) { LYrcShowColor = LYChosenShowColor; - _statusline(OPTIONS_SAVED); + HTInfoMsg(OPTIONS_SAVED); } else { HTAlert(OPTIONS_NOT_SAVED); } } else { - _statusline(R_TO_RETURN_TO_LYNX); + HTInfoMsg(R_TO_RETURN_TO_LYNX); /* * Change response so that we don't exit * the options menu. @@ -1706,9 +1706,9 @@ draw_options: default: if (!no_option_save) { - _statusline(SAVE_OR_R_TO_RETURN_TO_LYNX); + HTInfoMsg(SAVE_OR_R_TO_RETURN_TO_LYNX); } else { - _statusline(R_TO_RETURN_TO_LYNX); + HTInfoMsg(R_TO_RETURN_TO_LYNX); } } /* end switch */ } /* end while */ @@ -2023,13 +2023,13 @@ draw_bookmark_list: */ if (response == '>') { if (!no_option_save) { - _statusline(SAVING_OPTIONS); + HTInfoMsg(SAVING_OPTIONS); if (save_rc()) - _statusline(OPTIONS_SAVED); + HTInfoMsg(OPTIONS_SAVED); else HTAlert(OPTIONS_NOT_SAVED); } else { - _statusline(R_TO_RETURN_TO_LYNX); + HTInfoMsg(R_TO_RETURN_TO_LYNX); /* * Change response so that we don't exit * the options menu. @@ -2372,7 +2372,7 @@ PUBLIC int popup_choice ARGS7( lx = 1; } } - + /* * Set up the overall window, including the boxing characters ('*'), * if it all fits. Otherwise, set up the widest window possible. - FM @@ -2393,7 +2393,7 @@ PUBLIC int popup_choice ARGS7( #ifdef NCURSES LYsubwindow(form_window); #endif -#if defined(HAVE_GETBKGD) /* not defined in ncurses 1.8.7 */ +#if defined(HAVE_GETBKGD) && !defined(PDCURSES)/* not defined in ncurses 1.8.7 */ wbkgd(form_window, getbkgd(stdscr)); wbkgdset(form_window, getbkgd(stdscr)); #endif @@ -2525,9 +2525,17 @@ redraw: #else wmove(form_window, ((i + 1) - window_offset), 2); waddstr(form_window, Cnum); +#if defined(WIN_EX) /* 1997/10/18 (Sat) 00:10:51 */ + wattron(form_window, A_REVERSE); +#else wstart_reverse(form_window); +#endif waddstr(form_window, Cptr[i]); +#if defined(WIN_EX) /* 1997/10/18 (Sat) 00:10:58 */ + wattroff(form_window, A_REVERSE); +#else wstop_reverse(form_window); +#endif /* * If LYShowCursor is ON, move the cursor to the left * of the current choice, so that blind users, who are @@ -3267,7 +3275,7 @@ static char * keypad_mode_string = "keypad_mode"; static OptValues keypad_mode_values[] = { { NUMBERS_AS_ARROWS, "Numbers act as arrows", "number_arrows" }, { LINKS_ARE_NUMBERED, "Links are numbered", "links_numbered" }, - { LINKS_AND_FORM_FIELDS_ARE_NUMBERED, + { LINKS_AND_FIELDS_ARE_NUMBERED, "Links and form fields are numbered", "links_and_forms" }, { 0, 0, 0 }}; @@ -3299,12 +3307,14 @@ static char * vi_keys_string = "vi_keys"; /* * Document Layout */ +#ifndef SH_EX /* 1999/01/19 (Tue) */ static char * DTD_recovery_string = "DTD"; static OptValues DTD_type_values[] = { /* Old_DTD variable */ { TRUE, "relaxed (TagSoup mode)", "tagsoup" }, { FALSE, "strict (SortaSGML mode)", "sortasgml" }, { 0, 0, 0 }}; +#endif static char * select_popups_string = "select_popups"; static char * images_string = "images"; static char * images_ignore_all_string = "ignore"; @@ -3690,6 +3700,7 @@ PUBLIC int postoptions ARGS1( case_sensitive = code; } +#ifndef SH_EX /* 1999/01/19 (Tue) */ /* HTML error tolerance: SELECT */ if (!strcmp(data[i].tag, DTD_recovery_string) && GetOptValues(DTD_type_values, data[i].value, &code)) { @@ -3699,6 +3710,7 @@ PUBLIC int postoptions ARGS1( need_reload = TRUE; } } +#endif /* Select Popups: ON/OFF */ if (!strcmp(data[i].tag, select_popups_string) @@ -3895,7 +3907,7 @@ PUBLIC int postoptions ARGS1( /* * charset settings: the order is essential here. */ - if (display_char_set_old != current_char_set) { + if (display_char_set_old != current_char_set) { /* * Set the LYUseDefaultRawMode value and character * handling if LYRawMode was changed. - FM @@ -3906,7 +3918,7 @@ PUBLIC int postoptions ARGS1( if (assume_char_set_changed) { LYRawMode = (UCLYhndl_for_unspec == current_char_set); } - if (raw_mode_old != LYRawMode || assume_char_set_changed) { + if (raw_mode_old != LYRawMode || assume_char_set_changed) { /* * Set the raw 8-bit or CJK mode defaults and * character set if changed. - FM @@ -3924,10 +3936,10 @@ PUBLIC int postoptions ARGS1( FREE(newdoc->post_data); FREE(data); if (save_all) { - _statusline(SAVING_OPTIONS); + HTInfoMsg(SAVING_OPTIONS); if (save_rc()) { LYrcShowColor = LYChosenShowColor; - _statusline(OPTIONS_SAVED); + HTInfoMsg(OPTIONS_SAVED); } else { HTAlert(OPTIONS_NOT_SAVED); } @@ -3941,7 +3953,7 @@ PUBLIC int postoptions ARGS1( CTRACE(tfp, " need_reload = %s\n", need_reload ? "TRUE" : "FALSE"); CTRACE(tfp, " need_end_reload = %s\n", - need_end_reload ? "TRUE" : "FALSE"); + need_end_reload ? "TRUE" : "FALSE"); /* Options menu was pushed before postoptions(), so pop-up. */ LYpop(newdoc); @@ -4344,11 +4356,13 @@ PRIVATE int gen_options ARGS1( PutOptValues(fp0, LYRawMode, bool_values); EndSelect(fp0); +#ifndef SH_EX /* 1999/01/19 (Tue) */ /* HTML error recovery: SELECT */ PutLabel(fp0, gettext("HTML error recovery")); BeginSelect(fp0, DTD_recovery_string); PutOptValues(fp0, Old_DTD, DTD_type_values); EndSelect(fp0); +#endif /* Select Popups: ON/OFF */ PutLabel(fp0, gettext("Popups for select fields")); diff --git a/src/LYPrint.c b/src/LYPrint.c index 489e88ae..9a80ede4 100644 --- a/src/LYPrint.c +++ b/src/LYPrint.c @@ -21,6 +21,10 @@ #define CancelPrint(msg) HTInfoMsg(msg); goto done #define CannotPrint(msg) HTAlert(msg); goto done +#ifdef WIN_EX +static BOOLEAN mail_is_blat = FALSE; +#endif + /* * printfile prints out the current file minus the links and targets * to a variety of places @@ -362,7 +366,7 @@ check_recall: */ CTRACE(tfp, "LYPrint: filename is %s, action is `%c'\n", buffer, c); -#if HAVE_POPEN +#if HAVE_POPEN || !defined(__CYGWIN__) if (*buffer == '|') { if (no_shell) { HTUserMsg(SPAWNING_DISABLED); @@ -435,11 +439,11 @@ check_recall: } } - print_wwwfile_to_fd(outfile_fp,0); + print_wwwfile_to_fd(outfile_fp, 0); /* FILE */ if (keypad_mode) printlist(outfile_fp,FALSE); -#if HAVE_POPEN +#if HAVE_POPEN || !defined(__CYGWIN__) if (LYIsPipeCommand(buffer)) pclose(outfile_fp); else @@ -476,7 +480,7 @@ PRIVATE void send_file_to_mail ARGS3( char hdrfile[LY_MAXPATH]; char my_temp[LY_MAXPATH]; #endif -#ifdef DOSPATH +#if defined(DOSPATH) || defined(WIN_EX) char my_temp[LY_MAXPATH]; #endif @@ -615,11 +619,12 @@ PRIVATE void send_file_to_mail ARGS3( } else if (!isPMDF) { fprintf(outfile_fp, "X-URL: %s\n\n", newdoc->address); } - print_wwwfile_to_fd(outfile_fp, 0); + print_wwwfile_to_fd(outfile_fp, 0); /* MAIL */ if (keypad_mode) printlist(outfile_fp, FALSE); LYCloseTempFP(outfile_fp); + buffer = NULL; if (isPMDF) { /* * For PMDF, put the subject in the header file and close it. - FM @@ -651,6 +656,9 @@ PRIVATE void send_file_to_mail ARGS3( } stop_curses(); +#ifdef SH_EX + SetOutputMode(O_TEXT); +#endif printf(MAILING_FILE); LYSystem(buffer); sleep(AlertSecs); @@ -658,9 +666,9 @@ PRIVATE void send_file_to_mail ARGS3( if (isPMDF) LYRemoveTemp(hdrfile); LYRemoveTemp(my_temp); -#else /* Unix or DOS */ +#else /* !VMS (Unix or DOS) */ -#ifdef DOSPATH +#if defined(DOSPATH) || defined(WIN_EX) outfile_fp = LYOpenTemp(my_temp, ".txt", "w"); #else HTSprintf0(&buffer, "%s %s", system_mail, system_mail_flags); @@ -758,25 +766,37 @@ PRIVATE void send_file_to_mail ARGS3( "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n", newdoc->address, content_base); } - print_wwwfile_to_fd(outfile_fp, 0); + print_wwwfile_to_fd(outfile_fp, 0); /* MAIL */ if (keypad_mode) printlist(outfile_fp, FALSE); -#ifdef DOSPATH - HTSprintf0(&buffer, "%s -t \"%s\" -F %s", system_mail, user_response, my_temp); +#if defined(WIN_EX) /* 1998/08/17 (Mon) 16:29:49 */ + buffer = NULL; + if (mail_is_blat) + HTSprintf0(&buffer, "%s %s -t \"%s\"", + system_mail, my_temp, user_response); + else + HTSprintf0(&buffer, "%s -t \"%s\" -F %s", + system_mail, user_response, my_temp); LYCloseTempFP(outfile_fp); /* Close the tmpfile. */ stop_curses(); +#ifdef SH_EX + SetOutputMode(O_TEXT); +#endif printf("%s\n\n$ %s\n\n%s", gettext("Sending"), buffer, PLEASE_WAIT); LYSystem(buffer); sleep(MessageSecs); start_curses(); +#ifdef SH_EX + SetOutputMode( O_BINARY ); +#endif LYRemoveTemp(my_temp); /* Delete the tmpfile. */ #else pclose(outfile_fp); #endif #endif /* VMS */ -done: +done: /* send_file_to_mail() */ FREE(buffer); FREE(subject); return; @@ -816,7 +836,7 @@ PRIVATE void send_file_to_printer ARGS4( "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n", newdoc->address, content_base); } - print_wwwfile_to_fd(outfile_fp, 0); + print_wwwfile_to_fd(outfile_fp, 0); /* PRINTER */ if (keypad_mode) printlist(outfile_fp, FALSE); @@ -877,17 +897,34 @@ check_again: if (!strncasecomp(my_file, "nl:", 3) || !strncasecomp(my_file, "/nl/", 4)) #else +#if defined(DOSPATH) /* 1997/10/15 (Wed) 16:41:30 */ + if (!strcmp(my_file, "nul")) +#else if (!strcmp(my_file, "/dev/null")) +#endif /* DOSPATH */ #endif /* VMS */ { CancelPrint(PRINT_REQUEST_CANCELLED); } HTAddSugFilename(my_file); } +#ifdef SH_EX /* 1999/01/04 (Mon) 09:37:03 */ + else { + my_file[0] = '\0'; + } HTAddParam (&the_command, cur_printer->command, 1, my_temp); + if (my_file[0]) { + HTAddParam (&the_command, cur_printer->command, 2, my_file); + HTEndParam (&the_command, cur_printer->command, 3); + } else { + HTEndParam (&the_command, cur_printer->command, 2); + } +#else + HTAddParam (&the_command, cur_printer->command, 1, my_temp); HTAddParam (&the_command, cur_printer->command, 2, my_file); HTEndParam (&the_command, cur_printer->command, 2); +#endif /* * Move the cursor to the top of the screen so that output from system'd @@ -897,6 +934,9 @@ check_again: stop_curses(); CTRACE(tfp, "command: %s\n", the_command); +#ifdef SH_EX + SetOutputMode( O_TEXT ); +#endif printf(PRINTING_FILE); /* * Set various bits of document information as environment variables, for @@ -926,10 +966,15 @@ check_again: #ifndef VMS signal(SIGINT, cleanup_sig); #endif /* !VMS */ +#ifdef SH_EX + fprintf(stdout," Print job complite.\n"); + fflush(stdout); + SetOutputMode( O_BINARY ); +#endif sleep(MessageSecs); start_curses(); -done: +done: /* send_file_to_printer() */ return; } @@ -955,6 +1000,10 @@ PRIVATE void send_file_to_screen ARGS3( outfile_fp = stdout; stop_curses(); +#ifdef SH_EX + SetOutputMode( O_TEXT ); +#endif + #ifndef VMS signal(SIGINT, SIG_IGN); #endif /* !VMS */ @@ -972,7 +1021,7 @@ PRIVATE void send_file_to_screen ARGS3( } if (Lpansi) printf("\033[5i"); - print_wwwfile_to_fd(outfile_fp, 0); + print_wwwfile_to_fd(outfile_fp, 0); /* SCREEN */ if (keypad_mode) printlist(outfile_fp, FALSE); @@ -996,9 +1045,13 @@ PRIVATE void send_file_to_screen ARGS3( HadVMSInterrupt = FALSE; #endif /* VMS */ } +#ifdef SH_EX + fprintf(stdout,"\n"); + SetOutputMode( O_BINARY ); +#endif start_curses(); -done: +done: /* send_file_to_screen() */ return; } diff --git a/src/LYReadCFG.c b/src/LYReadCFG.c index 5a535ffc..68c5450c 100644 --- a/src/LYReadCFG.c +++ b/src/LYReadCFG.c @@ -332,7 +332,7 @@ static CONST char *Color_Strings[16] = "white" }; -#ifdef DOSPATH +#if defined(DOSPATH) || defined(WIN_EX) /* * PDCurses (and possibly some other implementations) use a non-ANSI set of * codes for colors. @@ -898,7 +898,7 @@ static int viewer_fun ARGS1( } static int nonrest_sigwinch_fun ARGS1( - char *, value) + char *, value) { if (!strncasecomp(value, "XWINDOWS", 8)) { LYNonRestartingSIGWINCH = (LYgetXDisplay() != NULL); @@ -957,8 +957,13 @@ static int parse_html_src_spec ARGS3( return 0; } +#ifdef __STDC__ #define defHTSRC_parse_fun(x) static int html_src_set_##x ARGS1( char*,str) \ { parse_html_src_spec(HTL_##x,str,#x); return 0; } +#else +#define defHTSRC_parse_fun(x) static int html_src_set_/**/x ARGS1( char*,str) \ + { parse_html_src_spec(HTL_/**/x,str,"x"); return 0; } +#endif defHTSRC_parse_fun(comm) defHTSRC_parse_fun(tag) @@ -1006,8 +1011,14 @@ static int read_htmlsrc_tagname_xform ARGS1( char*,str) } +#ifdef __STDC__ #define defHTSRC_option(x) \ PARSE_FUN( "htmlsrc_" #x ,CONF_FUN, html_src_set_##x), +#else +#define defHTSRC_option(x) \ + PARSE_FUN( "htmlsrc_" #x ,CONF_FUN, html_src_set_/**/x), + /* ^^ (cannot adapt to K&R) */ +#endif #endif @@ -1066,7 +1077,13 @@ static Config_Type Config_Table [] = PARSE_ADD("external", CONF_ADD_ITEM, externals), #endif PARSE_ENV("finger_proxy", CONF_ENV, 0 ), +#if defined(_WINDOWS) /* 1998/10/05 (Mon) 17:34:15 */ + PARSE_SET("focus_window", CONF_BOOL, &focus_window), +#endif PARSE_SET("force_8bit_toupper", CONF_BOOL, &UCForce8bitTOUPPER), +#ifndef NO_EMPTY_HREFLESS_A + PARSE_SET("force_empty_hrefless_a", CONF_BOOL, &force_empty_hrefless_a), +#endif PARSE_SET("force_ssl_cookies_secure", CONF_BOOL, &LYForceSSLCookiesSecure), #if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU) PARSE_SET("forms_options", CONF_BOOL, &LYUseFormsOptions), @@ -1079,7 +1096,7 @@ static Config_Type Config_Table [] = PARSE_STR("helpfile", CONF_STR, &helpfile), PARSE_SET("historical_comments", CONF_BOOL, &historical_comments), -#ifdef USE_PSRC +#if defined(USE_PSRC) && defined(__STDC__) defHTSRC_option(abracket) defHTSRC_option(attrib) @@ -1110,6 +1127,9 @@ static Config_Type Config_Table [] = PARSE_STR("jump_prompt", CONF_STR, &jumpprompt), PARSE_SET("jumpbuffer", CONF_BOOL, &jump_buffer), PARSE_FUN("jumpfile", CONF_FUN, jumpfile_fun), +#ifdef EXP_JUSTIFY_ELTS + PARSE_SET("justify", CONF_BOOL, &ok_justify), +#endif #ifdef EXP_KEYBOARD_LAYOUT PARSE_FUN("keyboard_layout", CONF_FUN, keyboard_layout_fun), #endif @@ -1143,7 +1163,7 @@ static Config_Type Config_Table [] = PARSE_SET("make_pseudo_alts_for_inlines", CONF_BOOL, &pseudo_inline_alts), PARSE_INT("messagesecs", CONF_INT, &MessageSecs), PARSE_SET("minimal_comments", CONF_BOOL, &minimal_comments), - PARSE_SET("multi_bookmark_support", CONF_BOOL, &LYMultiBookmarks), + PARSE_INT("multi_bookmark_support", CONF_BOOL, &LYMultiBookmarks), PARSE_SET("ncr_in_bookmarks", CONF_BOOL, &UCSaveBookmarksInUnicode), #ifndef DISABLE_NEWS PARSE_FUN("news_chunk_size", CONF_FUN, news_chunk_size_fun), @@ -1155,6 +1175,9 @@ static Config_Type Config_Table [] = PARSE_ENV("nntp_proxy", CONF_ENV, 0), PARSE_ENV("nntpserver", CONF_ENV2, 0), /* actually NNTPSERVER */ #endif +#ifdef SH_EX + PARSE_SET("no_table_center", CONF_BOOL, &no_table_center), +#endif PARSE_SET("no_dot_files", CONF_BOOL, &no_dotfiles), PARSE_SET("no_file_referer", CONF_BOOL, &no_filereferer), #ifndef VMS @@ -1208,6 +1231,9 @@ static Config_Type Config_Table [] = PARSE_STR("system_mail", CONF_STR, &system_mail), PARSE_STR("system_mail_flags", CONF_STR, &system_mail_flags), PARSE_SET("tagsoup", CONF_BOOL, &Old_DTD), +#if defined(_WINDOWS) + PARSE_INT("timeout", CONF_INT, &lynx_timeout), +#endif #ifdef EXEC_LINKS PARSE_DEF("trusted_exec", CONF_ADD_TRUSTED, EXEC_PATH), #endif @@ -1262,7 +1288,7 @@ PUBLIC void free_lynx_cfg NOARGS unsetenv(name); # else if (putenv(name)) - break; + break; # endif #endif } @@ -1355,7 +1381,7 @@ PRIVATE void do_read_cfg ARGS5( strcat(mypath, cfg_filename+1); cfg_filename = mypath; } - if ((fp = fopen(cfg_filename,"r")) == 0) { + if ((fp = fopen(cfg_filename, TXT_R)) == 0) { CTRACE(tfp,"lynx.cfg file not found as %s\n",cfg_filename); return; } @@ -1364,6 +1390,13 @@ PRIVATE void do_read_cfg ARGS5( /* * Process each line in the file. */ +#ifdef SH_EX + if (show_cfg) { + time_t t; + time(&t); + printf("### Lynx %s, at %s", LYNX_VERSION, ctime(&t)); + } +#endif while (LYSafeGets(&buffer, fp) != 0) { char *name, *value; char *cp; @@ -1415,6 +1448,10 @@ PRIVATE void do_read_cfg ARGS5( /* lynx ignores unknown keywords */ continue; } +#ifdef SH_EX + if (show_cfg) + printf("%s:%s\n", name, value); +#endif if ( allowed && (*allowed)[ tbl-Config_Table ] ) { if (fp0 == NULL) @@ -1484,7 +1521,7 @@ PRIVATE void do_read_cfg ARGS5( case CONF_INCLUDE: { /* include another file */ - optidx_set_t cur_set,anded_set; + optidx_set_t cur_set, anded_set; optidx_set_t* resultant_set = NULL; char* p1, *p2, savechar; BOOL any_optname_found = FALSE; @@ -1558,10 +1595,10 @@ PRIVATE void do_read_cfg ARGS5( } #ifndef NO_CONFIG_INFO - /* + /* * Now list the opts that are allowed in included file. If all * opts are allowed, then emit nothing, else emit an effective set - * of allowed options in <ul>. Option names will be uppercased. + * of allowed options in <ul>. Option names will be uppercased. * FIXME: uppercasing option names can be considered redundant. */ if (fp0 != 0 && !no_lynxcfg_xinfo && resultant_set) { diff --git a/src/LYStrings.c b/src/LYStrings.c index 01981de5..a26e4c58 100644 --- a/src/LYStrings.c +++ b/src/LYStrings.c @@ -32,6 +32,14 @@ extern unsigned short *LYKbLayout; extern BOOL HTPassHighCtrlRaw; extern HTCJKlang HTCJK; +#ifdef SUPPORT_MULTIBYTE_EDIT +#define IS_KANA(c) (0xa0 <= c && c <= 0xdf) +#endif + +#if defined(WIN_EX) +#define BUTTON_CTRL 0 /* Quick hack */ +#endif + /*Allowing the user to press tab when entering URL to get the closest match in the closet*/ #define LYClosetSize 100 @@ -59,14 +67,14 @@ static int mouse_link = -1; static int have_levent; -#ifdef NCURSES_MOUSE_VERSION +#if defined(NCURSES_MOUSE_VERSION) && !defined(WIN_EX) static MEVENT levent; #endif /* Return the value of mouse_link */ PUBLIC int peek_mouse_levent NOARGS { -#ifdef NCURSES_MOUSE_VERSION +#if defined(NCURSES_MOUSE_VERSION) && !defined(WIN_EX) if (have_levent > 0) { ungetmouse(&levent); have_levent--; @@ -99,13 +107,70 @@ PUBLIC int fancy_mouse ARGS3( int *, position) { int cmd = LYK_DO_NOTHING; -#ifdef NCURSES_MOUSE_VERSION +#if defined(NCURSES_MOUSE_VERSION) #ifndef getbegx #define getbegx(win) ((win)->_begx) #endif #ifndef getbegy #define getbegy(win) ((win)->_begy) #endif + +#if defined(WIN_EX) /* 1998/12/05 (Sat) 08:10:42 */ + + request_mouse_pos(); + + if (BUTTON_STATUS(1) + && (MOUSE_X_POS >= getbegx(win) + && (MOUSE_X_POS < (getbegx(win) + getmaxx(win))))) { + int mypos = MOUSE_Y_POS - getbegy(win); + int delta = mypos - row; + + if (mypos+1 == getmaxy(win)) { + /* At the decorative border: scroll forward */ + if (BUTTON_STATUS(1) & BUTTON1_TRIPLE_CLICKED) + cmd = LYK_END; + else if (BUTTON_STATUS(1) & BUTTON1_DOUBLE_CLICKED) + cmd = LYK_NEXT_PAGE; + else + cmd = LYK_NEXT_LINK; + } else if (mypos >= getmaxy(win)) { + if (BUTTON_STATUS(1) & (BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED)) + cmd = LYK_END; + else + cmd = LYK_NEXT_PAGE; + } else if (mypos == 0) { + /* At the decorative border: scroll back */ + if (BUTTON_STATUS(1) & BUTTON1_TRIPLE_CLICKED) + cmd = LYK_HOME; + else if (BUTTON_STATUS(1) & BUTTON1_DOUBLE_CLICKED) + cmd = LYK_PREV_PAGE; + else + cmd = LYK_PREV_LINK; + } else if (mypos < 0) { + if (BUTTON_STATUS(1) & (BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED)) + cmd = LYK_HOME; + else + cmd = LYK_PREV_PAGE; +#ifdef KNOW_HOW_TO_TOGGLE + } else if (BUTTON_STATUS(1) & (BUTTON_CTRL)) { + cur_selection += delta; + cmd = LYX_TOGGLE; +#endif + } else if (BUTTON_STATUS(1) & (BUTTON_ALT | BUTTON_SHIFT | BUTTON_CTRL)) { + /* Probably some unrelated activity, such as selecting some text. + * Select, but do nothing else. + */ + *position += delta; + cmd = -1; + } else { + /* No scrolling or overflow checks necessary. */ + *position += delta; + cmd = LYK_ACTIVATE; + } + } else if (BUTTON_STATUS(1) & (BUTTON3_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED)) { + cmd = LYK_QUIT; + } +#else MEVENT event; getmouse(&event); @@ -186,6 +251,7 @@ PUBLIC int fancy_mouse ARGS3( } else if (event.bstate & (BUTTON3_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED)) { cmd = LYK_QUIT; } +#endif /* _WINDOWS */ #endif return cmd; } @@ -518,8 +584,10 @@ PRIVATE WINDOW *my_subwindow; PUBLIC void LYsubwindow ARGS1(WINDOW *, param) { +#if !defined(WIN_EX) if ((my_subwindow = param) != 0) keypad(param, TRUE); +#endif } #endif @@ -614,11 +682,18 @@ static SLKeyMap_List_Type *Keymap_List; * the CSI logic and other special cases for VMS, NCSA telnet, etc. */ #ifdef USE_SLANG -#define DEFINE_KEY(string,lynx,curses) {string,lynx} +# ifdef VMS +# define EXTERN_KEY(string,string1,lynx,curses) {string,lynx} +# else +# define EXTERN_KEY(string,string1,lynx,curses) {string1,lynx} +# endif +# define INTERN_KEY(string,lynx,curses) {string,lynx} #else -#define DEFINE_KEY(string,lynx,curses) {string,curses} +#define INTERN_KEY(string,lynx,curses) {string,curses} +#define EXTERN_KEY(string,string1,lynx,curses) {string,curses} #endif + typedef struct { char *string; @@ -628,22 +703,22 @@ Keysym_String_List; static Keysym_String_List Keysym_Strings [] = { - DEFINE_KEY( "UPARROW", UPARROW, KEY_UP ), - DEFINE_KEY( "DNARROW", DNARROW, KEY_DOWN ), - DEFINE_KEY( "RTARROW", RTARROW, KEY_RIGHT ), - DEFINE_KEY( "LTARROW", LTARROW, KEY_LEFT ), - DEFINE_KEY( "PGDOWN", PGDOWN, KEY_NPAGE ), - DEFINE_KEY( "PGUP", PGUP, KEY_PPAGE ), - DEFINE_KEY( "HOME", HOME, KEY_HOME ), - DEFINE_KEY( "END", END_KEY, KEY_END ), - DEFINE_KEY( "F1", F1, KEY_F(1) ), - DEFINE_KEY( "DO_KEY", DO_KEY, KEY_F(16) ), - DEFINE_KEY( "FIND_KEY", FIND_KEY, KEY_FIND ), - DEFINE_KEY( "SELECT_KEY", SELECT_KEY, KEY_SELECT ), - DEFINE_KEY( "INSERT_KEY", INSERT_KEY, KEY_IC ), - DEFINE_KEY( "REMOVE_KEY", REMOVE_KEY, KEY_DC ), - DEFINE_KEY( "DO_NOTHING", DO_NOTHING, DO_NOTHING|LKC_ISLKC ), - DEFINE_KEY( NULL, -1, ERR ) + INTERN_KEY( "UPARROW", UPARROW, KEY_UP ), + INTERN_KEY( "DNARROW", DNARROW, KEY_DOWN ), + INTERN_KEY( "RTARROW", RTARROW, KEY_RIGHT ), + INTERN_KEY( "LTARROW", LTARROW, KEY_LEFT ), + INTERN_KEY( "PGDOWN", PGDOWN, KEY_NPAGE ), + INTERN_KEY( "PGUP", PGUP, KEY_PPAGE ), + INTERN_KEY( "HOME", HOME, KEY_HOME ), + INTERN_KEY( "END", END_KEY, KEY_END ), + INTERN_KEY( "F1", F1, KEY_F(1) ), + INTERN_KEY( "DO_KEY", DO_KEY, KEY_F(16) ), + INTERN_KEY( "FIND_KEY", FIND_KEY, KEY_FIND ), + INTERN_KEY( "SELECT_KEY", SELECT_KEY, KEY_SELECT ), + INTERN_KEY( "INSERT_KEY", INSERT_KEY, KEY_IC ), + INTERN_KEY( "REMOVE_KEY", REMOVE_KEY, KEY_DC ), + INTERN_KEY( "DO_NOTHING", DO_NOTHING, DO_NOTHING|LKC_ISLKC ), + INTERN_KEY( NULL, -1, ERR ) }; #ifdef NCURSES_VERSION @@ -1008,26 +1083,26 @@ PRIVATE int read_keymap_file NOARGS PRIVATE void setup_vtXXX_keymap NOARGS { static Keysym_String_List table[] = { - DEFINE_KEY( "\033[A", UPARROW, KEY_UP ), - DEFINE_KEY( "\033OA", UPARROW, KEY_UP ), - DEFINE_KEY( "\033[B", DNARROW, KEY_DOWN ), - DEFINE_KEY( "\033OB", DNARROW, KEY_DOWN ), - DEFINE_KEY( "\033[C", RTARROW, KEY_RIGHT ), - DEFINE_KEY( "\033OC", RTARROW, KEY_RIGHT ), - DEFINE_KEY( "\033[D", LTARROW, KEY_LEFT ), - DEFINE_KEY( "\033OD", LTARROW, KEY_LEFT ), - DEFINE_KEY( "\033[1~", FIND_KEY, KEY_FIND ), - DEFINE_KEY( "\033[2~", INSERT_KEY, KEY_IC ), - DEFINE_KEY( "\033[3~", REMOVE_KEY, KEY_DC ), - DEFINE_KEY( "\033[4~", SELECT_KEY, KEY_SELECT ), - DEFINE_KEY( "\033[5~", PGUP, KEY_PPAGE ), - DEFINE_KEY( "\033[6~", PGDOWN, KEY_NPAGE ), - DEFINE_KEY( "\033[8~", END_KEY, KEY_END ), - DEFINE_KEY( "\033[7~", HOME, KEY_HOME), - DEFINE_KEY( "\033[28~", F1, KEY_F(1) ), - DEFINE_KEY( "\033OP", F1, KEY_F(1) ), - DEFINE_KEY( "\033[OP", F1, KEY_F(1) ), - DEFINE_KEY( "\033[29~", DO_KEY, KEY_F(16) ), + EXTERN_KEY( "\033[A", "^(ku)", UPARROW, KEY_UP ), + EXTERN_KEY( "\033OA", "^(ku)", UPARROW, KEY_UP ), + EXTERN_KEY( "\033[B", "^(kd)", DNARROW, KEY_DOWN ), + EXTERN_KEY( "\033OB", "^(kd)", DNARROW, KEY_DOWN ), + EXTERN_KEY( "\033[C", "^(kr)", RTARROW, KEY_RIGHT ), + EXTERN_KEY( "\033OC", "^(kr)", RTARROW, KEY_RIGHT ), + EXTERN_KEY( "\033[D", "^(kl)", LTARROW, KEY_LEFT ), + EXTERN_KEY( "\033OD", "^(kl)", LTARROW, KEY_LEFT ), + EXTERN_KEY( "\033[1~", "^(@0)", FIND_KEY, KEY_FIND ), + EXTERN_KEY( "\033[2~", "^(kI)", INSERT_KEY, KEY_IC ), + EXTERN_KEY( "\033[3~", "^(kD)", REMOVE_KEY, KEY_DC ), + EXTERN_KEY( "\033[4~", "^(*6)", SELECT_KEY, KEY_SELECT ), + EXTERN_KEY( "\033[5~", "^(kP)", PGUP, KEY_PPAGE ), + EXTERN_KEY( "\033[6~", "^(kN)", PGDOWN, KEY_NPAGE ), + EXTERN_KEY( "\033[8~", "^(@7)", END_KEY, KEY_END ), + EXTERN_KEY( "\033[7~", "^(kh)", HOME, KEY_HOME), + EXTERN_KEY( "\033[28~", "^(k1)", F1, KEY_F(1) ), + EXTERN_KEY( "\033OP", "^(k1)", F1, KEY_F(1) ), + EXTERN_KEY( "\033[OP", "^(k1)", F1, KEY_F(1) ), + EXTERN_KEY( "\033[29~", "^(F6)", DO_KEY, KEY_F(16) ), }; size_t n; for (n = 0; n < TABLESIZE(table); n++) @@ -1040,6 +1115,11 @@ PUBLIC int lynx_initialize_keymaps NOARGS int i; char keybuf[2]; + /* The escape sequences may contain embedded termcap strings. Make + * sure the library is initialized for that. + */ + SLtt_get_terminfo(); + if (NULL == (Keymap_List = SLang_create_keymap ("Lynx", NULL))) return -1; @@ -1529,6 +1609,26 @@ re_read: case KEY_RIGHT: /* ... */ c = RTARROW; break; +#if defined(SH_EX) && defined(DOSPATH) /* for NEC PC-9800 1998/08/30 (Sun) 21:50:35 */ + case KEY_C2: + c = DNARROW; + break; + case KEY_A2: + c = UPARROW; + break; + case KEY_B1: + c = LTARROW; + break; + case KEY_B3: + c = RTARROW; + break; + case PAD0: /* PC-9800 Ins */ + c = INSERT_KEY; + break; + case PADSTOP: /* PC-9800 DEL */ + c = REMOVE_KEY; + break; +#endif /* SH_EX */ case KEY_HOME: /* Home key (upward+left arrow) */ c = HOME; break; @@ -1694,7 +1794,7 @@ re_read: getmouse(&event); /* Completely ignore event - kw */ c = DO_NOTHING; } else { -#ifndef DOSPATH +#if !defined(WIN_EX) MEVENT event; int err; int lac = LYK_UNKNOWN; @@ -1759,17 +1859,101 @@ re_read: c = MOUSE_KEY; } #else /* pdcurses version */ + + /* _WINDOWS 1997/10/18 (Sat) 19:41:59 */ + +#define H_CMD_AREA 6 +#define HIST_CMD_2 12 +#define V_CMD_AREA 1 + + int left,right; + extern BOOLEAN system_is_NT; + /* yes, I am assuming that my screen will be a certain width. */ + + int tick_count; + char *p = NULL; + char mouse_info[128]; + static int old_click = 0; /* [m Sec] */ + + left = H_CMD_AREA; + right = (LYcols - H_CMD_AREA); c = -1; mouse_link = -1; - request_mouse_pos(); - if (BUTTON_STATUS(1) & BUTTON_CLICKED) { - c = set_clicked_link(MOUSE_X_POS, MOUSE_Y_POS,FOR_PANEL,1); - } else if (BUTTON_STATUS(3) & BUTTON_CLICKED) { - c = LAC_TO_LKC(LYK_PREV_DOC); + + if (system_is_NT) { + /* for Windows NT */ + request_mouse_pos(); + + if (BUTTON_STATUS(1) & BUTTON_CLICKED) { + if (MOUSE_Y_POS > (LYlines - V_CMD_AREA)) { + /* Screen BOTTOM */ + if (MOUSE_X_POS < left) { + c = LTARROW; p = "<-"; + } else if (MOUSE_X_POS < HIST_CMD_2) { + c = RTARROW; p = "->"; + } else if (MOUSE_X_POS > right) { + c = 'z'; p = "Cancel"; + } else { + c = PGDOWN; p = "PGDOWN"; + } + } else if (MOUSE_Y_POS < V_CMD_AREA) { + /* Screen TOP */ + if (MOUSE_X_POS < left) { + c = LTARROW; p = "<-"; + } else if (MOUSE_X_POS < HIST_CMD_2) { + c = RTARROW; p = "->"; + } else if (MOUSE_X_POS > right) { + c = 'z'; p = "Cancel"; + } else { + c = PGUP; p = "PGUP"; + } + } else { + c = set_clicked_link(MOUSE_X_POS, MOUSE_Y_POS, FOR_PANEL); + } + } + } else { + /* for Windows 95 */ + tick_count = GetTickCount(); + + /* Guard Mouse button miss click */ + if ((tick_count - old_click) < 700) { + c = DO_NOTHING; + break; + } else { + old_click = tick_count; + } + request_mouse_pos(); + if (MOUSE_Y_POS > (LYlines - V_CMD_AREA)) { + /* Screen BOTTOM */ + if (MOUSE_X_POS < left) { + c = LTARROW; p = "<-"; + } else if (MOUSE_X_POS < HIST_CMD_2) { + c = RTARROW; p = "->"; + } else if (MOUSE_X_POS > right) { + c = '\b'; p = "History"; + } else { + c = PGDOWN; p = "PGDOWN"; + } + } else if (MOUSE_Y_POS < V_CMD_AREA) { + /* Screen TOP */ + if (MOUSE_X_POS < left) { + c = LTARROW; p = "<-"; + } else if (MOUSE_X_POS < HIST_CMD_2) { + c = RTARROW; p = "->"; + } else if (MOUSE_X_POS > right) { + c = 'z'; p = "Cancel"; + } else { + c = PGUP; p = "PGUP"; + } + } else { + c = set_clicked_link(MOUSE_X_POS, MOUSE_Y_POS, FOR_PANEL); + } } -#endif /* DOSPATH */ -/* if (c < 0) - c = 0; */ + if (p && c != -1) { + sprintf(mouse_info, "Mouse = 0x%x, [%s]", c, p); + SetConsoleTitle(mouse_info); + } +#endif /* !(WIN_EX) */ if ((c+1) >= KEYMAP_SIZE && (c&LKC_ISLAC)) return(c); } @@ -1906,22 +2090,48 @@ PUBLIC int LYgetch NOARGS * Convert a null-terminated string to lowercase */ PUBLIC void LYLowerCase ARGS1( - char *, buffer) + unsigned char *, buffer) { size_t i; for (i = 0; buffer[i]; i++) +#ifdef SUPPORT_MULTIBYTE_EDIT /* 1998/11/23 (Mon) 17:04:55 */ + { + if (buffer[i] & 0x80) { + if (IS_KANA(buffer[i])) { + continue; + } + i++; + } else { + buffer[i] = TOLOWER(buffer[i]); + } + } +#else buffer[i] = TOLOWER(buffer[i]); +#endif } /* * Convert a null-terminated string to uppercase */ PUBLIC void LYUpperCase ARGS1( - char *, buffer) +unsigned char *, buffer) { size_t i; for (i = 0; buffer[i]; i++) +#ifdef SUPPORT_MULTIBYTE_EDIT /* 1998/11/23 (Mon) 17:05:10 */ + { + if (buffer[i] & 0x80) { + if (IS_KANA(buffer[i])) { + continue; + } + i++; + } else { + buffer[i] = TOUPPER(buffer[i]); + } + } +#else buffer[i] = TOUPPER(buffer[i]); +#endif } /* @@ -2110,6 +2320,36 @@ PUBLIC void LYSetupEdit ARGS4( } } +#ifdef SUPPORT_MULTIBYTE_EDIT + +PRIVATE int prev_pos ARGS2( + EDREC *, edit, + int, pos) +{ + int i = 0; + + if (pos <= 0) + return 0; + if (HTCJK == NOCJK) + return (pos - 1); + else { + while (i < pos - 1) { + int c; + c = Buf[i]; + + if (!(isascii(c) || IS_KANA(c))) { + i++; + } + i++; + } + if (i == pos) + return (i - 2); + else + return i; + } +} +#endif /* SUPPORT_MULTIBYTE_EDIT */ + PUBLIC int LYEdit1 ARGS4( EDREC *, edit, int, ch, @@ -2139,6 +2379,7 @@ PUBLIC int LYEdit1 ARGS4( map_active = ~map_active; break; #endif +#ifndef CJK_EX case LYE_AIX: /* * Hex 97. @@ -2148,6 +2389,7 @@ PUBLIC int LYEdit1 ARGS4( */ if (HTCJK == NOCJK && LYlowest_eightbit[current_char_set] > 0x97) return(ch); +#endif case LYE_CHAR: #ifdef EXP_KEYBOARD_LAYOUT if (map_active && ch < 128 && ch >= 0 && @@ -2197,12 +2439,16 @@ PUBLIC int LYEdit1 ARGS4( Buf[length+1]='\0'; Buf[Pos] = (unsigned char) ch; Pos++; - } else if (maxMessage) { + } else { + if (maxMessage) { _statusline(MAXLEN_REACHED_DEL_OR_MOV); } + return(ch); + } break; case LYE_BACKW: +#ifndef SUPPORT_MULTIBYTE_EDIT /* * Backword. * Definition of word is very naive: 1 or more a/n characters. @@ -2211,16 +2457,58 @@ PUBLIC int LYEdit1 ARGS4( Pos--; while (Pos && isalnum(Buf[Pos-1])) Pos--; +#else /* SUPPORT_MULTIBYTE_EDIT */ + /* + * Backword. + * Definition of word is very naive: 1 or more a/n characters, + * or 1 or more multibyte character. + */ + { + int pos0; + + pos0 = prev_pos(edit, Pos); + while (Pos && + (HTCJK == NOCJK || isascii(Buf[pos0])) && + !isalnum(Buf[pos0])) { + Pos = pos0; + pos0 = prev_pos(edit, Pos); + } + if (HTCJK != NOCJK && !isascii(Buf[pos0])) { + while (Pos && !isascii(Buf[pos0])) { + Pos = pos0; + pos0 = prev_pos(edit, Pos); + } + } else { + while (Pos && isascii(Buf[pos0]) && isalnum(Buf[pos0])) { + Pos = pos0; + pos0 = prev_pos(edit, Pos); + } + } + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ break; case LYE_FORWW: /* * Word forward. */ +#ifndef SUPPORT_MULTIBYTE_EDIT while (isalnum(Buf[Pos])) Pos++; /* '\0' is not a/n */ while (!isalnum(Buf[Pos]) && Buf[Pos]) Pos++ ; +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (HTCJK != NOCJK && !isascii(Buf[Pos])) { + while (!isascii(Buf[Pos])) + Pos += 2; + } else { + while (isascii(Buf[Pos]) && isalnum(Buf[Pos])) + Pos++; /* '\0' is not a/n */ + } + while ((HTCJK == NOCJK || isascii(Buf[Pos])) && + !isalnum(Buf[Pos]) && Buf[Pos]) + Pos++; +#endif /* SUPPORT_MULTIBYTE_EDIT */ break; case LYE_ERASE: @@ -2283,7 +2571,7 @@ PUBLIC int LYEdit1 ARGS4( } break; - case LYE_DELEL: + case LYE_DELEL: /* @@@ */ /* * Delete from current cursor position thru EOL. */ @@ -2303,6 +2591,10 @@ PUBLIC int LYEdit1 ARGS4( */ if (Pos >= length) break; +#ifdef SUPPORT_MULTIBYTE_EDIT + if (HTCJK != NOCJK && !isascii(Buf[Pos])) + Pos++; +#endif Pos++; /* fall through - DO NOT RELOCATE the LYE_DELN case wrt LYE_DELP */ @@ -2310,6 +2602,7 @@ PUBLIC int LYEdit1 ARGS4( /* * Delete preceding character. */ +#ifndef SUPPORT_MULTIBYTE_EDIT if (length == 0 || Pos == 0) break; #ifdef ENHANCED_LINEEDIT @@ -2320,6 +2613,23 @@ PUBLIC int LYEdit1 ARGS4( for (i = Pos; i < length; i++) Buf[i] = Buf[i+1]; i--; +#else /* SUPPORT_MULTIBYTE_EDIT */ + { + int offset = 1; + int pos0 = Pos; + + if (length == 0 || Pos == 0) + break; + if (HTCJK != NOCJK) { + Pos = prev_pos(edit, pos0); + offset = pos0 - Pos; + } else + Pos--; + for (i = Pos; i < length; i++) + Buf[i] = Buf[i + offset]; + i -= offset; + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ Buf[i] = 0; break; @@ -2327,16 +2637,33 @@ PUBLIC int LYEdit1 ARGS4( /* * Move cursor to the right. */ +#ifndef SUPPORT_MULTIBYTE_EDIT if (Pos < length) Pos++; +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (Pos < length) { + Pos++; + if (HTCJK != NOCJK && !isascii(Buf[Pos-1])) + Pos++; + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ break; case LYE_BACK: /* * Left-arrow move cursor to the left. */ +#ifndef SUPPORT_MULTIBYTE_EDIT if (Pos > 0) Pos--; +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (Pos > 0) { + if (HTCJK != NOCJK) + Pos = prev_pos(edit, Pos); + else + Pos--; + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ break; #ifdef ENHANCED_LINEEDIT @@ -2449,6 +2776,10 @@ PUBLIC void LYRefreshEdit ARGS1( int padsize; char *str; char buffer[3]; +#ifdef SUPPORT_MULTIBYTE_EDIT + int begin_multi = 0; + int end_multi = 0; +#endif /* SUPPORT_MULTIBYTE_EDIT */ buffer[0] = buffer[1] = buffer[2] = '\0'; if (!edit->dirty || (DspWdth == 0)) @@ -2473,16 +2804,52 @@ PUBLIC void LYRefreshEdit ARGS1( * data entry at low baudrates. */ if ((DspStart + DspWdth) <= length) +#ifndef SUPPORT_MULTIBYTE_EDIT if (Pos >= (DspStart + DspWdth) - Margin) DspStart=(Pos - DspWdth) + Margin; +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (Pos >= (DspStart + DspWdth) - Margin) { + if (HTCJK != NOCJK) { + int tmp = (Pos - DspWdth) + Margin; + + while (DspStart < tmp) { + if (!isascii(Buf[DspStart])) + DspStart++; + DspStart++; + } + } else + DspStart=(Pos - DspWdth) + Margin; + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ if (Pos < DspStart + Margin) { +#ifndef SUPPORT_MULTIBYTE_EDIT + DspStart = Pos - Margin; + if (DspStart < 0) + DspStart = 0; +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (HTCJK != NOCJK) { + int tmp = Pos - Margin; + + DspStart = 0; + while (DspStart < tmp) { + if (!isascii(Buf[DspStart])) + DspStart++; + DspStart++; + } + } else { DspStart = Pos - Margin; if (DspStart < 0) DspStart = 0; } +#endif /* SUPPORT_MULTIBYTE_EDIT */ + } str = &Buf[DspStart]; +#ifdef SUPPORT_MULTIBYTE_EDIT + if (HTCJK != NOCJK && !isascii(str[0])) + begin_multi = 1; +#endif /* SUPPORT_MULTIBYTE_EDIT */ nrdisplayed = length-DspStart; if (nrdisplayed > DspWdth) @@ -2515,15 +2882,29 @@ PUBLIC void LYRefreshEdit ARGS1( !(LYCharSet_UC[current_char_set].like8859 & UCT_R_8859SPECL))))) { addch(' '); +#ifdef SUPPORT_MULTIBYTE_EDIT + end_multi = 0; +#endif /* SUPPORT_MULTIBYTE_EDIT */ } else { /* For CJK strings, by Masanobu Kimura */ if (HTCJK != NOCJK && !isascii(buffer[0])) { +#ifndef SUPPORT_MULTIBYTE_EDIT if (i < (nrdisplayed - 1)) buffer[1] = str[++i]; +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (i < (nrdisplayed - 1)) { + buffer[1] = str[++i]; + end_multi = 1; + } else + end_multi = 0; +#endif /* SUPPORT_MULTIBYTE_EDIT */ addstr(buffer); buffer[1] = '\0'; } else { addstr(buffer); +#ifdef SUPPORT_MULTIBYTE_EDIT + end_multi = 0; +#endif /* SUPPORT_MULTIBYTE_EDIT */ } } } @@ -2540,16 +2921,39 @@ PUBLIC void LYRefreshEdit ARGS1( */ if (edit->panon) { if ((DspStart + nrdisplayed) < length) { +#ifndef SUPPORT_MULTIBYTE_EDIT move(edit->sy, edit->sx+nrdisplayed-1); addch('}'); +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (end_multi) { + move(edit->sy, edit->sx+nrdisplayed-2); + addstr(" }"); + } else { + move(edit->sy, edit->sx+nrdisplayed-1); + addch('}'); + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ } if (DspStart) { move(edit->sy, edit->sx); +#ifndef SUPPORT_MULTIBYTE_EDIT + addch('{'); +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (begin_multi) + addstr("{ "); + else addch('{'); +#endif /* SUPPORT_MULTIBYTE_EDIT */ } } move(edit->sy, edit->sx + Pos - DspStart); +#ifdef SUPPORT_MULTIBYTE_EDIT +#if (!USE_SLANG && !defined(USE_MULTIBYTE_CURSES)) + if (HTCJK != NOCJK) + lynx_force_repaint(); +#endif /* !USE_SLANG && !defined(USE_MULTIBYTE_CURSES) */ +#endif /* SUPPORT_MULTIBYTE_EDIT */ refresh(); } @@ -2567,6 +2971,9 @@ PUBLIC int LYgetstr ARGS4( int last_xlkc = -1; EditFieldData MyEdit; char *res; +#ifdef SUPPORT_MULTIBYTE_EDIT + BOOL refresh = TRUE; +#endif /* SUPPORT_MULTIBYTE_EDIT */ LYGetYX(y, x); /* Use screen from cursor position to eol */ MaxStringSize = (bufsize < sizeof(MyEdit.buffer)) ? @@ -2576,8 +2983,25 @@ PUBLIC int LYgetstr ARGS4( for (;;) { again: +#ifndef SUPPORT_MULTIBYTE_EDIT LYRefreshEdit(&MyEdit); +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (refresh) + LYRefreshEdit(&MyEdit); +#endif /* SUPPORT_MULTIBYTE_EDIT */ ch = LYgetch_for(FOR_PROMPT); +#ifdef SUPPORT_MULTIBYTE_EDIT +#ifdef CJK_EX /* for SJIS code */ + if (!refresh + && (EditBinding(ch) != LYE_CHAR)) + goto again; +#else + if (!refresh + && (EditBinding(ch) != LYE_CHAR) + && (EditBinding(ch) != LYE_AIX)) + goto again; +#endif +#endif /* SUPPORT_MULTIBYTE_EDIT */ #ifdef VMS if (term_letter || term_options || #ifndef DISABLE_NEWS @@ -2607,8 +3031,10 @@ again: ch |= LKC_MOD3; last_xlkc = -1; /* consumed */ } +#ifndef WIN_EX if (LKC_TO_LAC(keymap,ch) == LYK_REFRESH) goto again; +#endif xlec = EditBinding(ch); if ((xlec & LYE_DF) && !(xlec & LYE_FORM_LAC)) { last_xlkc = ch; @@ -2644,6 +3070,8 @@ again: ch = '\0'; } break; + +#ifndef CJK_EX /* 1997/11/03 (Mon) 20:13:45 */ case LYE_AIX: /* * Hex 97. @@ -2653,10 +3081,12 @@ again: */ if (ch != '\t' && (HTCJK != NOCJK || - LYlowest_eightbit[current_char_set] <= 0x97)) { + LYlowest_eightbit[current_char_set] <= 0x97)) + { LYLineEdit(&MyEdit,ch, FALSE); break; } +#endif case LYE_ENTER: /* * Terminate the string and return. @@ -2665,6 +3095,32 @@ again: LYAddToCloset(MyEdit.buffer); return(ch); +#if defined(WIN_EX) + /* 1998/10/01 (Thu) 15:05:49 */ + +#define PASTE_MAX 512 + + case LYE_PASTE: + { + unsigned char buff[PASTE_MAX]; + int i, len; + + len = get_clip(buff, PASTE_MAX); + + if (len > 0) { + i = 0; + while ((ch = buff[i]) != '\0') { + if (ch == '\r' || ch == '\n') + break; + if (ch >= ' ') + LYLineEdit(&MyEdit, ch, FALSE); + i++; + } + } + break; + } +#endif + case LYE_ABORT: /* * Control-C or Control-G aborts. @@ -2698,7 +3154,20 @@ again: break; } +#ifndef SUPPORT_MULTIBYTE_EDIT LYLineEdit(&MyEdit, ch, FALSE); +#else /* SUPPORT_MULTIBYTE_EDIT */ + if (LYLineEdit(&MyEdit, ch, FALSE) == 0) { + if (refresh && HTCJK != NOCJK && (0x81 <= ch) && (ch <= 0xfe)) + refresh = FALSE; + else + refresh = TRUE; + } else { + if (!refresh) { + LYEdit1(&MyEdit, 0, LYE_DELP, FALSE); + } + } +#endif /* SUPPORT_MULTIBYTE_EDIT */ } } } @@ -2824,6 +3293,63 @@ PUBLIC char * LYno_attr_char_case_strstr ARGS2( return(NULL); } +PUBLIC void LYOpenCloset NOARGS +{ + /* We initialize the list-looka-like, i.e., the Closet */ + int i = 0; + while(i < LYClosetSize){ + LYCloset[i] = NULL; + i = i + 1; + } + LYClosetTop = 0; +} + +PUBLIC void LYCloseCloset NOARGS +{ + int i = 0; + + /* Clean up the list-looka-like, i.e., the Closet */ + while (i < LYClosetSize){ + FREE(LYCloset[i]); + i = i + 1; + } +} + +/* + * Strategy: We begin at the top and search downwards. We return the first + * match, i.e., the newest since we search from the top. This should be made + * more intelligent, but works for now. + */ +PRIVATE char * LYFindInCloset ARGS1(char*, base) +{ + int shelf; + unsigned len = strlen(base); + + shelf = (LYClosetTop - 1 + LYClosetSize) % LYClosetSize; + + while (LYCloset[shelf] != NULL){ + if (!strncmp(base, LYCloset[shelf], len)) { + return(LYCloset[shelf]); + } + shelf = (shelf - 1 + LYClosetSize) % LYClosetSize; + } + return(0); +} + +PRIVATE int LYAddToCloset ARGS1(char*, str) +{ + unsigned len = strlen(str); + + LYCloset[LYClosetTop] = malloc(len+1); + if (!LYCloset[LYClosetTop]) + outofmem(__FILE__, "LYAddToCloset"); + strcpy(LYCloset[LYClosetTop], str); + + LYClosetTop = (LYClosetTop + 1) % LYClosetSize; + FREE(LYCloset[LYClosetTop]); + return(1); +} + /* * LYno_attr_char_strstr will find the first occurrence of the * string pointed to by tarptr in the string pointed to by chptr. @@ -3161,63 +3687,6 @@ PUBLIC char * LYno_attr_mbcs_strstr ARGS5( return(NULL); } -PUBLIC void LYOpenCloset NOARGS -{ - /* We initialize the list-looka-like, i.e., the Closet */ - int i = 0; - while(i < LYClosetSize){ - LYCloset[i] = NULL; - i = i + 1; - } - LYClosetTop = 0; -} - -PUBLIC void LYCloseCloset NOARGS -{ - int i = 0; - - /* Clean up the list-looka-like, i.e., the Closet */ - while (i < LYClosetSize){ - FREE(LYCloset[i]); - i = i + 1; - } -} - -/* - * Strategy: We begin at the top and search downwards. We return the first - * match, i.e., the newest since we search from the top. This should be made - * more intelligent, but works for now. - */ -PRIVATE char * LYFindInCloset ARGS1(char*, base) -{ - int shelf; - unsigned len = strlen(base); - - shelf = (LYClosetTop - 1 + LYClosetSize) % LYClosetSize; - - while (LYCloset[shelf] != NULL){ - if (!strncmp(base, LYCloset[shelf], len)) { - return(LYCloset[shelf]); - } - shelf = (shelf - 1 + LYClosetSize) % LYClosetSize; - } - return(0); -} - -PRIVATE int LYAddToCloset ARGS1(char*, str) -{ - unsigned len = strlen(str); - - LYCloset[LYClosetTop] = malloc(len+1); - if (!LYCloset[LYClosetTop]) - outofmem(__FILE__, "LYAddToCloset"); - strcpy(LYCloset[LYClosetTop], str); - - LYClosetTop = (LYClosetTop + 1) % LYClosetSize; - FREE(LYCloset[LYClosetTop]); - return(1); -} - /* * Allocate a new copy of a string, and returns it. */ @@ -3386,9 +3855,9 @@ PUBLIC int UPPER8 ARGS2(int,ch1, int,ch2) charset_in = current_char_set; /* display character set */ charset_out = UCGetLYhndl_byMIME("us-ascii"); - uck1 = UCTransCharStr(replace_buf1, sizeof(replace_buf1), ch1, + uck1 = UCTransCharStr(replace_buf1, sizeof(replace_buf1), (char)ch1, charset_in, charset_out, YES); - uck2 = UCTransCharStr(replace_buf2, sizeof(replace_buf2), ch2, + uck2 = UCTransCharStr(replace_buf2, sizeof(replace_buf2), (char)ch2, charset_in, charset_out, YES); if ((uck1 > 0) && (uck2 > 0)) /* both replacement strings found */ diff --git a/src/LYStrings.h b/src/LYStrings.h index 33e38a67..c61ab0c7 100644 --- a/src/LYStrings.h +++ b/src/LYStrings.h @@ -237,15 +237,19 @@ typedef struct _EditFieldData { #define LYE_FORM_LAC 0x1000 /* Flag to pass lynxactioncode given by lower bits. Doesn't fit in a char! */ +#if defined(WIN_EX) +#define LYE_PASTE (LYE_AIX +1) /* ClipBoard to Lynx */ +#endif + #if defined(USE_KEYMAPS) extern int lynx_initialize_keymaps NOPARAMS; extern int map_string_to_keysym PARAMS((char * src, int *lec)); #endif extern void LYLowerCase PARAMS(( - char * buffer)); + unsigned char * buffer)); extern void LYUpperCase PARAMS(( - char * buffer)); + unsigned char * buffer)); extern void LYRemoveBlanks PARAMS(( char * buffer)); extern char * LYSkipBlanks PARAMS(( diff --git a/src/LYStyle.c b/src/LYStyle.c index a2accfb8..062c2715 100644 --- a/src/LYStyle.c +++ b/src/LYStyle.c @@ -1,6 +1,6 @@ /* character level styles for Lynx * (c) 1996 Rob Partington -- donated to the Lyncei (if they want it :-) - * $Id: LYStyle.c,v 1.21 1999/05/28 14:18:50 tom Exp $ + * $Id: LYStyle.c,v 1.22 1999/07/14 16:44:55 tom Exp $ */ #include <HTUtils.h> #include <HTML.h> @@ -22,6 +22,7 @@ #include <LYexit.h> #include <LYLeaks.h> #include <LYStrings.h> +#include <LYUtils.h> #ifdef USE_COLOR_STYLE @@ -404,7 +405,7 @@ PUBLIC int style_readFromFile ARGS1(char*, file) CTRACE(tfp, "CSS:Reading styles from file: %s\n", file ? file : "?!? empty ?!?"); if (file == NULL || *file == '\0') return -1; - fh = fopen(file, "r"); + fh = fopen(file, TXT_R); if (!fh) { /* this should probably be an alert or something */ diff --git a/src/LYTraversal.c b/src/LYTraversal.c index 04c18154..6af29e1c 100644 --- a/src/LYTraversal.c +++ b/src/LYTraversal.c @@ -37,7 +37,7 @@ PUBLIC BOOLEAN lookup ARGS1(char *,target) char *line = NULL; int result = FALSE; - if ((ifp = fopen(TRAVERSE_FILE,"r")) == NULL) { + if ((ifp = fopen(TRAVERSE_FILE, TXT_R)) == NULL) { if ((ifp = LYNewTxtFile(TRAVERSE_FILE)) == NULL) { exit_with_perror(CANNOT_OPEN_TRAV_FILE); } else { @@ -144,7 +144,7 @@ PUBLIC BOOLEAN lookup_reject ARGS1(char *,target) int len; int result = FALSE; - if ((ifp = fopen(TRAVERSE_REJECT_FILE,"r")) == NULL){ + if ((ifp = fopen(TRAVERSE_REJECT_FILE, TXT_R)) == NULL){ return(FALSE); } diff --git a/src/LYUtils.c b/src/LYUtils.c index 73ff1bf3..84b4037f 100644 --- a/src/LYUtils.c +++ b/src/LYUtils.c @@ -21,6 +21,16 @@ #include <HTFile.h> #endif +#if _WIN_CC +extern int exec_command(char * cmd, int wait_flag); /* xsystem.c */ +#endif + +#ifdef _WINDOWS /* 1998/04/30 (Thu) 19:04:25 */ +#define GETPID() (getpid() & 0xffff) +#else +#define GETPID() getpid() +#endif /* _WINDOWS */ + #ifdef DJGPP_KEYHANDLER #include <bios.h> #endif /* DJGPP_KEYHANDLER */ @@ -94,7 +104,6 @@ extern int BSDselect PARAMS((int nfds, fd_set * readfds, fd_set * writefds, #define COPY_COMMAND "%s %s %s" -extern HTkcode kanji_code; extern BOOLEAN LYHaveCJKCharacterSet; extern HTCJKlang HTCJK; @@ -1840,6 +1849,9 @@ PUBLIC void statusline ARGS1( unsigned char *temp = NULL; int max_length, len, i, j; unsigned char k; + char *p; + char text_buff[256]; + int text_len; if (text == NULL) return; @@ -1860,6 +1872,25 @@ PUBLIC void statusline ARGS1( } mustshow = FALSE; + /* "LYNXDOWNLOAD://Method=-1/File=%s/SugFile=%s%s\">Save to disk</a>\n" */ + /* 1997/12/23 (Tue) 15:58:58 */ + text_len = strlen(text); + if (text_len < 256) { + strcpy(text_buff, text); + } else { + strncpy(text_buff, text, 255); + text_buff[255] = '\0'; + p = strchr(text_buff, '\n'); + if (p) + p= '\0'; + } + if (strncmp(text, "LYNXDOWNLOAD:", 13) == 0) { + p = strstr(text + 13, "SugFile="); + if (p != NULL) { + strcpy(text_buff, p + 3); + } + } + /* * Deal with any CJK escape sequences and Kanji if we have a CJK * character set selected, otherwise, strip any escapes. Also, @@ -1867,21 +1898,28 @@ PUBLIC void statusline ARGS1( */ max_length = ((LYcols - 2) < (int)sizeof(buffer)) ? (LYcols - 2) : (int)sizeof(buffer)-1; - if ((text[0] != '\0') && + if ((text_buff[0] != '\0') && (LYHaveCJKCharacterSet)) { /* * Translate or filter any escape sequences. - FM */ - if ((temp = (unsigned char *)calloc(1, strlen(text) + 1)) == NULL) + if ((temp = (unsigned char *)calloc(1, strlen(text_buff) + 1)) == NULL) outofmem(__FILE__, "statusline"); if (kanji_code == EUC) { - TO_EUC((CONST unsigned char *)text, temp); + TO_EUC((CONST unsigned char *)text_buff, temp); } else if (kanji_code == SJIS) { - TO_SJIS((CONST unsigned char *)text, temp); +#ifdef CJK_EX + if (!LYRawMode || last_kcode == SJIS) + strcpy(temp, text_buff); + else + TO_SJIS((CONST unsigned char *)text_buff, temp); +#else + strcpy(temp, text_buff); +#endif } else { - for (i = 0, j = 0; text[i]; i++) { - if (text[i] != CH_ESC) { /* S/390 -- gil -- 2119 */ - temp[j++] = text[i]; + for (i = 0, j = 0; text_buff[i]; i++) { + if (text_buff[i] != CH_ESC) { /* S/390 -- gil -- 2119 */ + temp[j++] = text_buff[i]; } } temp[j] = '\0'; @@ -1922,9 +1960,9 @@ PUBLIC void statusline ARGS1( * code added here for determining the displayed string length, * as we do above for CJK. - FM */ - for (i = 0, len = 0; text[i] != '\0' && len < max_length; i++) { - if (text[i] != CH_ESC) { /* S/390 -- gil -- 2136 */ - buffer[len++] = text[i]; + for (i = 0, len = 0; text_buff[i] != '\0' && len < max_length; i++) { + if (text_buff[i] != CH_ESC) { /* S/390 -- gil -- 2119 */ + buffer[len++] = text_buff[i]; } } buffer[len] = '\0'; @@ -1950,6 +1988,7 @@ PUBLIC void statusline ARGS1( move(LYlines-1, 0); } clrtoeol(); + if (text != NULL && text[0] != '\0') { #ifdef HAVE_UTF8_STATUSLINES if (LYCharSet_UC[current_char_set].enc == UCT_ENC_UTF8) { @@ -2024,7 +2063,6 @@ PUBLIC void noviceline ARGS1( clrtoeol(); addstr(NOVICE_LINE_ONE); clrtoeol(); - #if defined(DIRED_SUPPORT ) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support) addstr(DIRED_NOVICELINE); @@ -2148,6 +2186,7 @@ PUBLIC int HTCheckForInterrupt NOARGS if (DontCheck()) return((int)FALSE); +#ifndef _WINDOWS /* 1998/03/30 (Mon) 17:07:41 */ #ifdef USE_SLANG /** No keystroke was entered Note that this isn't taking possible SOCKSification @@ -2176,13 +2215,14 @@ PUBLIC int HTCheckForInterrupt NOARGS &socket_timeout); /** Suspended? **/ - if ((ret == -1) && (errno == EINTR)) + if ((ret == -1) && (SOCKET_ERRNO == EINTR)) return((int)FALSE); /** No keystroke was entered? **/ if (!FD_ISSET(0,&readfds)) return((int)FALSE); #endif /* USE_SLANG */ +#endif /* !_WINDOWS */ #if defined (DOSPATH) && defined (NCURSES) nodelay(stdscr,TRUE); @@ -2359,7 +2399,7 @@ PUBLIC BOOLEAN LYisRootPath ARGS1( && isalpha(path[0]) && path[1] == ':' && LYIsPathSep(path[2])) - return TRUE; + return TRUE; #endif return ((strlen(path) == 1) && LYIsPathSep(path[0])); } @@ -3039,6 +3079,7 @@ extern char *ttyname PARAMS((int fd)); PUBLIC BOOLEAN inlocaldomain NOARGS { #if ! HAVE_UTMP + CTRACE(tfp, "LYUtils: inlocaldomain() not support.\n"); return(TRUE); #else int n; @@ -3293,11 +3334,19 @@ PUBLIC void change_sug_filename ARGS1( if (temp == NULL) outofmem(__FILE__, "change_sug_filename"); cp = wwwName(lynx_temp_space); +#ifdef FNAMES_8_3 + if (LYIsHtmlSep(*cp)) { + sprintf(temp, "file://localhost%s%04x", cp, GETPID()); + } else { + sprintf(temp, "file://localhost/%s%04x", cp, GETPID()); + } +#else if (LYIsHtmlSep(*cp)) { sprintf(temp, "file://localhost%s%d", cp, (int)getpid()); } else { sprintf(temp, "file://localhost/%s%d", cp, (int)getpid()); } +#endif if (!strncmp(fname, temp, strlen(temp))) { cp = strrchr(fname, '.'); if (strlen(cp) > (strlen(temp) - 4)) @@ -3330,6 +3379,19 @@ PUBLIC void change_sug_filename ARGS1( } *cp1 = '\0'; } +#ifdef _WINDOWS /* 1998/05/05 (Tue) 10:08:05 */ + if ((cp = strrchr(fname,'=')) != NULL && strlen(cp) > 1) { + cp1 = fname; + /* + * Go past the '='. + */ + cp++; + for (; *cp != '\0'; cp++, cp1++) { + *cp1 = *cp; + } + *cp1 = '\0'; + } +#endif /* * Trim off date-size suffix, if present. @@ -3564,6 +3626,15 @@ PRIVATE int fmt_tempname ARGS3( if (suffix == 0) suffix = ""; counter++; +#ifdef _WINDOWS /* 1998/05/25 (Mon) 20:51:22 */ + { + char *p = result; + while (*p++) { + if (*p == '/') + *p = '\\'; + } + } +#endif #ifdef FNAMES_8_3 /* * The 'lynx_temp_space' string ends with a '/' or '\\', so we only have to @@ -3571,7 +3642,11 @@ PRIVATE int fmt_tempname ARGS3( * the suffix may contain more than a ".htm", e.g., "-txt.gz", so we trim * off from the filename portion to make room. */ +#ifdef _WINDOWS + sprintf(leaf, "%04x%04x", counter, (unsigned)GETPID()); +#else sprintf(leaf, "%u%u", counter, (unsigned)getpid()); +#endif if (strlen(leaf) > 8) leaf[8] = 0; if (strlen(suffix) > 4 || *suffix != '.') { @@ -3756,6 +3831,52 @@ PRIVATE BOOLEAN *restrict_flag[] = { #endif (BOOLEAN *) 0 }; + +/* This will make no difference between '-' and '_'. It does only in/equality + compare. It assumes that p2 can't contain dashes, but p1 can. + This function is also used (if macro OPTNAME_ALLOW_DASHES doesn't have + value of zero) for compare of commandline options -VH + */ +PUBLIC BOOL strn_dash_equ ARGS3( + CONST char* ,p1, + CONST char* ,p2, + int ,len) +{ + while (len--) { + if (!*p2) + return 0;/* canonical name is shorter */ + switch (*p1) { + case 0: + return 0; + case '-': + case '_': + if (*p2!='_') + return 0; + else + break; + default: + if (*p1!=*p2) + return 0; + } + ++p1; ++p2; + } + return 1; +} + +/* Uncomment following lines to allow only exact string matching */ +/* #define RESTRICT_NM_ALLOW_DASHES 0 */ + +#ifndef RESTRICT_NM_ALLOW_DASHES +# define RESTRICT_NM_ALLOW_DASHES 1 +#endif + +#if RESTRICT_NM_ALLOW_DASHES +# define RESTRICT_NM_EQU(a,b,len) strn_dash_equ(a,b,len) +#else +# define RESTRICT_NM_EQU(a,b,len) STRNEQ(a,b,len) +#endif + + PUBLIC void parse_restrictions ARGS1( CONST char *, s) { @@ -3772,13 +3893,13 @@ PUBLIC void parse_restrictions ARGS1( while (*p != ',' && *p != '\0') p++; - if (STRNEQ(word, "all", p-word)) { + if (RESTRICT_NM_EQU(word, "all", p-word)) { /* set all restrictions */ for (i=N_SPECIAL_RESTRICT_OPTIONS; restrict_flag[i]; i++) *restrict_flag[i] = TRUE; } - if (STRNEQ(word, "default", p-word)) { + if (RESTRICT_NM_EQU(word, "default", p-word)) { /* set all restrictions */ for (i=N_SPECIAL_RESTRICT_OPTIONS; restrict_flag[i]; i++) *restrict_flag[i] = TRUE; @@ -3839,7 +3960,7 @@ PUBLIC void parse_restrictions ARGS1( } for (i=0; restrict_name[i]; i++) { - if (STRNEQ(word, restrict_name[i], p-word)) { + if (RESTRICT_NM_EQU(word, restrict_name[i], p-word)) { *restrict_flag[i] = TRUE; break; } @@ -4232,7 +4353,26 @@ PUBLIC void LYConvertToURL ARGS2( have_VMS_URL: CTRACE(tfp, "Trying: '%s'\n", *AllocatedString); #else /* not VMS: */ -#ifdef DOSPATH +#if defined(DOSPATH) +#ifdef _WINDOWS + if (*old_string == '.') { + char fullpath[MAX_PATH + 1]; + char *filepart = NULL; + DWORD chk; + + chk = GetFullPathNameA(old_string, MAX_PATH + 1, + fullpath, &filepart); + if (chk != 0) { + StrAllocCopy(temp, HTDOS_wwwName(fullpath)); + StrAllocCat(*AllocatedString, temp); + FREE(temp); + CTRACE(tfp, "Converted '%s' to '%s'\n", + old_string, *AllocatedString); + } else { + StrAllocCat(*AllocatedString, old_string); + } + } +#else if (strlen(old_string) == 1 && *old_string == '.') { /* * They want . @@ -4243,7 +4383,9 @@ have_VMS_URL: FREE(temp); CTRACE(tfp, "Converted '%s' to '%s'\n", old_string, *AllocatedString); - } else + } +#endif + else #endif /* DOSPATH */ if (*old_string == '~') { /* @@ -4275,15 +4417,25 @@ have_VMS_URL: * Concatenate and simplify, trimming any * residual relative elements. - FM */ -#if defined (DOSPATH) || defined (__EMX__) +#if defined (DOSPATH) || defined (__EMX__) || defined (WIN_EX) if (old_string[1] != ':' && old_string[1] != '|') { +#ifdef DOSPATH + StrAllocCopy(temp, HTDOS_wwwName(curdir)); +#else StrAllocCopy(temp, wwwName(curdir)); +#endif LYAddHtmlSep(&temp); LYstrncpy(curdir, temp, (sizeof(curdir) - 1)); StrAllocCat(temp, old_string); } else { curdir[0] = '\0'; + /* 1998/01/13 (Tue) 12:24:33 */ + if (old_string[1] == '|') + old_string[1] = ':'; StrAllocCopy(temp, old_string); + + if (strlen(temp) == 2 && temp[1] == ':') + StrAllocCat(temp, "/"); } #else StrAllocCopy(temp, curdir); @@ -4302,12 +4454,13 @@ have_VMS_URL: /* especially when we really have file://localhost/ */ /* at the beginning. To avoid any confusion we allow */ /* escaping the path if URL specials % or # present. */ - if (strchr(temp, '#') == NULL && - strchr(temp, '%') == NULL) - StrAllocCopy(cp, temp); + if (strchr(temp, '#') == NULL && strchr(temp, '%') == NULL) + StrAllocCopy(cp, temp); else -#endif /* DOSPATH */ + cp = HTEscape(temp, URL_PATH); +#else cp = HTEscape(temp, URL_PATH); +#endif /* DOSPATH */ StrAllocCat(*AllocatedString, cp); FREE(cp); CTRACE(tfp, "Converted '%s' to '%s'\n", @@ -4324,6 +4477,9 @@ have_VMS_URL: StrAllocCat(temp2, cp); /* append to current dir */ StrAllocCopy(cp2, temp2); /* keep a copy in cp2 */ LYTrimRelFromAbsPath(temp2); +#ifdef WIN_EX /* 1998/07/31 (Fri) 09:09:03 */ + HTUnEscape(temp2); /* for LFN */ +#endif if (strcmp(temp2, temp) != 0 && ((stat(temp2, &st) > -1) || @@ -4392,9 +4548,28 @@ have_VMS_URL: */ CTRACE(tfp, "Can't stat() or fopen() '%s'\n", temp2 ? temp2 : temp); +#ifdef WIN_EX /* 1998/01/13 (Tue) 09:07:37 */ + { + char *p, *q, buff[LY_MAXPATH + 128]; + + p = (char *)Home_Dir(); + q = temp2 ? temp2 : temp; + + if (strlen(q) == 3 && isalpha(q[0]) && q[1] == ':') { + sprintf(buff, + "'%s' not exist, Goto LynxHome '%s'.", q, p); + _statusline(buff); + sleep(AlertSecs); + FREE(temp); + StrAllocCat(*AllocatedString, p); + goto Retry; + } + } +#endif if (LYExpandHostForURL((char **)&old_string, URLDomainPrefixes, - URLDomainSuffixes)) { + URLDomainSuffixes)) + { if (!LYAddSchemeForURL((char **)&old_string, "http://")) { StrAllocCopy(*AllocatedString, "http://"); StrAllocCat(*AllocatedString, old_string); @@ -4405,6 +4580,9 @@ have_VMS_URL: /* RW 1998Mar16 Restore AllocatedString to 'old_string' */ StrAllocCopy(*AllocatedString, old_string); } +#ifdef WIN_EX + Retry: +#endif CTRACE(tfp, "Trying: '%s'\n", *AllocatedString); } FREE(temp); @@ -4484,6 +4662,38 @@ have_VMS_URL: CTRACE_SLEEP(AlertSecs); } +#if defined(_WINDOWS) /* 1998/06/23 (Tue) 16:45:20 */ + +PUBLIC int win32_check_interrupt() +{ + int c; + + if (kbhit()) { + c = getch(); + /** Keyboard 'Z' or 'z', or Control-G or Control-C **/ + if (TOUPPER(c) == 'Z' || c == 7 || c == 3 || c == 0x1b) { + return TRUE; + } + } + return FALSE; +} + +void sleep(unsigned sec) +{ + int i, j, c; + + for (j = 0; j < sec; j++) { + for (i = 0; i < 10; i++) { + Sleep(100); + if (kbhit()) { + c = getch(); + return; + } + } + } +} +#endif + /* * This function rewrites and reallocates a previously allocated * string so that the first element is a confirmed Internet host, @@ -4515,6 +4725,10 @@ PUBLIC BOOLEAN LYExpandHostForURL ARGS3( char *Fragment = NULL; BOOLEAN GotHost = FALSE; BOOLEAN Startup = (helpfilepath == NULL); +#ifdef _WINDOWS + int hoststat; + struct hostent *phost; /* Pointer to host - See netdb.h */ +#endif /* * If it's a NULL or zero-length string, @@ -4596,7 +4810,8 @@ PUBLIC BOOLEAN LYExpandHostForURL ARGS3( * Clear any residual interrupt. - FM */ if (LYCursesON && HTCheckForInterrupt()) { - CTRACE(tfp, "LYExpandHostForURL: Ignoring interrupt because '%s' resolved.\n", + CTRACE(tfp, + "LYExpandHostForURL: Ignoring interrupt because '%s' resolved.\n", host); } @@ -4608,15 +4823,18 @@ PUBLIC BOOLEAN LYExpandHostForURL ARGS3( FREE(Str); FREE(MsgStr); return GotHost; + } #ifndef DJGPP - } else if (LYCursesON && (lynx_nsl_status == HT_INTERRUPTED)) { + else if (LYCursesON && (lynx_nsl_status == HT_INTERRUPTED)) #else /* DJGPP */ - } else if (LYCursesON && HTCheckForInterrupt()) { + else if (LYCursesON && HTCheckForInterrupt()) #endif /* DJGPP */ + { /* * Give the user chance to interrupt lookup cycles. - KW & FM */ - CTRACE(tfp, "LYExpandHostForURL: Interrupted while '%s' failed to resolve.\n", + CTRACE(tfp, + "LYExpandHostForURL: Interrupted while '%s' failed to resolve.\n", host); /* @@ -4707,10 +4925,10 @@ PUBLIC BOOLEAN LYExpandHostForURL ARGS3( } else if (Startup && !dump_output_immediately) { fprintf(stdout, "%s '%s'%s\n", WWW_FIND_MESSAGE, host, GUESSING_SEGMENT); } -#ifndef DJGPP - GotHost = (LYGetHostByName(host) != NULL); -#else +#ifdef DJGPP GotHost = (resolve(host) != 0); +#else + GotHost = (LYGetHostByName(host) != NULL); #endif /* DJGPP */ if (HostColon != NULL) { *HostColon = ':'; @@ -4719,13 +4937,14 @@ PUBLIC BOOLEAN LYExpandHostForURL ARGS3( /* * Give the user chance to interrupt lookup cycles. - KW */ -#ifndef DJGPP - if (LYCursesON && (lynx_nsl_status == HT_INTERRUPTED)) -#else /* DJGPP */ +#ifdef DJGPP if (LYCursesON && HTCheckForInterrupt()) +#else /* !DJGPP */ + if (LYCursesON && (lynx_nsl_status == HT_INTERRUPTED)) #endif /* DJGPP */ { - CTRACE(tfp, "LYExpandHostForURL: Interrupted while '%s' failed to resolve.\n", + CTRACE(tfp, + "LYExpandHostForURL: Interrupted while '%s' failed to resolve.\n", host); FREE(Str); FREE(MsgStr); @@ -5220,6 +5439,12 @@ PUBLIC BOOLEAN LYPathOffHomeOK ARGS2( return(FALSE); } } +#ifdef _WINDOWS /* 1997/10/16 (Thu) 22:08:17 */ + strcpy(buff, homedir); + p = buff; + while (*p++) if (*p == '\\') *p = '/'; + homedir = buff; +#endif } #endif /* VMS */ if (*cp == '~') { @@ -5705,7 +5930,7 @@ PUBLIC time_t LYmktime ARGS2( return(clock2); } -#if ! HAVE_PUTENV +#if !defined(HAVE_PUTENV) && !defined(_WINDOWS) /* * No putenv on the next so we use this code instead! */ @@ -5802,7 +6027,7 @@ int remove ARGS1(char *, name) } #endif -#ifdef UNIX +#if defined(UNIX) /* * Verify if this is really a file, not accessed by a link, except for the * special case of its directory being pointed to by a link from a directory @@ -5886,6 +6111,10 @@ PRIVATE FILE *OpenHiddenFile ARGS2(char *, name, char *, mode) fd = open(name, O_CREAT|O_EXCL|O_WRONLY, HIDE_CHMOD); } if (fd >= 0) { +#ifdef O_BINARY /* for __CYGWIN_ */ + if (mode[1] == 'b') + setmode(fd, O_BINARY); +#endif fp = fdopen(fd, mode); } } @@ -5914,7 +6143,7 @@ PRIVATE FILE *OpenHiddenFile ARGS2(char *, name, char *, mode) } return fp; } -#else +#else /* !UNIX */ # ifndef VMS # define OpenHiddenFile(name, mode) fopen(name, mode) # endif @@ -6206,13 +6435,14 @@ PUBLIC FILE *LYOpenTempRewrite ARGS3( * We truncate and then append, this avoids having a small * window in which the file doesn't exist. - kw */ +#if HAVE_TRUNCATE if (truncate(fname, 0) != 0) { CTRACE(tfp, "... truncate(%s,0) failed: %s\n", fname, LYStrerror(errno)); return (LYOpenTemp(fname, suffix, mode)); - } else { - return (LYReopenTemp(fname)); } +#endif + return (LYReopenTemp(fname)); } else if (writable_exists) { /* * File exists, writable if we checked, but something is wrong @@ -6662,7 +6892,7 @@ PUBLIC void LYTrimPathSep ARGS1( #endif /* - * Add a trailing path-separator to avoid confusing other programs when we concatenate + * Add a trailing path-separator to avoid confusing other programs when we concateate * to it. This only applies to local filesystems. */ PUBLIC void LYAddPathSep ARGS1( @@ -6767,6 +6997,31 @@ PUBLIC int LYCopyFile ARGS2( char *, src, char *, dst) { +#ifdef SH_EX + +#define BUF_SIZE 1024 + + FILE *fin, *fout; + unsigned char buff[BUF_SIZE]; + int len; + + fin = fopen(src, "rb"); + if (fin == NULL) + return EOF; + + fout = fopen(dst, "wb"); + if (fout == NULL) + return EOF; + + while ((len = fread(buff, 1, BUF_SIZE, fin)) > 0) { + fwrite(buff, 1, len, fout); + } + fclose(fin); + fclose(fout); + + return 0; + +#else int code; char *the_command = 0; @@ -6781,8 +7036,8 @@ PUBLIC int LYCopyFile ARGS2( start_curses(); FREE(the_command); - return code; +#endif } /* @@ -6830,12 +7085,67 @@ PUBLIC int LYSystem ARGS1( } } # endif + +#if defined(__CYGWIN__) && defined(DOSPATH) /* 1999/02/26 (Fri) */ + { + char cmd[LY_MAXPATH]; + char win32_name[LY_MAXPATH]; + char new_cmd[LY_MAXPATH]; + char new_command[LY_MAXPATH * 2 + 10]; + char *p, *q; + + p = command; + q = cmd; + while (*p) { + if (*p == ' ') + break; + else + *q = *p; + p++; + q++; + } + *q = '\0'; + + if (cmd[0] == '/') + cygwin_conv_to_full_posix_path(cmd, new_cmd); + else + strcpy(new_cmd, cmd); + + while (*p == ' ') + p++; + + if (strchr(p, '\\') == NULL) { + /* for Windows Application */ + cygwin_conv_to_full_win32_path(p, win32_name); + sprintf(new_command, "%s \"%s\"", new_cmd, win32_name); + } else { + /* for DOS like editor */ + q = win32_name; + while (*p) { + if (*p == '\\') { + if (*(p+1) == '\\') + p++; + } + *q = *p; + q++, p++; + } + *q = '\0'; + sprintf(new_command, "%s %s", new_cmd, win32_name); + } + command = new_command; + } +#endif + +#if _WIN_CC + code = exec_command(command, TRUE); /* Wait exec */ +#else if (restore_sigpipe_for_children) signal(SIGPIPE, SIG_DFL); /* Some commands expect the default */ code = system(command); if (restore_sigpipe_for_children) signal(SIGPIPE, SIG_IGN); /* Ignore it again - kw */ #endif +#endif #ifdef __DJGPP__ __djgpp_set_ctrl_c(1); @@ -6853,15 +7163,73 @@ PUBLIC int LYSystem ARGS1( /* * Return a string which can be used in LYSystem() for spawning a subshell */ +#if defined(__CYGWIN__) && defined(DOSPATH) /* 1999/02/26 (Fri) */ +PUBLIC int Cygwin_Shell NOARGS +{ + char *shell; + int code; + STARTUPINFO startUpInfo; + PROCESS_INFORMATION procInfo; + SECURITY_ATTRIBUTES sa; + + /* Set up security attributes to allow inheritance of the file handle */ + + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.lpSecurityDescriptor = 0; + sa.bInheritHandle=TRUE; + + /* Init a startup structure */ + GetStartupInfo(&startUpInfo); + + shell = getenv("COMSPEC"); + + /* Create the child process, specifying + inherited handles. Pass the value of the + handle as a command line parameter */ + code = 0; + if (shell) { + code = CreateProcess(0, shell, 0, 0, + TRUE, 0, + 0, 0, &startUpInfo, &procInfo); + + if (!code) { + printf("shell = [%s], code = %d\n", shell, GetLastError()); + } + + /* wait for the child to return (this is not a requirement + since the child is its own independent process) */ + WaitForSingleObject(procInfo.hProcess, INFINITE); + } + + return code; +} +#endif + PUBLIC char *LYSysShell NOARGS { char *shell = 0; #ifdef DOSPATH - if (getenv("SHELL") != NULL) { - shell = getenv("SHELL"); - } else { - shell = (getenv("COMSPEC") == NULL) ? "command.com" : getenv("COMSPEC"); +#ifdef SH_EX + shell = getenv("SHELL"); + if (shell) { + if (access(shell, 0) != 0) + shell = getenv("COMSPEC"); + } + if (shell == NULL) { + if (system_is_NT) + shell = "cmd.exe"; + else + shell = "command.com"; + } +#else + shell = getenv("SHELL"); + if (shell == NULL) { + shell = getenv("COMSPEC"); + } + if (shell == NULL) { + shell = "command.com"; } +#endif /* SH_EX */ #else #ifdef __EMX__ if (getenv("SHELL") != NULL) { @@ -6922,3 +7290,195 @@ PUBLIC void LYsetXDisplay ARGS1( } } } + +#if defined(WIN_EX) /* 1997/10/16 (Thu) 20:13:28 */ + +#define MAX_DOS_PATH 128 /* exactly 80 */ + +PUBLIC int put_clip(char *szBuffer) +{ + HANDLE hWnd; + HANDLE m_hLogData; + LPTSTR pLogData; + HANDLE hClip; + int len; + + if (szBuffer == NULL) + return EOF; + + len = strlen(szBuffer); + if (len == 0) + return EOF; + else + len ++; + + m_hLogData = GlobalAlloc(GHND, len); + if (m_hLogData == NULL) { + return EOF; + } + + hWnd = NULL; + if (!OpenClipboard(hWnd)) { + return EOF; + } + /* Remove the current Clipboard contents */ + if (!EmptyClipboard()) { + GlobalFree(m_hLogData); + return EOF; + } + + /* Lock the global memory while we write to it. */ + pLogData = (LPTSTR) GlobalLock(m_hLogData); + + lstrcpy((LPTSTR) pLogData, szBuffer); + GlobalUnlock(m_hLogData); + + /* If there were any lines at all then copy them to clipboard. */ + hClip = SetClipboardData(CF_TEXT, m_hLogData); + if (!hClip) { + /* If we couldn't clip the data then free the global handle. */ + GlobalFree(m_hLogData); + } + + CloseClipboard(); + return 0; +} + +PUBLIC int get_clip(char *szBuffer, int size) +{ + HANDLE hWnd; + HANDLE m_hLogData; + LPTSTR pLogData; + int val; + + hWnd = NULL; + if (!OpenClipboard(hWnd)) { + return 0; + } + + lstrcpy(szBuffer, ""); + m_hLogData = GetClipboardData(CF_TEXT); + + if (m_hLogData == NULL) { + val = 0; + } else { + pLogData = (LPTSTR) GlobalLock(m_hLogData); + + val = strlen((LPTSTR) pLogData); + if (size > val) + lstrcpy(szBuffer, (LPTSTR) pLogData); + else { + val = size - 1; + lstrcpyn(szBuffer, (LPTSTR) pLogData, val); + szBuffer[val] = '\0'; + } + + GlobalUnlock(m_hLogData); + } + CloseClipboard(); + + return val; +} + + +PUBLIC char *HTDOS_short_name(char *path) +{ + static char sbuf[MAX_DOS_PATH]; + char *ret; + DWORD r; + + r = GetShortPathName(path, sbuf, sizeof sbuf); + if (r >= sizeof sbuf) { +#if 0 /* DEBUG */ + fprintf(stderr, "bug: recompile with MAX_DOS_PATH > %d\n", r); +#endif + ret = path; + } + if (r == 0) { + ret = path; + } else { + ret = sbuf; + } + return ret; +} +#endif + +#if defined(WIN_EX) + +#ifndef WSABASEERR +#define WSABASEERR 10000 +#endif + +/* + * Description: the windows32 version of perror() + * + * Returns: a pointer to a static error + * + * Notes/Dependencies: I got this from + * comp.os.ms-windows.programmer.win32 + */ +PUBLIC char * w32_strerror(DWORD ercode) +{ +/* __declspec(thread) necessary if you will use multiple threads */ +#ifdef __CYGWIN__ + static char msg_buff[256]; +#else + __declspec(thread) static char msg_buff[256]; +#endif + HMODULE hModule; + int i, msg_type; + unsigned char *p, *q, tmp_buff[256]; + + hModule = NULL; + msg_type = FORMAT_MESSAGE_FROM_SYSTEM; + /* Fill message buffer with a default message in + * case FormatMessage fails + */ + wsprintf(msg_buff, "Error %ld", ercode); + + /* + * Special code for winsock error handling. + */ + if (ercode > WSABASEERR) { + hModule = GetModuleHandle("wsock32"); +#if 0 + if (hModule == NULL) { + hModule = LoadLibrary("wsock32"); + } +#endif + if (hModule == NULL) + ercode = GetLastError(); + else + msg_type = FORMAT_MESSAGE_FROM_HMODULE; + } + /* + * message handling + */ + FormatMessage(msg_type, + hModule, + ercode, + LANG_NEUTRAL, + msg_buff, + sizeof(msg_buff), + NULL); + +#if 0 + if (hModule) { + FreeLibrary(hModule); + } +#endif + + strcpy(tmp_buff, msg_buff); + p = q = tmp_buff; + i = 0; + while (*p) { + if (!(*p == '\n' || *p == '\r')) + msg_buff[i++] = *p; + p++; + } + msg_buff[i] = '\0'; + + return msg_buff; +} + +#endif diff --git a/src/LYUtils.h b/src/LYUtils.h index 10cf755b..9d962a7c 100644 --- a/src/LYUtils.h +++ b/src/LYUtils.h @@ -128,6 +128,15 @@ extern void remove_backslashes PARAMS((char *buf)); extern void size_change PARAMS((int sig)); extern void statusline PARAMS((CONST char *text)); extern void toggle_novice_line NOPARAMS; +extern BOOL strn_dash_equ PARAMS((CONST char* p1,CONST char* p2,int len)); + + +#if defined(WIN_EX) /* 1997/10/16 (Thu) 20:13:28 */ +extern int put_clip(char *szBuffer); +extern int get_clip(char *szBuffer, int size); +extern char *HTDOS_short_name(char *path); +extern char *w32_strerror(DWORD ercode); +#endif #ifdef VMS extern void Define_VMSLogical PARAMS((char *LogicalName, char *LogicalValue)); @@ -220,4 +229,14 @@ extern HTList *sug_filenames; #define HIDE_CHMOD 0600 #define HIDE_UMASK 0077 +#if defined(DOSPATH) || defined(WIN_EX) || defined(__CYGWIN__) +#define TXT_R "rt" +#define TXT_W "wt" +#define TXT_A "at+" +#else +#define TXT_R "r" +#define TXT_W "w" +#define TXT_A "a+" +#endif + #endif /* LYUTILS_H */ diff --git a/src/LYexit.c b/src/LYexit.c index 92cfe6b0..75046338 100644 --- a/src/LYexit.c +++ b/src/LYexit.c @@ -92,6 +92,12 @@ PUBLIC void LYexit ARGS1( { #ifndef VMS /* On VMS, the VMSexit() handler does these. - FM */ #ifdef _WINDOWS + extern CRITICAL_SECTION critSec_DNS; /* 1998/09/03 (Thu) 22:01:56 */ + extern CRITICAL_SECTION critSec_READ; /* 1998/09/03 (Thu) 22:01:56 */ + + DeleteCriticalSection(&critSec_DNS); + DeleteCriticalSection(&critSec_READ); + WSACleanup(); #endif if (LYOutOfMemory == TRUE) { diff --git a/src/LYrcFile.c b/src/LYrcFile.c index efe6b22e..cc9d6221 100644 --- a/src/LYrcFile.c +++ b/src/LYrcFile.c @@ -49,7 +49,7 @@ PUBLIC void read_rc NOPARAMS /* * Open the RC file for reading. */ - if ((fp = fopen(rcfile, "r")) == NULL) { + if ((fp = fopen(rcfile, TXT_R)) == NULL) { return; } @@ -333,7 +333,7 @@ PUBLIC void read_rc NOPARAMS if (LYstrstr(cp, "LINKS_ARE_NUMBERED")) keypad_mode = LINKS_ARE_NUMBERED; else if (LYstrstr(cp, "LINKS_AND_FORM_FIELDS_ARE_NUMBERED")) - keypad_mode = LINKS_AND_FORM_FIELDS_ARE_NUMBERED; + keypad_mode = LINKS_AND_FIELDS_ARE_NUMBERED; else keypad_mode = NUMBERS_AS_ARROWS; diff --git a/src/UCdomap.c b/src/UCdomap.c index 6ba65391..b77bacfd 100644 --- a/src/UCdomap.c +++ b/src/UCdomap.c @@ -763,7 +763,7 @@ PRIVATE void con_set_default_unimap NOARGS p = dfont_unitable; for (i = 0; i < 256; i++) { for (j = dfont_unicount[i]; j; j--) { - con_insert_unipair(*(p++), i, 1); + con_insert_unipair(*(p++), (u16)i, 1); } } @@ -820,7 +820,7 @@ PRIVATE int UC_con_set_unimap ARGS2( for (i = 0; i < 256 && UCInfo[UC_charset_out_hndl].unicount != NULL; i++) { for (j = UCInfo[UC_charset_out_hndl].unicount[i]; j; j--) { - con_insert_unipair(*(p++), i, 0); + con_insert_unipair(*(p++), (u16)i, 0); } } diff --git a/src/Xsystem.c b/src/Xsystem.c new file mode 100644 index 00000000..e82cc5a4 --- /dev/null +++ b/src/Xsystem.c @@ -0,0 +1,598 @@ +/* $Id: Xsystem.c,v 1.1 1999/07/14 16:44:55 tom Exp $ + * like system("cmd") but return with exit code of "cmd" + * for Turbo-C/MS-C/LSI-C + * This code is in the public domain. + * + * $Log: Xsystem.c,v $ + * Revision 1.1 1999/07/14 16:44:55 tom + * Initial revision + * + * + * Revision 1.14 1997/10/17 (Fri) 16:28:24 senshu + * *** for Win32 version *** + * + * Revision 1.13 1992/02/24 06:59:13 serow + * *** empty log message *** + * + * Revision 1.12 1991/04/09 08:48:20 serow + * ignore new line at command line tail + * + * Revision 1.11 1991/03/12 07:12:50 serow + * CMDLINE + * + * Revision 1.10 91/02/24 05:10:14 serow + * 2>&1 + * + * Revision 1.9 91/02/22 07:01:17 serow + * NEAR for ms-c + * + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <io.h> +#include <process.h> +#ifndef __CYGWIN__ +#include <dos.h> +#endif + +#ifndef USECMDLINE +#define USECMDLINE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#define STR_MAX 512 /* MAX command line */ + +extern char *mktemp(char *); + +#define UCH(c) ((unsigned char)(c)) +#define isk1(c) ((0x81<=UCH(c)&&UCH(c)<=0x9F)||(0xE0<=UCH(c)&&UCH(c)<=0xFC)) +#define isq(c) ((c) == '"') +#define isspc(c) ((c) == ' ' || (c) == '\t') +#define issep(c) (isspc(c) || (c) == '"' || (c) == '\'' || (c) == '<' || (c) == '>' || (c) == 0) +#define issep2(c) (issep(c) || (c) == '.' || (c) == '\\' || (c) == '/') +#define isdeg(c) ('0' <= (c) && (c) <= '9') + +#if 0 /* MS-C */ +#define NEAR _near +#else +#define NEAR +#endif + +typedef struct _proc { + struct _proc *next; + char *line; + char *cmd; + char *arg; + char *inf; + int infmod; + char *outf; + int outfmod; + int ored[10]; + int sred[10]; +} PRO; + +static PRO *p1 = 0; + +static char *NEAR +xmalloc(size_t n) +{ + char *bp; + + if ((bp = calloc(1, n)) == (char *) 0) { + write(2, "xsystem: Out of memory.!\n", 25); + exit(1); + } + return bp; +} + +static char *NEAR +xrealloc(void *p, size_t n) +{ + char *bp; + + if ((bp = realloc(p, n)) == (char *) 0) { + write(2, "xsystem: Out of memory!.\n", 25); + exit(1); + } + return bp; +} + +static int NEAR +is_builtin_command(char *s) +{ + extern int system_is_NT; /* 1997/11/05 (Wed) 22:10:35 */ + + static char *cmdtab[]= + { + "dir", "type", "rem", "ren", "rename", "erase", "del", + "copy", "pause", "date", "time", "ver", "vol", "label", + "cd", "chdir", "md", "mkdir", "rd", "rmdir", "break", + "verify", "set", "prompt", "path", "exit", "ctty", "echo", + "if", "for", "cls", "goto", "shift" + ,"start" /* start is NT only */ + }; + int i, l, lc, count; + + l = strlen(s); + count = sizeof(cmdtab) / sizeof(cmdtab[0]); + if (!system_is_NT) + count--; + for (i = 0; i < count; i++) { + if (stricmp(s, cmdtab[i]) == 0) + return 1; + lc = strlen(cmdtab[i]); + if (lc < l && strnicmp(s, cmdtab[i], lc) == 0 && issep2(s[lc])) + return 1; + } + return 0; +} + +static int NEAR +getswchar(void) +{ +#ifdef __WIN32__ + return '/'; +#else + union REGS reg; + + reg.x.ax = 0x3700; + intdos(®, ®); + return reg.h.dl; +#endif +} + +static int NEAR +csystem(PRO * p, int flag) +{ + char *cmp; + char SW[3]; + int rc; + + if ((cmp = getenv("COMSPEC")) == 0) + return -2; + SW[0] = getswchar(); + SW[1] = 'c'; + SW[2] = 0; + rc = spawnl(flag, cmp, cmp, SW, p->cmd, p->arg, (char *) 0); + return rc < 0 ? -2 : rc; +} + +static PRO *NEAR +pars1c(char *s) +{ + PRO *pp; + char *fnp; + int ms, mi; + int fs, fi, inpf; + int q; + + pp = (PRO *) xmalloc(sizeof(PRO)); + for (q = 0; q < sizeof(pp->ored) / sizeof(pp->ored[0]); q++) + pp->ored[q] = q; + while (isspc(*s)) + s++; + pp->line = strdup(s); + pp->cmd = xmalloc(ms = 8); + mi = 0; + while (!issep(*s)) { + if (mi >= ms - 1) + pp->cmd = xrealloc(pp->cmd, ms += 8); + pp->cmd[mi++] = *s++; + } + pp->cmd[mi] = 0; + q = 0; + pp->arg = xmalloc(ms = 32); + if (isspc(*s)) + s++; + mi = 0; + while (*s) { + if (mi >= ms - 1) { + pp->arg = xrealloc(pp->arg, ms += 32); + } + if (q == 0) { + inpf = 0; + if ((mi == 0 || isspc(s[-1])) && + isdeg(s[0]) && s[1] == '>' && + s[2] == '&' && isdeg(s[3])) { + + pp->ored[s[0] & 15] = s[3] & 15; + s += 4; + continue; + } else if (s[0] == '<') { + if (pp->inf == 0) { + pp->infmod = O_RDONLY; + } + inpf = 1; + } else if (s[0] == '>' && s[1] == '>') { + if (pp->outf == 0) { + pp->outfmod = O_WRONLY | O_CREAT | O_APPEND; + } + s++; + } else if (s[0] == '>') { + if (pp->outf == 0) { + pp->outfmod = O_WRONLY | O_CREAT | O_TRUNC; + } + } else { + if (*s == '"') + q = !q; + pp->arg[mi++] = *s++; + continue; + } + fnp = xmalloc(fs = 16); + fi = 0; + s++; + while (isspc(*s)) + s++; + while (!issep(*s)) { + if (fi >= fs - 1) + fnp = xrealloc(fnp, fs += 16); + fnp[fi++] = *s++; + } + fnp[fi] = 0; + if (inpf) { + if (pp->inf == 0) + pp->inf = fnp; + } else { + if (pp->outf == 0) + pp->outf = fnp; + } + } else if (s[0] == '"') { + q = !q; + pp->arg[mi++] = *s++; + } else { + pp->arg[mi++] = *s++; + } + } + pp->arg[mi] = 0; + return pp; +} + +static PRO *NEAR +pars(char *s) +{ + char *lb; + int li, ls, q; + int c; + PRO *pp; + + lb = xmalloc(ls = STR_MAX); /* about */ + li = q = 0; + p1 = 0; + + for (;;) { + c = *s++; + if (li >= ls - 2) + lb = xrealloc(lb, ls += STR_MAX); + if (isk1(c) && *s) { + lb[li++] = c; + lb[li++] = *s++; + } else if ((!q && c == '|') || c == 0 || (c == '\n' && *s == 0)) { + lb[li++] = 0; + if (p1 == 0) { + pp = p1 = pars1c(lb); + } else { + pp->next = pars1c(lb); + pp = pp->next; + } + li = 0; + if (c == 0 || (c == '\n' && *s == 0)) + break; + } else if (c == '"') { + q = !q; + lb[li++] = c; + } else { + lb[li++] = c; + } + } + free(lb); + return p1; +} + +static int NEAR +try3(char *cnm, PRO * p, int flag) +{ + char cmdb[STR_MAX]; + int rc; + + strcat(strcpy(cmdb, cnm), ".com"); + if ((rc = open(cmdb, O_RDONLY)) >= 0) { + close(rc); + return spawnl(flag, cmdb, cmdb, p->arg, (char *) 0); + } + strcat(strcpy(cmdb, cnm), ".exe"); + if ((rc = open(cmdb, O_RDONLY)) >= 0) { + close(rc); + return spawnl(flag, cmdb, cmdb, p->arg, (char *) 0); + } + strcat(strcpy(cmdb, cnm), ".bat"); + if ((rc = open(cmdb, O_RDONLY)) >= 0) { + close(rc); + return csystem(p, flag); + } + return -1; +} + +static int NEAR +prog_go(PRO * p, int flag) +{ + char *s; + char *extp = 0; + char cmdb[STR_MAX]; + char *ep; + int rc, lc, cmd_len; + + cmd_len = strlen(p->cmd); + + s = p->cmd + cmd_len - 1; + while (cmd_len && (*s != '\\') && (*s != '/') && (*s != ':')) { + if (*s == '.') + extp = s; + cmd_len--; + s--; + } + + if (is_builtin_command(p->cmd) || (extp && stricmp(extp, ".bat") == 0)) + return csystem(p, flag); + + if (s < p->cmd) { /* cmd has no PATH nor Drive */ + ep = getenv("PATH"); + strcpy(cmdb, p->cmd); + for (;;) { + if (extp) { /* has extention */ + if ((rc = open(cmdb, O_RDONLY)) >= 0) { + close(rc); + rc = spawnl(flag, cmdb, cmdb, p->arg, (char *) 0); + } + } else { + rc = try3(cmdb, p, flag); + } + if (rc >= 0) + return rc; + + if (ep && *ep) { + int i; + for (i = 0; *ep != ';' && *ep != '\0'; ep++, i++) + lc = cmdb[i] = *ep; + if (*ep == ';') + ep++; + if (i > 0 && lc != ':' && lc != '\\' && lc != '/') + cmdb[i++] = '\\'; + cmdb[i] = 0; + strcat(cmdb, p->cmd); + } else { + if (rc == -2) + return rc; + return -1; + } + } + } else { /* has PATH or Drive */ + if (extp) { /* has extention */ + if ((rc = open(p->cmd, O_RDONLY)) >= 0) { + close(rc); + return spawnl(flag, p->cmd, p->cmd, p->arg, (char *) 0); + } + return -1; + } else { + return try3(p->cmd, p, flag); + } + } +} + +static char *NEAR +tmpf(char *tp) +{ + char tplate[STR_MAX]; + char *ev; + int i; + + if ((ev = getenv("TMP")) != 0) { + strcpy(tplate, ev); + i = strlen(ev); + if (i && ev[i - 1] != '\\' && ev[i - 1] != '/') + strcat(tplate, "\\"); + } else { + tplate[0] = 0; + } + strcat(tplate, tp); + return strdup(mktemp(tplate)); +} + +static int NEAR +redopen(char *fn, int md, int sfd) +{ + int rc; + int fd; + + if ((fd = open(fn, md, 0666)) != -1) { + if (md & O_APPEND) + lseek(fd, 0L, SEEK_END); + rc = dup(sfd); + if (fd != sfd) { + dup2(fd, sfd); + close(fd); + } + return rc; + } + return -1; +} + +static int NEAR +redclose(int fd, int sfd) +{ + if (fd != -1) { + dup2(fd, sfd); + close(fd); + } + return -1; +} + +static void NEAR +redswitch(PRO * p) +{ + int d; + + for (d = 0; d < sizeof(p->ored) / sizeof(p->ored[0]); d++) { + if (d != p->ored[d]) { + p->sred[d] = dup(d); + dup2(p->ored[d], d); + } + } +} + +static void NEAR +redunswitch(PRO * p) +{ + int d; + + for (d = 0; d < sizeof(p->ored) / sizeof(p->ored[0]); d++) { + if (d != p->ored[d]) { + dup2(p->sred[d], d); + close(p->sred[d]); + } + } +} + +int +xsystem(char *cmd) +{ + PRO *p, *pn; + char *pof, *pif, *pxf; + int psstdin, psstdout; + int rdstdin, rdstdout; + int rc = 0; + static char *cmdline = 0; +#if USECMDLINE + char *oldcmdline; +#endif + +#ifdef SH_EX /* 1997/11/01 (Sat) 10:04:03 add by JH7AYN */ + pif = cmd; + while (*pif++) { + if (*pif == '\r') { + *pif = '\0'; + break; + } else if (*pif == '\n') { + *pif = '\0'; + break; + } + } +#endif + + pof = pif = pxf = 0; + p = pars(cmd); + pof = tmpf("p1XXXXXX"); + pif = tmpf("p2XXXXXX"); + psstdin = psstdout = rdstdin = rdstdout = -1; + while (p) { +#if USECMDLINE + if (!getenv("NOCMDLINE")) { + oldcmdline = cmdline; + cmdline = xmalloc(strlen(p->cmd) + strlen(p->arg) + 10); + strcat(strcat(strcat(strcpy(cmdline, "CMDLINE="), p->cmd), " "), p->arg); + putenv(cmdline); + if (oldcmdline) + free(oldcmdline); + } +#endif + if (p->next) + psstdout = redopen(pof, O_WRONLY | O_CREAT | O_TRUNC, 1); + if (p->inf) + rdstdin = redopen(p->inf, p->infmod, 0); + if (p->outf) + rdstdout = redopen(p->outf, p->outfmod, 1); + redswitch(p); + rc = prog_go(p, P_WAIT); + redunswitch(p); + rdstdin = redclose(rdstdin, 0); + rdstdout = redclose(rdstdout, 1); + psstdout = redclose(psstdout, 1); + psstdin = redclose(psstdin, 0); + if ((p = p->next) != 0) { + pxf = pif; + pif = pof; + pof = pxf; + psstdin = redopen(pif, O_RDONLY, 0); + } + } + unlink(pif); + free(pif); + unlink(pof); + free(pof); + for (pn = p = p1; p; p = pn) { + pn = p->next; + if (p->line) + free(p->line); + if (p->cmd) + free(p->cmd); + if (p->arg) + free(p->arg); + if (p->inf) + free(p->inf); + if (p->outf) + free(p->outf); + free(p); + } + if (rc == -2) + return 127; + return rc < 0 ? 0xFF00 : rc; +} + +int exec_command(char * cmd, int wait_flag) +{ + PRO *p; + char *pif; + int rc = 0; + int cmd_str; + + pif = cmd; + while(*pif == ' ') + pif++; + + cmd = pif; + cmd_str = TRUE; + + while (*pif++) { + if (*pif == '\r') { + *pif = '\0'; + break; + } else if (*pif == '\n') { + *pif = '\0'; + break; + } else if (cmd_str) { + if (*pif == '/') + *pif = '\\'; + } else if (cmd_str) { + if (*pif == ' ') + cmd_str = FALSE; + } + } + p = pars(cmd); + + if (wait_flag) + rc = prog_go(p, P_WAIT); + else + rc = prog_go(p, P_NOWAIT); + + return rc; +} + + +#ifdef TEST +#include <stdio.h> + +void +main() +{ + char line_buff[STR_MAX]; + + while (gets(line_buff)) { + printf("\nreturn %04X\n", xsystem(line_buff)); + } +} +#endif /* TEST */ diff --git a/src/chrtrans/README.format b/src/chrtrans/README.format index df7d335e..7437b503 100644 --- a/src/chrtrans/README.format +++ b/src/chrtrans/README.format @@ -82,7 +82,7 @@ c) character translation definitions: * <range> idem * <range> <unicode range> * - * where <range> ::= <fontpos>-<fontpos> + * where <unicode range> ::= <unicode>-<unicode> * and <unicode> ::= U+<h><h><h><h> * and <h> ::= <hexadecimal digit> * diff --git a/src/chrtrans/UCkd.h b/src/chrtrans/UCkd.h index 104882d7..a6020696 100644 --- a/src/chrtrans/UCkd.h +++ b/src/chrtrans/UCkd.h @@ -1,8 +1,5 @@ #ifndef _UC_KD_H #define _UC_KD_H -#ifdef NOTDEFINED -#include <sys/types.h> /* Included via tcp.h. */ -#endif /* NOTDEFINED */ /* * NOTE: THE FOLLOWING #define MAY NEED ADJUSTMENT. diff --git a/src/chrtrans/jcuken_kb.h b/src/chrtrans/jcuken_kb.h index 8fbe458b..75c8da96 100644 --- a/src/chrtrans/jcuken_kb.h +++ b/src/chrtrans/jcuken_kb.h @@ -1,4 +1,4 @@ -static unsigned short kb_layout_jcuken[128] = { +static LYKeymap_t kb_layout_jcuken[128] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */ diff --git a/src/chrtrans/make-msc.bat b/src/chrtrans/make-msc.bat new file mode 100644 index 00000000..7e69d642 --- /dev/null +++ b/src/chrtrans/make-msc.bat @@ -0,0 +1,49 @@ +@echo If .tbl files are added or removed you will need to hand edit +@echo this batch file. +@echo . +@echo off +REM make -f makefile.w32 + +nmake -f makefile.msc + +makeuctb cp1250_uni.tbl > cp1250_uni.h +makeuctb cp1251_uni.tbl > cp1251_uni.h +makeuctb cp1252_uni.tbl > cp1252_uni.h +makeuctb cp1253_uni.tbl > cp1253_uni.h +makeuctb cp1255_uni.tbl > cp1255_uni.h +makeuctb cp1256_uni.tbl > cp1256_uni.h +makeuctb cp1257_uni.tbl > cp1257_uni.h +makeuctb cp437_uni.tbl > cp437_uni.h +makeuctb cp737_uni.tbl > cp737_uni.h +makeuctb cp775_uni.tbl > cp775_uni.h +makeuctb cp850_uni.tbl > cp850_uni.h +makeuctb cp852_uni.tbl > cp852_uni.h +makeuctb cp862_uni.tbl > cp862_uni.h +makeuctb cp864_uni.tbl > cp864_uni.h +makeuctb cp866_uni.tbl > cp866_uni.h +makeuctb cp866u_uni.tbl > cp866u_uni.h +makeuctb cp869_uni.tbl > cp869_uni.h +makeuctb def7_uni.tbl > def7_uni.h +makeuctb dmcs_uni.tbl > dmcs_uni.h +makeuctb hp_uni.tbl > hp_uni.h +makeuctb iso01_uni.tbl > iso01_uni.h +makeuctb iso02_uni.tbl > iso02_uni.h +makeuctb iso03_uni.tbl > iso03_uni.h +makeuctb iso04_uni.tbl > iso04_uni.h +makeuctb iso05_uni.tbl > iso05_uni.h +makeuctb iso06_uni.tbl > iso06_uni.h +makeuctb iso07_uni.tbl > iso07_uni.h +makeuctb iso08_uni.tbl > iso08_uni.h +makeuctb iso09_uni.tbl > iso09_uni.h +makeuctb iso10_uni.tbl > iso10_uni.h +makeuctb iso15_uni.tbl > iso15_uni.h +makeuctb koi8r_uni.tbl > koi8r_uni.h +makeuctb koi8u_uni.tbl > koi8u_uni.h +makeuctb mac_uni.tbl > mac_uni.h +makeuctb mnem_suni.tbl > mnem_suni.h +makeuctb mnem2_suni.tbl > mnem2_suni.h +makeuctb mnem_suni.tbl > mnem_suni.h +makeuctb next_uni.tbl > next_uni.h +makeuctb rfc_suni.tbl > rfc_suni.h +makeuctb utf8_uni.tbl > utf8_uni.h +makeuctb viscii_uni.tbl > viscii_uni.h diff --git a/src/chrtrans/makefile.dos b/src/chrtrans/makefile.dos index 3a830a4f..cc9884cf 100644 --- a/src/chrtrans/makefile.dos +++ b/src/chrtrans/makefile.dos @@ -15,8 +15,8 @@ CC = gcc MCFLAGS = -O3 -DDOSPATH -DNO_TTYTYP \ -I. \ -I../../WWW/Library/Implementation \ --I../../djgpp/tcplib/include \ --I../../djgpp/tcplib/include/tcp \ +-I../../djgpp/watt32/inc \ +-I../../djgpp/watt32/inc/sys \ -I../.. .SUFFIXES: .tbl diff --git a/src/chrtrans/makefile.in b/src/chrtrans/makefile.in index 2e2f2681..87a39825 100644 --- a/src/chrtrans/makefile.in +++ b/src/chrtrans/makefile.in @@ -94,7 +94,7 @@ default: $(FONTMAP_INC) tables: $(TABLES) makeuctb$x: makeuctb.o - $(CC) $(CC_OPTS) -o $@ makeuctb.o $(INTLLIB) $(LIBS) + $(CC) $(CC_OPTS) $(LDFLAGS) -o $@ makeuctb.o $(INTLLIB) $(LIBS) makeuctb.o: $(srcdir)/UCkd.h $(srcdir)/makeuctb.c diff --git a/src/chrtrans/makefile.msc b/src/chrtrans/makefile.msc new file mode 100644 index 00000000..6885a616 --- /dev/null +++ b/src/chrtrans/makefile.msc @@ -0,0 +1,23 @@ +# +# Makefile for Microsoft Visual C++ 4.2 or later +# + +CC = cl +LD = link + +INCLUDES = /I "." /I ".." /I "..\.." /I "..\..\WWW\Library\Implementation" /I "..\..\lib" +DEFS = /D "NDEBUG" /D "__WIN32__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "NO_FILEIO_H" /D "NO_UNISTD_H" /D "_WINDOWS" /D "DOSPATH" +CFLAGS = /nologo /MT /W3 /GX /O2 /c + +LDFLAGS = /nologo /subsystem:console /incremental:no /machine:I386 +LIBS = user32.lib wsock32.lib + +COMPILE = $(CC) $(CFLAGS) $(INCLUDES) $(DEFS) +LINK = $(LD) $(LDFLAGS) /out:$@ + +makeuctb.exe : makeuctb.obj + $(LINK) makeuctb.obj $(LIBS) + +makeuctb.obj : makeuctb.c + $(COMPILE) makeuctb.c + diff --git a/src/chrtrans/MAKEFILE.W32 b/src/chrtrans/makefile.w32 index 4968995f..4968995f 100644 --- a/src/chrtrans/MAKEFILE.W32 +++ b/src/chrtrans/makefile.w32 diff --git a/src/chrtrans/makeuctb.c b/src/chrtrans/makeuctb.c index 1207d3d1..7e6b18da 100644 --- a/src/chrtrans/makeuctb.c +++ b/src/chrtrans/makeuctb.c @@ -18,7 +18,6 @@ #define DONT_USE_SOCKS5 #include <HTUtils.h> -#include <tcp.h> /* * Don't try to use LYexit(). */ diff --git a/src/chrtrans/MAKEW32.BAT b/src/chrtrans/makew32.bat index 3ad8c16f..47b8ae69 100644 --- a/src/chrtrans/MAKEW32.BAT +++ b/src/chrtrans/makew32.bat @@ -1,44 +1,44 @@ -@echo If .tbl files are added or removed you will need to hand edit -@echo this batch file. -@echo . -make -f makefile.w32 -makeuctb cp1250_uni.tbl > cp1250_uni.h -makeuctb cp1251_uni.tbl > cp1251_uni.h -makeuctb cp1252_uni.tbl > cp1252_uni.h -makeuctb cp1253_uni.tbl > cp1253_uni.h -makeuctb cp1255_uni.tbl > cp1255_uni.h -makeuctb cp1256_uni.tbl > cp1256_uni.h -makeuctb cp1257_uni.tbl > cp1257_uni.h -makeuctb cp437_uni.tbl > cp437_uni.h -makeuctb cp737_uni.tbl > cp737_uni.h -makeuctb cp775_uni.tbl > cp775_uni.h -makeuctb cp850_uni.tbl > cp850_uni.h -makeuctb cp852_uni.tbl > cp852_uni.h -makeuctb cp862_uni.tbl > cp862_uni.h -makeuctb cp864_uni.tbl > cp864_uni.h -makeuctb cp866_uni.tbl > cp866_uni.h -makeuctb cp866u_uni.tbl > cp866u_uni.h -makeuctb cp869_uni.tbl > cp869_uni.h -makeuctb def7_uni.tbl > def7_uni.h -makeuctb dmcs_uni.tbl > dmcs_uni.h -makeuctb hp_uni.tbl > hp_uni.h -makeuctb iso01_uni.tbl > iso01_uni.h -makeuctb iso02_uni.tbl > iso02_uni.h -makeuctb iso03_uni.tbl > iso03_uni.h -makeuctb iso04_uni.tbl > iso04_uni.h -makeuctb iso05_uni.tbl > iso05_uni.h -makeuctb iso06_uni.tbl > iso06_uni.h -makeuctb iso07_uni.tbl > iso07_uni.h -makeuctb iso08_uni.tbl > iso08_uni.h -makeuctb iso09_uni.tbl > iso09_uni.h -makeuctb iso10_uni.tbl > iso10_uni.h -makeuctb iso15_uni.tbl > iso15_uni.h -makeuctb koi8r_uni.tbl > koi8r_uni.h -makeuctb koi8u_uni.tbl > koi8u_uni.h -makeuctb mac_uni.tbl > mac_uni.h -makeuctb mnem2_suni.tbl > mnem2_suni.h -makeuctb mnem_suni.tbl > mnem_suni.h -makeuctb next_uni.tbl > next_uni.h -makeuctb rfc_suni.tbl > rfc_suni.h -makeuctb utf8_uni.tbl > utf8_uni.h -makeuctb viscii_uni.tbl > viscii_uni.h +@echo If .tbl files are added or removed you will need to hand edit +@echo this batch file. +@echo . +make -f makefile.w32 +makeuctb cp1250_uni.tbl > cp1250_uni.h +makeuctb cp1251_uni.tbl > cp1251_uni.h +makeuctb cp1252_uni.tbl > cp1252_uni.h +makeuctb cp1253_uni.tbl > cp1253_uni.h +makeuctb cp1255_uni.tbl > cp1255_uni.h +makeuctb cp1256_uni.tbl > cp1256_uni.h +makeuctb cp1257_uni.tbl > cp1257_uni.h +makeuctb cp437_uni.tbl > cp437_uni.h +makeuctb cp737_uni.tbl > cp737_uni.h +makeuctb cp775_uni.tbl > cp775_uni.h +makeuctb cp850_uni.tbl > cp850_uni.h +makeuctb cp852_uni.tbl > cp852_uni.h +makeuctb cp862_uni.tbl > cp862_uni.h +makeuctb cp864_uni.tbl > cp864_uni.h +makeuctb cp866_uni.tbl > cp866_uni.h +makeuctb cp866u_uni.tbl > cp866u_uni.h +makeuctb cp869_uni.tbl > cp869_uni.h +makeuctb def7_uni.tbl > def7_uni.h +makeuctb dmcs_uni.tbl > dmcs_uni.h +makeuctb hp_uni.tbl > hp_uni.h +makeuctb iso01_uni.tbl > iso01_uni.h +makeuctb iso02_uni.tbl > iso02_uni.h +makeuctb iso03_uni.tbl > iso03_uni.h +makeuctb iso04_uni.tbl > iso04_uni.h +makeuctb iso05_uni.tbl > iso05_uni.h +makeuctb iso06_uni.tbl > iso06_uni.h +makeuctb iso07_uni.tbl > iso07_uni.h +makeuctb iso08_uni.tbl > iso08_uni.h +makeuctb iso09_uni.tbl > iso09_uni.h +makeuctb iso10_uni.tbl > iso10_uni.h +makeuctb iso15_uni.tbl > iso15_uni.h +makeuctb koi8r_uni.tbl > koi8r_uni.h +makeuctb koi8u_uni.tbl > koi8u_uni.h +makeuctb mac_uni.tbl > mac_uni.h +makeuctb mnem2_suni.tbl > mnem2_suni.h +makeuctb mnem_suni.tbl > mnem_suni.h +makeuctb next_uni.tbl > next_uni.h +makeuctb rfc_suni.tbl > rfc_suni.h +makeuctb utf8_uni.tbl > utf8_uni.h +makeuctb viscii_uni.tbl > viscii_uni.h diff --git a/src/chrtrans/rot13_kb.h b/src/chrtrans/rot13_kb.h index 8bc1a9dc..41a6a870 100644 --- a/src/chrtrans/rot13_kb.h +++ b/src/chrtrans/rot13_kb.h @@ -1,4 +1,4 @@ -static unsigned short kb_layout_rot13[128] = { +static LYKeymap_t kb_layout_rot13[128] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */ diff --git a/src/chrtrans/yawerty_kb.h b/src/chrtrans/yawerty_kb.h index 2592b822..8698d965 100644 --- a/src/chrtrans/yawerty_kb.h +++ b/src/chrtrans/yawerty_kb.h @@ -1,4 +1,4 @@ -static unsigned short kb_layout_yawerty[128] = { +static LYKeymap_t kb_layout_yawerty[128] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */ diff --git a/src/makefile.dos b/src/makefile.dos index 1a69fc84..a10c0b2d 100644 --- a/src/makefile.dos +++ b/src/makefile.dos @@ -1,62 +1,62 @@ -OBJS= UCdomap.o UCAux.o UCAuto.o \ -LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \ -LYMail.o HTAlert.o GridText.o LYGetFile.o \ -LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \ -LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \ -LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \ -HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \ -LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \ -LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \ -LYStyle.o LYHash.o LYPrettySrc.o - -CFLAGS= $(MCFLAGS) -I. -I.. $(SLANGINC) - -CC = gcc -MCFLAGS = -O2 -DHAVE_GETBKGD -DDISP_PARTIAL -DUSE_ZLIB \ - -DSOURCE_CACHE -DUSE_PSRC \ - -DUSE_EXTERNALS -DCOLOR_CURSES -DNCURSES -DFANCY_CURSES \ - -DACCESS_AUTH -DNO_CUSERID -DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP \ - -Ichrtrans -I../WWW/library/implementation \ - -I../curses -I../djgpp/tcplib/include -I../djgpp/tcplib/include/tcp -WWWLIB = ../WWW/library/djgpp/libwww.a ../curses/pdcurses.a ../djgpp/tcplib/obj/libtcp.a -LIBS=-lz - -all: lynx - -lynx: message $(OBJS) $(WWWLIB) - @echo "Linking and creating Lynx executable" - $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS) - @echo "Welcome to Lynx!" - -message: - @echo "Compiling Lynx sources" - -dbg: $(OBJS) $(WWWLIB) - @echo "Making Lynx code" - $(CC) -g $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS) - -lint: - lint *.c > ../lint.out - -clean: - rm -f lynx.exe core *.[ob] - -DefaultStyle.o: ../userdefs.h -HTFWriter.o: ../userdefs.h -LYBookmark.o: ../userdefs.h -LYCharSets.o: ../userdefs.h -LYCharUtils.o: ../userdefs.h -LYCookie.o: ../userdefs.h -LYDownload.o: ../userdefs.h -LYEditmap.o: ../userdefs.h -LYExtern.o: ../userdefs.h -LYGetFile.o: ../userdefs.h -LYHistory.o: ../userdefs.h -LYKeymap.o: ../userdefs.h -LYMain.o: ../userdefs.h -LYMainLoop.o: ../userdefs.h -LYOptions.o: ../userdefs.h -LYReadCFG.o: ../userdefs.h -LYShowInfo.o: ../userdefs.h -LYStrings.o: ../userdefs.h -LYTraversal.o: ../userdefs.h +OBJS= UCdomap.o UCAux.o UCAuto.o \ +LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \ +LYMail.o HTAlert.o GridText.o LYGetFile.o \ +LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \ +LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \ +LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \ +HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \ +LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \ +LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \ +LYStyle.o LYHash.o LYPrettySrc.o + +CFLAGS= $(MCFLAGS) -I. -I.. $(SLANGINC) + +CC = gcc +MCFLAGS = -O2 -DHAVE_GETBKGD -DDISP_PARTIAL -DUSE_ZLIB \ + -DSOURCE_CACHE -DUSE_PSRC \ + -DUSE_EXTERNALS -DCOLOR_CURSES -DNCURSES -DFANCY_CURSES \ + -DACCESS_AUTH -DNO_CUSERID -DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP \ + -Ichrtrans -I../WWW/library/implementation \ + -I../curses -I../djgpp/tcplib/include -I../djgpp/tcplib/include/tcp +WWWLIB = ../WWW/library/djgpp/libwww.a ../curses/pdcurses.a ../djgpp/tcplib/obj/libtcp.a +LIBS=-lz + +all: lynx + +lynx: message $(OBJS) $(WWWLIB) + @echo "Linking and creating Lynx executable" + $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS) + @echo "Welcome to Lynx!" + +message: + @echo "Compiling Lynx sources" + +dbg: $(OBJS) $(WWWLIB) + @echo "Making Lynx code" + $(CC) -g $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS) + +lint: + lint *.c > ../lint.out + +clean: + rm -f lynx.exe core *.[ob] + +DefaultStyle.o: ../userdefs.h +HTFWriter.o: ../userdefs.h +LYBookmark.o: ../userdefs.h +LYCharSets.o: ../userdefs.h +LYCharUtils.o: ../userdefs.h +LYCookie.o: ../userdefs.h +LYDownload.o: ../userdefs.h +LYEditmap.o: ../userdefs.h +LYExtern.o: ../userdefs.h +LYGetFile.o: ../userdefs.h +LYHistory.o: ../userdefs.h +LYKeymap.o: ../userdefs.h +LYMain.o: ../userdefs.h +LYMainLoop.o: ../userdefs.h +LYOptions.o: ../userdefs.h +LYReadCFG.o: ../userdefs.h +LYShowInfo.o: ../userdefs.h +LYStrings.o: ../userdefs.h +LYTraversal.o: ../userdefs.h diff --git a/src/makefile.dsl b/src/makefile.dsl index 326fa90c..9eb56338 100644 --- a/src/makefile.dsl +++ b/src/makefile.dsl @@ -1,69 +1,70 @@ -OBJS= UCdomap.o UCAux.o UCAuto.o \ -LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \ -LYMail.o HTAlert.o GridText.o LYGetFile.o \ -LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \ -LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \ -LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \ -HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \ -LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \ -LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \ -LYStyle.o LYHash.o LYPrettySrc.o - -CFLAGS= $(MCFLAGS) $(INTLFLAGS) -I. -I.. $(SLANGINC) - -# comment this line to suppress DIRED support -DIRED_DEFS = -DDIRED_SUPPORT -DOK_UUDECODE -DOK_TAR -DOK_GZIP -DOK_ZIP - -CC = gcc -MCFLAGS = -O2 -DDISP_PARTIAL -DUSE_ZLIB -DUSE_EXTERNALS \ -$(DIRED_DEFS) \ --DSOURCE_CACHE -DUSE_PSRC \ --DUSE_SLANG -DDJGPP_KEYHANDLER -DACCESS_AUTH -DNO_CUSERID \ --DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP -I../WWW/Library/Implementation \ --I../djgpp/tcplib/include -I./chrtrans -I../djgpp/tcplib/include/tcp -WWWLIB = ../WWW/Library/djgpp/libwww.a ../djgpp/tcplib/obj/libtcp.a -LIBS= -lslang -lz # -lintl -CHRTR= ./chrtrans/ -#INTLFLAGS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H - -all: lynx.exe - -lynx.exe: message $(OBJS) $(WWWLIB) - @echo "Linking and creating Lynx executable" - $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS) - @echo "Welcome to Lynx!" - -message: - @echo "Compiling Lynx sources" - -dbg: $(OBJS) $(WWWLIB) - @echo "Making Lynx code" - $(CC) $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS) - -lint: - lint *.c > ../lint.out - -clean: - rm -f lynx.exe core *.[ob] - -DefaultStyle.o: ../userdefs.h -HTFWriter.o: ../userdefs.h -LYBookmark.o: ../userdefs.h -LYCharSets.o: ../userdefs.h -LYCharUtils.o: ../userdefs.h -LYCookie.o: ../userdefs.h -LYDownload.o: ../userdefs.h -LYEditmap.o: ../userdefs.h -LYExtern.o: ../userdefs.h -LYGetFile.o: ../userdefs.h -LYHistory.o: ../userdefs.h -LYKeymap.o: ../userdefs.h -LYMain.o: ../userdefs.h -LYMainLoop.o: ../userdefs.h -LYOptions.o: ../userdefs.h -LYReadCFG.o: ../userdefs.h -LYReadCFG.o: ../userdefs.h -LYShowInfo.o: ../userdefs.h -LYStrings.o: ../userdefs.h -LYTraversal.o: ../userdefs.h -LYUtils.o: ../userdefs.h +OBJS= UCdomap.o UCAux.o UCAuto.o \ +LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \ +LYMail.o HTAlert.o GridText.o LYGetFile.o \ +LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \ +LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \ +LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \ +HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \ +LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \ +LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \ +LYStyle.o LYHash.o LYPrettySrc.o + +CFLAGS= $(MCFLAGS) $(INTLFLAGS) -I. -I.. $(SLANGINC) + +# comment this line to suppress DIRED support +DIRED_DEFS = -DDIRED_SUPPORT -DOK_UUDECODE -DOK_TAR -DOK_GZIP -DOK_ZIP + +CC = gcc +MCFLAGS = -O2 -DDISP_PARTIAL -DUSE_ZLIB -DUSE_EXTERNALS \ +-DWATT32 \ +$(DIRED_DEFS) \ +-DSOURCE_CACHE -DUSE_PSRC \ +-DUSE_SLANG -DDJGPP_KEYHANDLER -DACCESS_AUTH -DNO_CUSERID \ +-DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP -I../WWW/Library/Implementation \ +-I../djgpp/watt32/inc -I./chrtrans -I../djgpp/watt32/inc/sys +WWWLIB = ../WWW/Library/djgpp/libwww.a ../djgpp/watt32/lib/libwatt.a +LIBS= -lslang -lz # -lintl +CHRTR= ./chrtrans/ +#INTLFLAGS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H + +all: lynx.exe + +lynx.exe: message $(OBJS) $(WWWLIB) + @echo "Linking and creating Lynx executable" + $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS) + @echo "Welcome to Lynx!" + +message: + @echo "Compiling Lynx sources" + +dbg: $(OBJS) $(WWWLIB) + @echo "Making Lynx code" + $(CC) $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS) + +lint: + lint *.c > ../lint.out + +clean: + rm -f lynx.exe core *.[ob] + +DefaultStyle.o: ../userdefs.h +HTFWriter.o: ../userdefs.h +LYBookmark.o: ../userdefs.h +LYCharSets.o: ../userdefs.h +LYCharUtils.o: ../userdefs.h +LYCookie.o: ../userdefs.h +LYDownload.o: ../userdefs.h +LYEditmap.o: ../userdefs.h +LYExtern.o: ../userdefs.h +LYGetFile.o: ../userdefs.h +LYHistory.o: ../userdefs.h +LYKeymap.o: ../userdefs.h +LYMain.o: ../userdefs.h +LYMainLoop.o: ../userdefs.h +LYOptions.o: ../userdefs.h +LYReadCFG.o: ../userdefs.h +LYReadCFG.o: ../userdefs.h +LYShowInfo.o: ../userdefs.h +LYStrings.o: ../userdefs.h +LYTraversal.o: ../userdefs.h +LYUtils.o: ../userdefs.h diff --git a/src/makefile.wsl b/src/makefile.wsl index a54731d2..a97b51bf 100644 --- a/src/makefile.wsl +++ b/src/makefile.wsl @@ -1,64 +1,64 @@ -OBJS= UCdomap.o UCAux.o UCAuto.o \ -LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \ -LYMail.o HTAlert.o GridText.o LYGetFile.o \ -LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \ -LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \ -LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \ -HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \ -LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \ -LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \ -LYStyle.o LYHash.o LYPrettySrc.o - -CFLAGS= $(MCFLAGS) -I. -I.. $(SLANGINC) - -CC = gcc -MCFLAGS = -O2 -DDISP_PARTIAL -DUSE_ZLIB -DUSE_EXTERNALS \ --DSOURCE_CACHE -DUSE_PSRC \ --DUSE_SLANG -DACCESS_AUTH -DNO_CUSERID \ --DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP -I../WWW/library/implement -I../djgpp/tcplib/include \ --I./chrtrans -I../djgpp/tcplib/include/tcp -WWWLIB = ../WWW/library/djgpp/libwww.a ../djgpp/tcplib/obj/libtcp.a -LIBS= -lslang -lz -CHRTR= ./chrtrans/ - -all: lynx.exe - -lynx.exe: message $(OBJS) $(WWWLIB) - @echo "Linking and creating Lynx executable" - $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS) - @echo "Welcome to Lynx!" - -message: - @echo "Compiling Lynx sources" - -dbg: $(OBJS) $(WWWLIB) - @echo "Making Lynx code" - $(CC) $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS) - -lint: - lint *.c > ../lint.out - -clean: - rm -f lynx.exe core *.[ob] - -DefaultStyle.o: ../userdefs.h -HTFWriter.o: ../userdefs.h -LYBookmark.o: ../userdefs.h -LYCharSets.o: ../userdefs.h -LYCharUtils.o: ../userdefs.h -LYCookie.o: ../userdefs.h -LYDownload.o: ../userdefs.h -LYEditmap.o: ../userdefs.h -LYExtern.o: ../userdefs.h -LYGetFile.o: ../userdefs.h -LYHistory.o: ../userdefs.h -LYKeymap.o: ../userdefs.h -LYMain.o: ../userdefs.h -LYMainLoop.o: ../userdefs.h -LYOptions.o: ../userdefs.h -LYReadCFG.o: ../userdefs.h -LYReadCFG.o: ../userdefs.h -LYShowInfo.o: ../userdefs.h -LYStrings.o: ../userdefs.h -LYTraversal.o: ../userdefs.h -LYUtils.o: ../userdefs.h +OBJS= UCdomap.o UCAux.o UCAuto.o \ +LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \ +LYMail.o HTAlert.o GridText.o LYGetFile.o \ +LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \ +LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \ +LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \ +HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \ +LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \ +LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \ +LYStyle.o LYHash.o LYPrettySrc.o + +CFLAGS= $(MCFLAGS) -I. -I.. $(SLANGINC) + +CC = gcc +MCFLAGS = -O2 -DDISP_PARTIAL -DUSE_ZLIB -DUSE_EXTERNALS \ +-DSOURCE_CACHE -DUSE_PSRC \ +-DUSE_SLANG -DACCESS_AUTH -DNO_CUSERID \ +-DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP -I../WWW/library/implement -I../djgpp/tcplib/include \ +-I./chrtrans -I../djgpp/tcplib/include/tcp +WWWLIB = ../WWW/library/djgpp/libwww.a ../djgpp/tcplib/obj/libtcp.a +LIBS= -lslang -lz +CHRTR= ./chrtrans/ + +all: lynx.exe + +lynx.exe: message $(OBJS) $(WWWLIB) + @echo "Linking and creating Lynx executable" + $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS) + @echo "Welcome to Lynx!" + +message: + @echo "Compiling Lynx sources" + +dbg: $(OBJS) $(WWWLIB) + @echo "Making Lynx code" + $(CC) $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS) + +lint: + lint *.c > ../lint.out + +clean: + rm -f lynx.exe core *.[ob] + +DefaultStyle.o: ../userdefs.h +HTFWriter.o: ../userdefs.h +LYBookmark.o: ../userdefs.h +LYCharSets.o: ../userdefs.h +LYCharUtils.o: ../userdefs.h +LYCookie.o: ../userdefs.h +LYDownload.o: ../userdefs.h +LYEditmap.o: ../userdefs.h +LYExtern.o: ../userdefs.h +LYGetFile.o: ../userdefs.h +LYHistory.o: ../userdefs.h +LYKeymap.o: ../userdefs.h +LYMain.o: ../userdefs.h +LYMainLoop.o: ../userdefs.h +LYOptions.o: ../userdefs.h +LYReadCFG.o: ../userdefs.h +LYReadCFG.o: ../userdefs.h +LYShowInfo.o: ../userdefs.h +LYStrings.o: ../userdefs.h +LYTraversal.o: ../userdefs.h +LYUtils.o: ../userdefs.h |