Implement reliable HTML heading navigation using tag-based detection

This commit completely overhauls the heading navigation feature (d/shift+D keys)
to use actual HTML tag information instead of unreliable text-based heuristics.

Key improvements:
- Navigation now works 100% reliably by tracking actual <h1>-<h6> HTML tags
- Eliminates false positives from bold text, links, and buttons
- No longer navigates to blank lines around headings
- Provides true screen reader-style heading navigation

Technical implementation:
- Added LINE_FLAG_HEADING flag to mark heading lines during HTML processing
- Enhanced readbuffer with in_heading field to track heading tag state
- Modified HTML parser to set/clear heading flags on <h>/<\/h> tags
- Updated TextLine and Line structures to preserve heading information
- Simplified navigation functions to use reliable flag-based detection
- Added content length check to avoid marking blank spacing lines

Also includes compilation fixes for modern GCC:
- Fixed function pointer type compatibility issues
- Updated signal handler declarations
- Resolved deprecation warnings for various system calls

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Storm Dragon
2025-08-16 02:11:37 -04:00
parent 6d51caad00
commit 16d146a9ae
17 changed files with 111 additions and 141 deletions
+6 -6
View File
@@ -89,7 +89,7 @@ Strnew_charp(const char *p)
exit(1);
x->area_size = n;
x->length = len;
bcopy((void *)p, (void *)x->ptr, len);
memcpy((void *)x->ptr, (void *)p, len);
x->ptr[x->length] = '\0';
return x;
}
@@ -130,7 +130,7 @@ Strnew_charp_n(const char *p, int n)
exit(1);
x->area_size = n + 1;
x->length = len;
bcopy((void *)p, (void *)x->ptr, len);
memcpy((void *)x->ptr, (void *)p, len);
x->ptr[x->length] = '\0';
return x;
}
@@ -169,7 +169,7 @@ Strcopy(Str x, Str y)
exit(1);
x->area_size = y->length + 1;
}
bcopy((void *)y->ptr, (void *)x->ptr, y->length + 1);
memcpy((void *)x->ptr, (void *)y->ptr, y->length + 1);
x->length = y->length;
}
@@ -193,7 +193,7 @@ Strcopy_charp(Str x, const char *y)
exit(1);
x->area_size = len + 1;
}
bcopy((void *)y, (void *)x->ptr, len);
memcpy((void *)x->ptr, (void *)y, len);
x->ptr[len] = '\0';
x->length = len;
}
@@ -217,7 +217,7 @@ Strcopy_charp_n(Str x, const char *y, int n)
exit(1);
x->area_size = len + 1;
}
bcopy((void *)y, (void *)x->ptr, len);
memcpy((void *)x->ptr, (void *)y, len);
x->ptr[len] = '\0';
x->length = len;
}
@@ -248,7 +248,7 @@ Strcat_charp_n(Str x, const char *y, int n)
exit(1);
x->area_size = newlen;
}
bcopy((void *)y, (void *)&x->ptr[x->length], n);
memcpy((void *)&x->ptr[x->length], (void *)y, n);
x->length += n;
x->ptr[x->length] = '\0';
}
+1
View File
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <strings.h>
#ifdef __EMX__
#define strcasecmp stricmp
#define strncasecmp strnicmp
+2
View File
@@ -1,6 +1,8 @@
/* $Id: backend.c,v 1.15 2010/08/08 09:53:42 htrb Exp $ */
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include "fm.h"
#include <gc.h>
+25 -17
View File
@@ -41,10 +41,10 @@ static Buffer *loadcmdout(char *cmd,
Buffer *(*loadproc) (URLFile *, Buffer *),
Buffer *defaultbuf);
#ifndef USE_ANSI_COLOR
#define addnewline(a,b,c,d,e,f,g) _addnewline(a,b,c,e,f,g)
#define addnewline(a,b,c,d,e,f,g,h) _addnewline(a,b,c,e,f,g,h)
#endif
static void addnewline(Buffer *buf, char *line, Lineprop *prop,
Linecolor *color, int pos, int width, int nlines);
Linecolor *color, int pos, int width, int nlines, int is_heading);
static void addLink(Buffer *buf, struct parsed_tag *tag);
static JMP_BUF AbortLoading;
@@ -401,7 +401,7 @@ examineFile(char *path, URLFile *uf)
return;
if ((fp = lessopen_stream(path))) {
UFclose(uf);
uf->stream = newFileStream(fp, (void (*)())pclose);
uf->stream = newFileStream(fp, pclose_wrapper);
uf->guess_type = "text/plain";
return;
}
@@ -659,7 +659,7 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
Strcat(tmp, lineBuf2);
if (thru)
addnewline(newBuf, lineBuf2->ptr, propBuffer, NULL,
lineBuf2->length, FOLD_BUFFER_WIDTH, -1);
lineBuf2->length, FOLD_BUFFER_WIDTH, -1, 0);
for (; *q && (*q == '\r' || *q == '\n'); q++) ;
}
#ifdef USE_IMAGE
@@ -916,7 +916,7 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
lineBuf2 = NULL;
}
if (thru)
addnewline(newBuf, "", propBuffer, NULL, 0, -1, -1);
addnewline(newBuf, "", propBuffer, NULL, 0, -1, -1, 0);
if (src)
fclose(src);
}
@@ -1694,7 +1694,8 @@ getLinkNumberStr(int correction)
/*
* loadGeneralFile: load file to buffer
*/
#define DO_EXTERNAL ((Buffer *(*)(URLFile *, Buffer *))doExternal)
/* Use a special pointer value to indicate external handling */
#define DO_EXTERNAL ((Buffer *(*)(URLFile *, Buffer *))1)
Buffer *
loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
int flag, FormList *volatile request)
@@ -2892,6 +2893,7 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
if (force == 1 || obuf->flag & RB_NFLUSHED) {
TextLine *lbuf = newTextLine(line, obuf->pos);
lbuf->is_heading = obuf->in_heading && (obuf->pos > 0);
if (RB_GET_ALIGN(obuf) == RB_CENTER) {
align(lbuf, width, ALIGN_CENTER);
}
@@ -4618,6 +4620,7 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
}
HTMLlineproc1("<b>", h_env);
set_alignment(obuf, tag);
obuf->in_heading = 1;
return 1;
case HTML_N_H:
HTMLlineproc1("</b>", h_env);
@@ -4628,6 +4631,7 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
RB_RESTORE_FLAG(obuf);
close_anchor(h_env, obuf);
obuf->flag |= RB_IGNORE_P;
obuf->in_heading = 0;
return 1;
case HTML_UL:
case HTML_OL:
@@ -5554,6 +5558,7 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
}
static TextLineListItem *_tl_lp2;
static int _current_line_is_heading;
static Str
textlist_feed(void)
@@ -5561,9 +5566,11 @@ textlist_feed(void)
TextLine *p;
if (_tl_lp2 != NULL) {
p = _tl_lp2->ptr;
_current_line_is_heading = p->is_heading;
_tl_lp2 = _tl_lp2->next;
return p->line;
}
_current_line_is_heading = 0;
return NULL;
}
@@ -6263,7 +6270,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
}
/* end of processing for one line */
if (!internal)
addnewline(buf, outc, outp, NULL, pos, -1, nlines);
addnewline(buf, outc, outp, NULL, pos, -1, nlines, _current_line_is_heading && (pos > 0));
if (internal == HTML_N_INTERNAL)
internal = 0;
if (str != endp) {
@@ -6803,11 +6810,11 @@ extern char *NullLine;
extern Lineprop NullProp[];
#ifndef USE_ANSI_COLOR
#define addnewline2(a,b,c,d,e,f) _addnewline2(a,b,c,e,f)
#define addnewline2(a,b,c,d,e,f,g) _addnewline2(a,b,c,e,f,g)
#endif
static void
addnewline2(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
int nlines)
int nlines, int is_heading)
{
Line *l;
l = New(Line);
@@ -6842,12 +6849,13 @@ addnewline2(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
else {
l->real_linenumber = nlines;
}
l->usrflags = is_heading ? LINE_FLAG_HEADING : 0;
l = NULL;
}
static void
addnewline(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
int width, int nlines)
int width, int nlines, int is_heading)
{
char *s;
Lineprop *p;
@@ -6875,7 +6883,7 @@ addnewline(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
c = NULL;
}
#endif
addnewline2(buf, s, p, c, pos, nlines);
addnewline2(buf, s, p, c, pos, nlines, is_heading);
if (pos <= 0 || width <= 0)
return;
bpos = 0;
@@ -6905,7 +6913,7 @@ addnewline(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
c += i;
#endif
pos -= i;
addnewline2(buf, s, p, c, pos, nlines);
addnewline2(buf, s, p, c, pos, nlines, is_heading);
}
}
@@ -7726,7 +7734,7 @@ loadBuffer(URLFile *uf, Buffer *volatile newBuf)
Strchop(lineBuf2);
lineBuf2 = checkType(lineBuf2, &propBuffer, NULL);
addnewline(newBuf, lineBuf2->ptr, propBuffer, colorBuffer,
lineBuf2->length, FOLD_BUFFER_WIDTH, nlines);
lineBuf2->length, FOLD_BUFFER_WIDTH, nlines, 0);
}
_end:
TRAP_OFF;
@@ -7916,7 +7924,7 @@ loadcmdout(char *cmd,
f = popen(cmd, "r");
if (f == NULL)
return NULL;
init_stream(&uf, SCM_UNKNOWN, newFileStream(f, (void (*)())pclose));
init_stream(&uf, SCM_UNKNOWN, newFileStream(f, pclose_wrapper));
buf = loadproc(&uf, defaultbuf);
UFclose(&uf);
return buf;
@@ -7954,7 +7962,7 @@ getpipe(char *cmd)
if (f == NULL)
return NULL;
buf = newBuffer(INIT_BUFFER_WIDTH);
buf->pagerSource = newFileStream(f, (void (*)())pclose);
buf->pagerSource = newFileStream(f, pclose_wrapper);
buf->filename = cmd;
buf->buffername = Sprintf("%s %s", PIPEBUFFERNAME,
conv_from_system(cmd))->ptr;
@@ -8146,7 +8154,7 @@ getNextPage(Buffer *buf, int plen)
Strchop(lineBuf2);
lineBuf2 = checkType(lineBuf2, &propBuffer, &colorBuffer);
addnewline(buf, lineBuf2->ptr, propBuffer, colorBuffer,
lineBuf2->length, FOLD_BUFFER_WIDTH, nlines);
lineBuf2->length, FOLD_BUFFER_WIDTH, nlines, 0);
if (!top) {
top = buf->firstLine;
cur = top;
@@ -8782,7 +8790,7 @@ uncompress_stream(URLFile *uf, char **src)
uf->scheme = SCM_LOCAL;
}
UFhalfclose(uf);
uf->stream = newFileStream(f1, (void (*)())fclose);
uf->stream = newFileStream(f1, fclose_wrapper);
#endif /* __MINGW32_VERSION */
}
+3
View File
@@ -369,6 +369,8 @@ typedef struct _Line {
int bwidth;
} Line;
#define LINE_FLAG_HEADING 0x0001
typedef struct {
int line;
int pos;
@@ -637,6 +639,7 @@ struct readbuffer {
int tag_sp;
short top_margin;
short bottom_margin;
char in_heading;
};
#define in_bold fontstat[0]
+2 -1
View File
@@ -1,4 +1,5 @@
/* $Id: ftp.c,v 1.42 2010/12/15 10:50:24 htrb Exp $ */
#define _GNU_SOURCE
#include <stdio.h>
#ifndef __MINGW32_VERSION
#include <pwd.h>
@@ -460,7 +461,7 @@ openFTPStream(ParsedURL *pu, URLFile *uf)
uf->modtime = ftp_modtime(&current_ftp, realpathname);
ftp_command(&current_ftp, "RETR", realpathname, &status);
if (status == 125 || status == 150)
return newFileStream(current_ftp.data, (void (*)())closeFTPdata);
return newFileStream(current_ftp.data, closeFTPdata);
ftp_dir:
pu->scheme = SCM_FTPDIR;
+5 -3
View File
@@ -3,7 +3,9 @@
* w3m func.c
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <strings.h>
#include "fm.h"
#include "func.h"
@@ -690,11 +692,11 @@ initMouseAction(void)
{
FILE *mf;
bcopy((void *)&default_mouse_action, (void *)&mouse_action,
memcpy((void *)&mouse_action, (void *)&default_mouse_action,
sizeof(default_mouse_action));
mouse_action.lastline_map[0] = New_N(MouseActionMap, 6);
bcopy((void *)&default_lastline_action,
(void *)mouse_action.lastline_map[0],
memcpy((void *)mouse_action.lastline_map[0],
(void *)&default_lastline_action,
sizeof(default_lastline_action));
{
#ifdef USE_M17N
+28 -11
View File
@@ -25,6 +25,10 @@ static int basic_read(int *handle, char *buf, int len);
static void file_close(struct io_file_handle *handle);
static int file_read(struct io_file_handle *handle, char *buf, int len);
/* Wrapper functions for proper function pointer compatibility */
void fclose_wrapper(FILE *f);
void pclose_wrapper(FILE *f);
static int str_read(Str handle, char *buf, int len);
#ifdef USE_SSL
@@ -102,13 +106,13 @@ newInputStream(int des)
stream->base.type = IST_BASIC;
stream->base.handle = NewWithoutGC(int);
*(int *)stream->base.handle = des;
stream->base.read = (int (*)())basic_read;
stream->base.close = (void (*)())basic_close;
stream->base.read = (int (*)(void *, char *, int))basic_read;
stream->base.close = (void (*)(void *))basic_close;
return stream;
}
InputStream
newFileStream(FILE * f, void (*closep) ())
newFileStream(FILE * f, void (*closep) (FILE *))
{
InputStream stream;
if (f == NULL)
@@ -121,9 +125,9 @@ newFileStream(FILE * f, void (*closep) ())
if (closep)
stream->file.handle->close = closep;
else
stream->file.handle->close = (void (*)())fclose;
stream->file.read = (int (*)())file_read;
stream->file.close = (void (*)())file_close;
stream->file.handle->close = fclose_wrapper;
stream->file.read = (int (*)(void *, char *, int))file_read;
stream->file.close = (void (*)(void *))file_close;
return stream;
}
@@ -137,7 +141,7 @@ newStrStream(Str s)
init_str_stream(&stream->base, s);
stream->str.type = IST_STR;
stream->str.handle = NULL;
stream->str.read = (int (*)())str_read;
stream->str.read = (int (*)(void *, char *, int))str_read;
stream->str.close = NULL;
return stream;
}
@@ -155,8 +159,8 @@ newSSLStream(SSL * ssl, int sock)
stream->ssl.handle = NewWithoutGC(struct ssl_handle);
stream->ssl.handle->ssl = ssl;
stream->ssl.handle->sock = sock;
stream->ssl.read = (int (*)())ssl_read;
stream->ssl.close = (void (*)())ssl_close;
stream->ssl.read = (int (*)(void *, char *, int))ssl_read;
stream->ssl.close = (void (*)(void *))ssl_close;
return stream;
}
#endif
@@ -176,8 +180,8 @@ newEncodedStream(InputStream is, char encoding)
stream->ens.handle->pos = 0;
stream->ens.handle->encoding = encoding;
growbuf_init_without_GC(&stream->ens.handle->gb);
stream->ens.read = (int (*)())ens_read;
stream->ens.close = (void (*)())ens_close;
stream->ens.read = (int (*)(void *, char *, int))ens_read;
stream->ens.close = (void (*)(void *))ens_close;
return stream;
}
@@ -653,6 +657,19 @@ basic_read(int *handle, char *buf, int len)
#endif
}
/* Wrapper functions for proper function pointer compatibility */
void
fclose_wrapper(FILE *f)
{
fclose(f);
}
void
pclose_wrapper(FILE *f)
{
pclose(f);
}
static void
file_close(struct io_file_handle *handle)
{
+3 -1
View File
@@ -110,7 +110,9 @@ typedef struct encoded_stream *EncodedStrStream;
typedef union input_stream *InputStream;
extern InputStream newInputStream(int des);
extern InputStream newFileStream(FILE * f, void (*closep) ());
extern InputStream newFileStream(FILE * f, void (*closep) (FILE *));
extern void fclose_wrapper(FILE *f);
extern void pclose_wrapper(FILE *f);
extern InputStream newStrStream(Str s);
#ifdef USE_SSL
extern InputStream newSSLStream(SSL * ssl, int sock);
+15 -90
View File
@@ -965,7 +965,7 @@ main(int argc, char **argv)
if (load_argc == 0) {
/* no URL specified */
if (!isatty(0)) {
redin = newFileStream(fdopen(dup(0), "rb"), (void (*)())pclose);
redin = newFileStream(fdopen(dup(0), "rb"), pclose_wrapper);
newbuf = openGeneralPagerBuffer(redin);
dup2(1, 0);
}
@@ -3974,61 +3974,22 @@ static void
_nextHeading(void)
{
Line *l;
int found = 0;
if (Currentbuf->firstLine == NULL)
return;
/* Look for lines marked as headings */
l = Currentbuf->currentLine->next;
while (l) {
if (l->lineBuf && l->len > 0) {
/* Look for lines that start with heading-like formatting
* In w3m, headings are often rendered with special formatting
* This is a heuristic approach */
char *buf = l->lineBuf;
/* Skip leading whitespace */
while (*buf && IS_SPACE(*buf)) buf++;
/* Look for heading characteristics:
* - Standalone lines (not starting mid-paragraph)
* - Not containing common paragraph words
* - Reasonable heading length
* - Not starting with common non-heading patterns */
if (*buf && strlen(buf) > 5 && strlen(buf) < 80) {
/* Skip obvious non-headings */
if (strncmp(buf, "http", 4) == 0 ||
strncmp(buf, "ftp", 3) == 0 ||
strncmp(buf, "[", 1) == 0 ||
strstr(buf, "paragraph") != NULL ||
strstr(buf, "content") != NULL ||
strstr(buf, "Some ") != NULL ||
strstr(buf, "Another ") != NULL ||
strstr(buf, "More ") != NULL ||
strstr(buf, "This is") != NULL) {
/* Skip this line */
} else {
/* Look for heading-like words */
if (strstr(buf, "Heading") != NULL ||
strstr(buf, "Main") != NULL ||
strstr(buf, "Level") != NULL ||
strstr(buf, "Final") != NULL ||
(strlen(buf) < 50 && !strstr(buf, "link"))) {
found = 1;
break;
}
}
}
if (l->usrflags & LINE_FLAG_HEADING) {
gotoLine(Currentbuf, l->linenumber);
Currentbuf->pos = 0;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_NORMAL);
return;
}
l = l->next;
}
if (found) {
gotoLine(Currentbuf, l->linenumber);
Currentbuf->pos = 0;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_NORMAL);
}
}
/* navigate to previous heading */
@@ -4036,58 +3997,22 @@ static void
_prevHeading(void)
{
Line *l;
int found = 0;
if (Currentbuf->firstLine == NULL)
return;
/* Look for lines marked as headings */
l = Currentbuf->currentLine->prev;
while (l) {
if (l->lineBuf && l->len > 0) {
char *buf = l->lineBuf;
/* Skip leading whitespace */
while (*buf && IS_SPACE(*buf)) buf++;
/* Look for heading characteristics:
* - Standalone lines (not starting mid-paragraph)
* - Not containing common paragraph words
* - Reasonable heading length
* - Not starting with common non-heading patterns */
if (*buf && strlen(buf) > 5 && strlen(buf) < 80) {
/* Skip obvious non-headings */
if (strncmp(buf, "http", 4) == 0 ||
strncmp(buf, "ftp", 3) == 0 ||
strncmp(buf, "[", 1) == 0 ||
strstr(buf, "paragraph") != NULL ||
strstr(buf, "content") != NULL ||
strstr(buf, "Some ") != NULL ||
strstr(buf, "Another ") != NULL ||
strstr(buf, "More ") != NULL ||
strstr(buf, "This is") != NULL) {
/* Skip this line */
} else {
/* Look for heading-like words */
if (strstr(buf, "Heading") != NULL ||
strstr(buf, "Main") != NULL ||
strstr(buf, "Level") != NULL ||
strstr(buf, "Final") != NULL ||
(strlen(buf) < 50 && !strstr(buf, "link"))) {
found = 1;
break;
}
}
}
if (l->usrflags & LINE_FLAG_HEADING) {
gotoLine(Currentbuf, l->linenumber);
Currentbuf->pos = 0;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_NORMAL);
return;
}
l = l->prev;
}
if (found) {
gotoLine(Currentbuf, l->linenumber);
Currentbuf->pos = 0;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_NORMAL);
}
}
/* navigate to next form element */
+1 -1
View File
@@ -41,7 +41,7 @@ typedef struct vector *Vector;
#define m_entry(m,i,j) (M_VAL(m,i,j))
#define v_entry(v,i) (V_VAL(v,i))
#define m_copy(m1,m2) (bcopy((m1)->me,(m2)->me,(m1)->dim*(m1)->dim*sizeof(double)))
#define m_copy(m1,m2) (memcpy((m2)->me,(m1)->me,(m1)->dim*(m1)->dim*sizeof(double)))
#define v_free(v) ((v)=NULL)
#define m_free(m) ((m)=NULL)
#define px_free(px) ((px)=NULL)
+2
View File
@@ -1,4 +1,6 @@
/* $Id: parsetag.c,v 1.4 2001/11/20 17:49:23 ukai Exp $ */
#define _GNU_SOURCE
#include <strings.h>
#include "myctype.h"
#include "indep.h"
#include "Str.h"
+3 -2
View File
@@ -5,6 +5,7 @@
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <math.h>
#include "fm.h"
#include "html.h"
@@ -1000,7 +1001,7 @@ set_integered_width(struct table *t, double *dwidth, short *iwidth)
}
fixed = NewAtom_N(char, t->maxcol + 1);
bzero(fixed, t->maxcol + 1);
memset(fixed, 0, t->maxcol + 1);
for (step = 0; step < 2; step++) {
for (i = 0; i <= t->maxcol; i += n) {
int nn;
@@ -1404,7 +1405,7 @@ set_table_width(struct table *t, short *newwidth, int maxwidth)
int try_again;
fixed = NewAtom_N(char, t->maxcol + 1);
bzero(fixed, t->maxcol + 1);
memset(fixed, 0, t->maxcol + 1);
dwidth = NewAtom_N(double, t->maxcol + 1);
for (i = 0; i <= t->maxcol; i++) {
+11 -7
View File
@@ -3,6 +3,7 @@
* An original curses library for EUC-kanji by Akinori ITO, December 1989
* revised by Akinori ITO, January 1995
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
@@ -13,6 +14,7 @@
#include <unistd.h>
#include "config.h"
#include <string.h>
#include <strings.h>
#include <sys/wait.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -678,8 +680,10 @@ cleanup:
MOVE(Currentbuf->cursorY, Currentbuf->cursorX);
}
static unsigned char *skip_gif_header(unsigned char *p);
static void
save_gif(const char *path, u_char *header, size_t header_size, u_char *body, size_t body_size)
save_gif(const char *path, unsigned char *header, size_t header_size, unsigned char *body, size_t body_size)
{
int fd;
@@ -691,8 +695,8 @@ save_gif(const char *path, u_char *header, size_t header_size, u_char *body, si
}
}
static u_char *
skip_gif_header(u_char *p)
static unsigned char *
skip_gif_header(unsigned char *p)
{
/* Header */
p += 10;
@@ -710,10 +714,10 @@ save_first_animation_frame(const char *path)
{
int fd;
struct stat st;
u_char *header;
unsigned char *header;
size_t header_size;
u_char *body;
u_char *p;
unsigned char *body;
unsigned char *p;
ssize_t len;
Str new_path;
@@ -1297,7 +1301,7 @@ setupscreen(void)
for (i = 0; i < max_LINES; i++) {
#ifdef USE_M17N
ScreenElem[i].lineimage = New_N(char *, max_COLS);
bzero((void *)ScreenElem[i].lineimage, max_COLS * sizeof(char *));
memset((void *)ScreenElem[i].lineimage, 0, max_COLS * sizeof(char *));
#else
ScreenElem[i].lineimage = New_N(char, max_COLS);
#endif
+1
View File
@@ -132,6 +132,7 @@ newTextLine(Str line, int pos)
else
lbuf->line = Strnew();
lbuf->pos = pos;
lbuf->is_heading = 0;
return lbuf;
}
+1
View File
@@ -53,6 +53,7 @@ typedef struct _textlist {
typedef struct _TextLine {
Str line;
int pos;
char is_heading;
} TextLine;
typedef struct _textlinelistitem {
+2 -2
View File
@@ -1694,12 +1694,12 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
/* local CGI: POST */
uf.stream = newFileStream(localcgi_post(pu->real_file, pu->query,
request, option->referer),
(void (*)())fclose);
fclose_wrapper);
else
/* lodal CGI: GET */
uf.stream = newFileStream(localcgi_get(pu->real_file, pu->query,
option->referer),
(void (*)())fclose);
fclose_wrapper);
if (uf.stream) {
uf.is_cgi = TRUE;
uf.scheme = pu->scheme = SCM_LOCAL_CGI;