Commit a3a6c54e authored by Paul Eggert's avatar Paul Eggert

Merge: Fix more problems found by GCC 4.5.2's static checks.

parents d6cd56f1 b1d876f1
This diff is collapsed.
......@@ -92,7 +92,8 @@ extern __malloc_size_t __malloc_extra_blocks;
#endif /* not DOUG_LEA_MALLOC */
#if ! defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD)
#if ! defined SYSTEM_MALLOC && ! defined SYNC_INPUT
#ifdef HAVE_GTK_AND_PTHREAD
/* When GTK uses the file chooser dialog, different backends can be loaded
dynamically. One such a backend is the Gnome VFS backend that gets loaded
......@@ -130,12 +131,13 @@ static pthread_mutex_t alloc_mutex;
} \
while (0)
#else /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
#else /* ! defined HAVE_GTK_AND_PTHREAD */
#define BLOCK_INPUT_ALLOC BLOCK_INPUT
#define UNBLOCK_INPUT_ALLOC UNBLOCK_INPUT
#endif /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
#endif /* ! defined HAVE_GTK_AND_PTHREAD */
#endif /* ! defined SYSTEM_MALLOC && ! defined SYNC_INPUT */
/* Value of _bytes_used, when spare_memory was freed. */
......@@ -152,13 +154,11 @@ static __malloc_size_t bytes_used_when_full;
#define VECTOR_UNMARK(V) ((V)->size &= ~ARRAY_MARK_FLAG)
#define VECTOR_MARKED_P(V) (((V)->size & ARRAY_MARK_FLAG) != 0)
/* Value is the number of bytes/chars of S, a pointer to a struct
Lisp_String. This must be used instead of STRING_BYTES (S) or
S->size during GC, because S->size contains the mark bit for
/* Value is the number of bytes of S, a pointer to a struct Lisp_String.
Be careful during GC, because S->size contains the mark bit for
strings. */
#define GC_STRING_BYTES(S) (STRING_BYTES (S))
#define GC_STRING_CHARS(S) ((S)->size & ~ARRAY_MARK_FLAG)
/* Global variables. */
struct emacs_globals globals;
......@@ -270,8 +270,6 @@ Lisp_Object Qpost_gc_hook;
static void mark_buffer (Lisp_Object);
static void mark_terminals (void);
extern void mark_kboards (void);
extern void mark_backtrace (void);
static void gc_sweep (void);
static void mark_glyph_matrix (struct glyph_matrix *);
static void mark_face_cache (struct face_cache *);
......@@ -2654,17 +2652,17 @@ DEFUN ("cons", Fcons, Scons, 2, 2, 0,
return val;
}
#ifdef GC_CHECK_CONS_LIST
/* Get an error now if there's any junk in the cons free list. */
void
check_cons_list (void)
{
#ifdef GC_CHECK_CONS_LIST
struct Lisp_Cons *tail = cons_free_list;
while (tail)
tail = tail->u.chain;
#endif
}
#endif
/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
......@@ -2904,15 +2902,15 @@ See also the function `vector'. */)
{
Lisp_Object vector;
register EMACS_INT sizei;
register EMACS_INT index;
register EMACS_INT i;
register struct Lisp_Vector *p;
CHECK_NATNUM (length);
sizei = XFASTINT (length);
p = allocate_vector (sizei);
for (index = 0; index < sizei; index++)
p->contents[index] = init;
for (i = 0; i < sizei; i++)
p->contents[i] = init;
XSETVECTOR (vector, p);
return vector;
......@@ -2926,14 +2924,14 @@ usage: (vector &rest OBJECTS) */)
(register int nargs, Lisp_Object *args)
{
register Lisp_Object len, val;
register int index;
register int i;
register struct Lisp_Vector *p;
XSETFASTINT (len, nargs);
val = Fmake_vector (len, Qnil);
p = XVECTOR (val);
for (index = 0; index < nargs; index++)
p->contents[index] = args[index];
for (i = 0; i < nargs; i++)
p->contents[i] = args[i];
return val;
}
......@@ -2948,7 +2946,7 @@ usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INT
(register int nargs, Lisp_Object *args)
{
register Lisp_Object len, val;
register int index;
register int i;
register struct Lisp_Vector *p;
XSETFASTINT (len, nargs);
......@@ -2966,11 +2964,11 @@ usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INT
args[1] = Fstring_as_unibyte (args[1]);
p = XVECTOR (val);
for (index = 0; index < nargs; index++)
for (i = 0; i < nargs; i++)
{
if (!NILP (Vpurify_flag))
args[index] = Fpurecopy (args[index]);
p->contents[index] = args[index];
args[i] = Fpurecopy (args[i]);
p->contents[i] = args[i];
}
XSETPVECTYPE (p, PVEC_COMPILED);
XSETCOMPILED (val, p);
......@@ -4313,12 +4311,6 @@ static void
mark_stack (void)
{
int i;
/* jmp_buf may not be aligned enough on darwin-ppc64 */
union aligned_jmpbuf {
Lisp_Object o;
jmp_buf j;
} j;
volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
void *end;
#ifdef HAVE___BUILTIN_UNWIND_INIT
......@@ -4328,6 +4320,14 @@ mark_stack (void)
__builtin_unwind_init ();
end = &end;
#else /* not HAVE___BUILTIN_UNWIND_INIT */
#ifndef GC_SAVE_REGISTERS_ON_STACK
/* jmp_buf may not be aligned enough on darwin-ppc64 */
union aligned_jmpbuf {
Lisp_Object o;
jmp_buf j;
} j;
volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
#endif
/* This trick flushes the register windows so that all the state of
the process is contained in the stack. */
/* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
......@@ -5064,18 +5064,18 @@ returns nil, because real GC can't be done. */)
if (FLOATP (Vgc_cons_percentage))
{ /* Set gc_cons_combined_threshold. */
EMACS_INT total = 0;
total += total_conses * sizeof (struct Lisp_Cons);
total += total_symbols * sizeof (struct Lisp_Symbol);
total += total_markers * sizeof (union Lisp_Misc);
total += total_string_size;
total += total_vector_size * sizeof (Lisp_Object);
total += total_floats * sizeof (struct Lisp_Float);
total += total_intervals * sizeof (struct interval);
total += total_strings * sizeof (struct Lisp_String);
gc_relative_threshold = total * XFLOAT_DATA (Vgc_cons_percentage);
EMACS_INT tot = 0;
tot += total_conses * sizeof (struct Lisp_Cons);
tot += total_symbols * sizeof (struct Lisp_Symbol);
tot += total_markers * sizeof (union Lisp_Misc);
tot += total_string_size;
tot += total_vector_size * sizeof (Lisp_Object);
tot += total_floats * sizeof (struct Lisp_Float);
tot += total_intervals * sizeof (struct interval);
tot += total_strings * sizeof (struct Lisp_String);
gc_relative_threshold = tot * XFLOAT_DATA (Vgc_cons_percentage);
}
else
gc_relative_threshold = 0;
......@@ -5124,9 +5124,9 @@ returns nil, because real GC can't be done. */)
if (!NILP (Vpost_gc_hook))
{
int count = inhibit_garbage_collection ();
int gc_count = inhibit_garbage_collection ();
safe_run_hooks (Qpost_gc_hook);
unbind_to (count, Qnil);
unbind_to (gc_count, Qnil);
}
/* Accumulate statistics. */
......@@ -5305,7 +5305,6 @@ mark_object (Lisp_Object arg)
#else /* not GC_CHECK_MARKED_OBJECTS */
#define CHECK_ALLOCATED() (void) 0
#define CHECK_LIVE(LIVEP) (void) 0
#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
......@@ -6057,7 +6056,7 @@ We divide the value by 1024 to make sure it fits in a Lisp integer. */)
{
Lisp_Object end;
XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
XSETINT (end, (EMACS_INT) (char *) sbrk (0) / 1024);
return end;
}
......
......@@ -1464,9 +1464,9 @@ with SIGHUP. */)
don't re-kill them. */
if (other->base_buffer == b && !NILP (BVAR (other, name)))
{
Lisp_Object buffer;
XSETBUFFER (buffer, other);
Fkill_buffer (buffer);
Lisp_Object buf;
XSETBUFFER (buf, other);
Fkill_buffer (buf);
}
UNGCPRO;
......@@ -1527,9 +1527,9 @@ with SIGHUP. */)
&& BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
&& NILP (Fsymbol_value (intern ("auto-save-visited-file-name"))))
{
Lisp_Object tem;
tem = Fsymbol_value (intern ("delete-auto-save-files"));
if (! NILP (tem))
Lisp_Object delete;
delete = Fsymbol_value (intern ("delete-auto-save-files"));
if (! NILP (delete))
internal_delete_file (BVAR (b, auto_save_file_name));
}
......@@ -1601,19 +1601,19 @@ with SIGHUP. */)
void
record_buffer (Lisp_Object buf)
{
register Lisp_Object link, prev;
register Lisp_Object list, prev;
Lisp_Object frame;
frame = selected_frame;
prev = Qnil;
for (link = Vbuffer_alist; CONSP (link); link = XCDR (link))
for (list = Vbuffer_alist; CONSP (list); list = XCDR (list))
{
if (EQ (XCDR (XCAR (link)), buf))
if (EQ (XCDR (XCAR (list)), buf))
break;
prev = link;
prev = list;
}
/* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist);
/* Effectively do Vbuffer_alist = Fdelq (list, Vbuffer_alist);
we cannot use Fdelq itself here because it allows quitting. */
if (NILP (prev))
......@@ -1621,40 +1621,40 @@ record_buffer (Lisp_Object buf)
else
XSETCDR (prev, XCDR (XCDR (prev)));
XSETCDR (link, Vbuffer_alist);
Vbuffer_alist = link;
XSETCDR (list, Vbuffer_alist);
Vbuffer_alist = list;
/* Effectively do a delq on buried_buffer_list. */
prev = Qnil;
for (link = XFRAME (frame)->buried_buffer_list; CONSP (link);
link = XCDR (link))
for (list = XFRAME (frame)->buried_buffer_list; CONSP (list);
list = XCDR (list))
{
if (EQ (XCAR (link), buf))
if (EQ (XCAR (list), buf))
{
if (NILP (prev))
XFRAME (frame)->buried_buffer_list = XCDR (link);
XFRAME (frame)->buried_buffer_list = XCDR (list);
else
XSETCDR (prev, XCDR (XCDR (prev)));
break;
}
prev = link;
prev = list;
}
/* Now move this buffer to the front of frame_buffer_list also. */
prev = Qnil;
for (link = frame_buffer_list (frame); CONSP (link);
link = XCDR (link))
for (list = frame_buffer_list (frame); CONSP (list);
list = XCDR (list))
{
if (EQ (XCAR (link), buf))
if (EQ (XCAR (list), buf))
break;
prev = link;
prev = list;
}
/* Effectively do delq. */
if (CONSP (link))
if (CONSP (list))
{
if (NILP (prev))
set_frame_buffer_list (frame,
......@@ -1662,8 +1662,8 @@ record_buffer (Lisp_Object buf)
else
XSETCDR (prev, XCDR (XCDR (prev)));
XSETCDR (link, frame_buffer_list (frame));
set_frame_buffer_list (frame, link);
XSETCDR (list, frame_buffer_list (frame));
set_frame_buffer_list (frame, list);
}
else
set_frame_buffer_list (frame, Fcons (buf, frame_buffer_list (frame)));
......@@ -1712,7 +1712,7 @@ the current buffer's major mode. */)
/* Switch to buffer BUFFER in the selected window.
If NORECORD is non-nil, don't call record_buffer. */
Lisp_Object
static Lisp_Object
switch_to_buffer_1 (Lisp_Object buffer_or_name, Lisp_Object norecord)
{
register Lisp_Object buffer;
......@@ -1984,13 +1984,13 @@ its frame, iconify that frame. */)
buffer is killed. */
if (!NILP (BVAR (XBUFFER (buffer), name)))
{
Lisp_Object aelt, link;
Lisp_Object aelt, list;
aelt = Frassq (buffer, Vbuffer_alist);
link = Fmemq (aelt, Vbuffer_alist);
list = Fmemq (aelt, Vbuffer_alist);
Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
XSETCDR (link, Qnil);
Vbuffer_alist = nconc2 (Vbuffer_alist, link);
XSETCDR (list, Qnil);
Vbuffer_alist = nconc2 (Vbuffer_alist, list);
XFRAME (selected_frame)->buffer_list
= Fdelq (buffer, XFRAME (selected_frame)->buffer_list);
......@@ -2335,12 +2335,12 @@ current buffer is cleared. */)
&& GPT_BYTE > 1 && GPT_BYTE < Z_BYTE
&& ! CHAR_HEAD_P (*(GAP_END_ADDR)))
{
unsigned char *p = GPT_ADDR - 1;
unsigned char *q = GPT_ADDR - 1;
while (! CHAR_HEAD_P (*p) && p > BEG_ADDR) p--;
if (LEADING_CODE_P (*p))
while (! CHAR_HEAD_P (*q) && q > BEG_ADDR) q--;
if (LEADING_CODE_P (*q))
{
EMACS_INT new_gpt = GPT_BYTE - (GPT_ADDR - p);
EMACS_INT new_gpt = GPT_BYTE - (GPT_ADDR - q);
move_gap_both (new_gpt, new_gpt);
}
......@@ -2424,14 +2424,14 @@ current buffer is cleared. */)
ZV = chars_in_text (BEG_ADDR, ZV_BYTE - BEG_BYTE) + BEG;
{
EMACS_INT pt_byte = advance_to_char_boundary (PT_BYTE);
EMACS_INT pt;
EMACS_INT byte = advance_to_char_boundary (PT_BYTE);
EMACS_INT position;
if (pt_byte > GPT_BYTE)
pt = chars_in_text (GAP_END_ADDR, pt_byte - GPT_BYTE) + GPT;
if (byte > GPT_BYTE)
position = chars_in_text (GAP_END_ADDR, byte - GPT_BYTE) + GPT;
else
pt = chars_in_text (BEG_ADDR, pt_byte - BEG_BYTE) + BEG;
TEMP_SET_PT_BOTH (pt, pt_byte);
position = chars_in_text (BEG_ADDR, byte - BEG_BYTE) + BEG;
TEMP_SET_PT_BOTH (position, byte);
}
tail = markers = BUF_MARKERS (current_buffer);
......@@ -3398,7 +3398,8 @@ void
fix_start_end_in_overlays (register EMACS_INT start, register EMACS_INT end)
{
Lisp_Object overlay;
struct Lisp_Overlay *before_list, *after_list;
struct Lisp_Overlay *before_list IF_LINT (= NULL);
struct Lisp_Overlay *after_list IF_LINT (= NULL);
/* These are either nil, indicating that before_list or after_list
should be assigned, or the cons cell the cdr of which should be
assigned. */
......@@ -3546,7 +3547,7 @@ fix_overlays_before (struct buffer *bp, EMACS_INT prev, EMACS_INT pos)
/* If parent is nil, replace overlays_before; otherwise, parent->next. */
struct Lisp_Overlay *tail = bp->overlays_before, *parent = NULL, *right_pair;
Lisp_Object tem;
EMACS_INT end;
EMACS_INT end IF_LINT (= 0);
/* After the insertion, the several overlays may be in incorrect
order. The possibility is that, in the list `overlays_before',
......@@ -4322,10 +4323,10 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, int after,
for (i = 0; i < size;)
{
Lisp_Object prop, overlay;
prop = copy[i++];
overlay = copy[i++];
call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3);
Lisp_Object prop_i, overlay_i;
prop_i = copy[i++];
overlay_i = copy[i++];
call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
}
}
UNGCPRO;
......
......@@ -1026,4 +1026,31 @@ extern int last_per_buffer_idx;
#define PER_BUFFER_VALUE(BUFFER, OFFSET) \
(*(Lisp_Object *)((OFFSET) + (char *) (BUFFER)))
/* Downcase a character C, or make no change if that cannot be done. */
static inline int
downcase (int c)
{
Lisp_Object downcase_table = BVAR (current_buffer, downcase_table);
Lisp_Object down = CHAR_TABLE_REF (downcase_table, c);
return NATNUMP (down) ? XFASTINT (down) : c;
}
/* 1 if C is upper case. */
static inline int uppercasep (int c) { return downcase (c) != c; }
/* Upcase a character C known to be not upper case. */
static inline int
upcase1 (int c)
{
Lisp_Object upcase_table = BVAR (current_buffer, upcase_table);
Lisp_Object up = CHAR_TABLE_REF (upcase_table, c);
return NATNUMP (up) ? XFASTINT (up) : c;
}
/* 1 if C is lower case. */
static inline int lowercasep (int c)
{ return !uppercasep (c) && upcase1 (c) != c; }
/* Upcase a character C, or make no change if that cannot be done. */
static inline int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); }
......@@ -76,11 +76,7 @@ Lisp_Object Qbyte_code_meter;
} \
}
#else /* no BYTE_CODE_METER */
#define METER_CODE(last_code, this_code)
#endif /* no BYTE_CODE_METER */
#endif /* BYTE_CODE_METER */
Lisp_Object Qbytecode;
......@@ -146,7 +142,9 @@ Lisp_Object Qbytecode;
#define Bpreceding_char 0150
#define Bcurrent_column 0151
#define Bindent_to 0152
#ifdef BYTE_CODE_SAFE
#define Bscan_buffer 0153 /* No longer generated as of v18 */
#endif
#define Beolp 0154
#define Beobp 0155
#define Bbolp 0156
......@@ -154,8 +152,12 @@ Lisp_Object Qbytecode;
#define Bcurrent_buffer 0160
#define Bset_buffer 0161
#define Bsave_current_buffer_1 0162 /* Replacing Bsave_current_buffer. */
#if 0
#define Bread_char 0162 /* No longer generated as of v19 */
#endif
#ifdef BYTE_CODE_SAFE
#define Bset_mark 0163 /* this loser is no longer generated as of v18 */
#endif
#define Binteractive_p 0164 /* Needed since interactive-p takes unevalled args */
#define Bforward_char 0165
......@@ -227,7 +229,6 @@ Lisp_Object Qbytecode;
#define BinsertN 0261
#define Bconstant 0300
#define CONSTANTLIM 0100
/* Whether to maintain a `top' and `bottom' field in the stack frame. */
#define BYTE_MAINTAIN_TOP (BYTE_CODE_SAFE || BYTE_MARK_STACK)
......@@ -363,6 +364,7 @@ unmark_byte_stack (void)
We do this at every branch, to avoid loops that never GC. */
#define MAYBE_GC() \
do { \
if (consing_since_gc > gc_cons_threshold \
&& consing_since_gc > gc_relative_threshold) \
{ \
......@@ -370,7 +372,7 @@ unmark_byte_stack (void)
Fgarbage_collect (); \
AFTER_POTENTIAL_GC (); \
} \
else
} while (0)
/* Check for jumping out of range. */
......
......@@ -118,7 +118,7 @@ usage: (interactive &optional ARGS) */)
/* Quotify EXP: if EXP is constant, return it.
If EXP is not constant, return (quote EXP). */
Lisp_Object
static Lisp_Object
quotify_arg (register Lisp_Object exp)
{
if (!INTEGERP (exp) && !STRINGP (exp)
......@@ -129,7 +129,7 @@ quotify_arg (register Lisp_Object exp)
}
/* Modify EXP by quotifying each element (except the first). */
Lisp_Object
static Lisp_Object
quotify_args (Lisp_Object exp)
{
register Lisp_Object tail;
......@@ -258,7 +258,7 @@ invoke it. If KEYS is omitted or nil, the return value of
Lisp_Object prefix_arg;
char *string;
char *tem;
const char *tem;
/* If varies[i] > 0, the i'th argument shouldn't just have its value
in this call quoted in the command history. It should be
......@@ -408,25 +408,25 @@ invoke it. If KEYS is omitted or nil, the return value of
string++;
else if (*string == '@')
{
Lisp_Object event, tem;
Lisp_Object event, w;
event = (next_event < key_count
? AREF (keys, next_event)
: Qnil);
if (EVENT_HAS_PARAMETERS (event)
&& (tem = XCDR (event), CONSP (tem))
&& (tem = XCAR (tem), CONSP (tem))
&& (tem = XCAR (tem), WINDOWP (tem)))
&& (w = XCDR (event), CONSP (w))
&& (w = XCAR (w), CONSP (w))
&& (w = XCAR (w), WINDOWP (w)))
{
if (MINI_WINDOW_P (XWINDOW (tem))
&& ! (minibuf_level > 0 && EQ (tem, minibuf_window)))
if (MINI_WINDOW_P (XWINDOW (w))
&& ! (minibuf_level > 0 && EQ (w, minibuf_window)))
error ("Attempt to select inactive minibuffer window");
/* If the current buffer wants to clean up, let it. */
if (!NILP (Vmouse_leave_buffer_hook))
call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
Fselect_window (tem, Qnil);
Fselect_window (w, Qnil);
}
string++;
}
......@@ -679,7 +679,7 @@ invoke it. If KEYS is omitted or nil, the return value of
int first = 1;
do
{
Lisp_Object tem;
Lisp_Object str;
if (! first)
{
message ("Please enter a number.");
......@@ -687,13 +687,13 @@ invoke it. If KEYS is omitted or nil, the return value of
}
first = 0;
tem = Fread_from_minibuffer (callint_message,
str = Fread_from_minibuffer (callint_message,
Qnil, Qnil, Qnil, Qnil, Qnil,
Qnil);
if (! STRINGP (tem) || SCHARS (tem) == 0)
if (! STRINGP (str) || SCHARS (str) == 0)
args[i] = Qnil;
else
args[i] = Fread (tem);
args[i] = Fread (str);
}
while (! NUMBERP (args[i]));
}
......
......@@ -32,7 +32,7 @@ enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP};
Lisp_Object Qidentity;
Lisp_Object
static Lisp_Object
casify_object (enum case_action flag, Lisp_Object obj)
{
register int c, c1;
......@@ -64,13 +64,13 @@ casify_object (enum case_action flag, Lisp_Object obj)
multibyte = 1;
if (! multibyte)
MAKE_CHAR_MULTIBYTE (c1);
c = DOWNCASE (c1);
c = downcase (c1);
if (inword)
XSETFASTINT (obj, c | flags);
else if (c == (XFASTINT (obj) & ~flagbits))
{
if (! inword)
c = UPCASE1 (c1);
c = upcase1 (c1);
if (! multibyte)
MAKE_CHAR_UNIBYTE (c);
XSETFASTINT (obj, c | flags);
......@@ -92,10 +92,10 @@ casify_object (enum case_action flag, Lisp_Object obj)
MAKE_CHAR_MULTIBYTE (c);
c1 = c;
if (inword && flag != CASE_CAPITALIZE_UP)
c = DOWNCASE (c);
else if (!UPPERCASEP (c)
c = downcase (c);
else if (!uppercasep (c)
&& (!inword || flag != CASE_CAPITALIZE_UP))
c = UPCASE1 (c1);
c = upcase1 (c1);
if ((int) flag >= (int) CASE_CAPITALIZE)
inword = (SYNTAX (c) == Sword);
if (c != c1)
......@@ -133,10 +133,10 @@ casify_object (enum case_action flag, Lisp_Object obj)
}
c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, len);
if (inword && flag != CASE_CAPITALIZE_UP)
c = DOWNCASE (c);
else if (!UPPERCASEP (c)