From: Keith M. <kei...@us...> - 2007-04-20 22:24:09
|
Update of /cvsroot/mingw/catgets In directory sc8-pr-cvs16:/tmp/cvs-serv20922 Modified Files: ChangeLog catopen.c mcsource.c Log Message: * catopen.c (mc_open): Catch unopened file; return failed status. * mcsource.c (mc_source): Kill MSGTEXT state, after NL at EOF. Index: catopen.c =================================================================== RCS file: /cvsroot/mingw/catgets/catopen.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** catopen.c 6 Apr 2007 22:34:52 -0000 1.1.1.1 --- catopen.c 20 Apr 2007 22:24:02 -0000 1.2 *************** *** 53,57 **** * On Win32 platforms, we don't expect LC_MESSAGES to be defined. * For this, and any others which don't define it, substitute LC_CTYPE. - * */ # define LC_MESSAGES LC_CTYPE --- 53,56 ---- *************** *** 64,68 **** * we need to provide the malloc/realloc wrapper function, * which is prototyped in platform.h - * */ #include <errno.h> --- 63,66 ---- *************** *** 89,93 **** * we can handle. */ - if( (fd = open( name, O_RDONLY | O_BINARY )) >= 0 ) { --- 87,90 ---- *************** *** 109,113 **** * so release the file descriptor... */ - close( fd ); } --- 106,109 ---- *************** *** 115,119 **** /* ...and fall through, returning an invalid descriptor. */ - return (int)(-1); } --- 111,114 ---- *************** *** 126,130 **** * status code specified by `retval'. */ - setlocale( LC_TYPE, working_locale ); free( working_locale ); --- 121,124 ---- *************** *** 146,150 **** * ( we need to change it temporarily, because... */ - char *saved_locale = strdup( setlocale( LC_CTYPE, NULL ) ); --- 140,143 ---- *************** *** 153,157 **** * Win32 multibyte character path names ). */ - setlocale( LC_CTYPE, "" ); if( (step = mbtowc( &chk, (chkptr = msgcat), MB_CUR_MAX )) > 0 ) --- 146,149 ---- *************** *** 160,164 **** * characters which appear to represent a Win32 drive specifier. */ - if( (chk != L'/') && (chk != L'\\') ) { --- 152,155 ---- *************** *** 166,170 **** * directory name separator, and the second *is* a colon... */ - chkptr += step; if( ((step = mbtowc( &chk, chkptr, MB_CUR_MAX )) > 0) && (chk == L':') ) --- 157,160 ---- *************** *** 178,182 **** /* Scan the given `msgcat' spec, checking for directory name separators... */ - while( step > 0 ) { --- 168,171 ---- *************** *** 186,190 **** * so pass it back to `catopen', as an exact catalogue file reference. */ - return mc_pop_locale( LC_CTYPE, saved_locale, mc_validate( msgcat ) ); } --- 175,178 ---- *************** *** 197,201 **** * falling back to the built in default, if none is defined. */ - if( (nlspath = getenv( "NLSPATH" )) == NULL ) nlspath = NLSPATH_DEFAULT; --- 185,188 ---- *************** *** 206,210 **** * catalogue successfully matched, or bail out if no match found. */ - nlscopy = nlsname; headroom = sizeof( nlsname ); --- 193,196 ---- *************** *** 214,223 **** case L'\0': case NLSPATH_SEPARATOR_CHAR: ! ! /* We reached the end of the current NLSPATH template component; * add a terminator, and attempt to validate a matching message * catalogue; return it immediately if successful. */ - if( headroom >= MB_CUR_MAX ) { --- 200,208 ---- case L'\0': case NLSPATH_SEPARATOR_CHAR: ! /* ! * We reached the end of the current NLSPATH template component; * add a terminator, and attempt to validate a matching message * catalogue; return it immediately if successful. */ if( headroom >= MB_CUR_MAX ) { *************** *** 226,235 **** return fd; } - /* Couldn't find a valid message catalogue to match the current * NLSPATH prototype; move on to the next template, if any, and * try again. */ - nlspath += step; nlscopy = nlsname; --- 211,218 ---- *************** *** 238,244 **** case L'%': ! ! /* Found a substitution meta-character; need to interpret it. */ ! nlspath += step; nlspath += (step = mbtowc( &chk, nlspath, MB_CUR_MAX )); --- 221,227 ---- case L'%': ! /* ! * Found a substitution meta-character; need to interpret it. ! */ nlspath += step; nlspath += (step = mbtowc( &chk, nlspath, MB_CUR_MAX )); *************** *** 250,256 **** * then append it to the prototype for the message catalogue name * which we are currently constructing. - * */ - if( headroom >= MB_CUR_MAX ) { --- 233,237 ---- *************** *** 267,273 **** * this `catopen' request, into the assembled name prototype; * again, check we have sufficient space, before proceeding. - * */ - subst = msgcat; while( (copy_index = mbtowc( &chk, subst, MB_CUR_MAX )) > 0 ) --- 248,252 ---- *************** *** 292,301 **** * `LC_MESSAGES' or `LANG' definitions in the environment, if * present, otherwise for the system locale. - * */ - if( (nls_locale != NULL) || ((nls_locale = getenv( NLS_LOCALE_STRING )) != NULL) ! || ((nls_locale = setlocale( LC_MESSAGES, NULL )) != NULL) ) { wchar_t break_code = L'\0'; --- 271,278 ---- * `LC_MESSAGES' or `LANG' definitions in the environment, if * present, otherwise for the system locale. */ if( (nls_locale != NULL) || ((nls_locale = getenv( NLS_LOCALE_STRING )) != NULL) ! || ((nls_locale = setlocale( LC_MESSAGES, NULL )) != NULL) ) { wchar_t break_code = L'\0'; *************** *** 332,335 **** --- 309,316 ---- default: + /* + * Any regular character is simply copied to the constructed path, + * provided there is sufficient space available. + */ if( headroom >= step ) { *************** *** 347,351 **** * so just return it as is, and leave `catopen' to clean up. */ - return mc_pop_locale( LC_CTYPE, saved_locale, (int)(-1) ); } --- 328,331 ---- *************** *** 363,367 **** * memory, and loads the entire catalogue into the allocated space. */ - char *catname = va_arg( argv, char * ); unsigned tab_increment, flags = va_arg( argv, unsigned ); --- 343,346 ---- *************** *** 370,374 **** * table slots to create, if we need to expand the table. */ - if( (tab_increment = flags & NL_CATD_BLKSIZ_MAX) > 0 ) cdt->grow_size = tab_increment; --- 349,352 ---- *************** *** 376,380 **** /* Find the first free slot, if any, in the descriptor table. */ - int retval = 0; while( (retval < cdt->curr_size) && (cdt->tab[ retval ].fd >= 0) ) --- 354,357 ---- *************** *** 383,387 **** /* Got an empty slot? */ - if( retval == cdt->curr_size ) { --- 360,363 ---- *************** *** 390,394 **** * table increment size, bailing out on failure. */ - struct mc_descriptor *tmp = cdt->tab; int new_size = retval + cdt->grow_size; --- 366,369 ---- *************** *** 399,403 **** * initialise each new slot... */ - cdt->tab = tmp; while( retval < new_size ) --- 374,377 ---- *************** *** 423,427 **** * within the message catalogue descriptor. */ - if( (cdt->tab[ retval ].fd = mc_nlspath_open( catname, flags )) >= 0 ) { --- 397,400 ---- *************** *** 430,434 **** * and load the entire contents of the file into this buffer. */ - struct stat catinfo; struct mc_descriptor *ref = cdt->tab + retval; --- 403,406 ---- *************** *** 439,463 **** /* If we get to here, we failed to load the message catalogue, * so mark the descriptor as unused, free any resources we allocated, ! * and bail out. */ - _mc_free_( ref ); - return (void *)(-1); } } ! /* If we did not bail out earlier, ! * then we should now have a valid, and open, message catalogue descriptor; ! * it is actually of `nl_catd' type, but `_mctab_' requires us to return it ! * as a generic `void *' pointer; we do that, leaving `catopen' to cast it ! * to the ultimately expected `nl_catd' type. */ ! ! return (void *) retval; } /* The actual `catopen' implementation is trivial... */ - nl_catd catopen( __const char *name, int flags ) { --- 411,436 ---- /* If we get to here, we failed to load the message catalogue, * so mark the descriptor as unused, free any resources we allocated, ! * and fall through to bail out. */ _mc_free_( ref ); } + else + /* + * We should now have a valid, and open, message catalogue descriptor; + * it is actually of `nl_catd' type, but `_mctab_' requires us to return + * a generic `void *' pointer; we do that, leaving `catopen' to cast it + * to the ultimately expected `nl_catd' type. + */ + return (void *) retval; } ! /* If we fall through to here, then something went wrong; ! * there should be nothing to clean up, so just return a `failed' status. */ ! return (void *)(-1); } /* The actual `catopen' implementation is trivial... */ nl_catd catopen( __const char *name, int flags ) { Index: mcsource.c =================================================================== RCS file: /cvsroot/mingw/catgets/mcsource.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** mcsource.c 6 Apr 2007 22:34:51 -0000 1.1.1.1 --- mcsource.c 20 Apr 2007 22:24:03 -0000 1.2 *************** *** 739,743 **** * BEFORE we proceed to the next cycle. */ - while( headroom < (xcount + ICONV_MB_LEN_MAX) ) { --- 739,742 ---- *************** *** 790,793 **** --- 789,805 ---- } dfprintf(( stderr, "\n%s:end of input; (count is now %d bytes)", input, count )); + /* + * We reached the end of the input stream. + * If the final record was a message definition, + * then the MSGTEXT parser state will still be active; + * this state would be cancelled immediately, at the start of the next cycle, + * but becuase there is no more input data, we will not start another cycle. + * To avoid misidentifying this case as an incomplete final message, + * and so displaying an erroneous warning, + * we clear this state now. + */ + if( (count == 0) + && ((status & (MSGTEXT | NEWLINE | CONTINUED)) == (MSGTEXT | NEWLINE)) ) + status &= ~MSGTEXT; } /* Index: ChangeLog =================================================================== RCS file: /cvsroot/mingw/catgets/ChangeLog,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** ChangeLog 6 Apr 2007 22:34:55 -0000 1.1.1.1 --- ChangeLog 20 Apr 2007 22:24:02 -0000 1.2 *************** *** 1,2 **** --- 1,7 ---- + 2007-04-20 Keith Marshall <kei...@us...> + + * catopen.c (mc_open): Catch unopened file; return failed status. + * mcsource.c (mc_source): Kill MSGTEXT state, after NL at EOF. + 2007-04-06 Keith Marshall <kei...@us...> |