Ignore:
Timestamp:
Nov 21, 1999, 2:59:36 PM (26 years ago)
Author:
achimha
Message:

Christoph's LoadMessage fix for linefeeds at the end

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/message.cpp

    r1242 r1792  
    1 /* $Id: message.cpp,v 1.7 1999-10-10 09:00:58 sandervl Exp $ */
     1/* $Id: message.cpp,v 1.8 1999-11-21 13:59:36 achimha Exp $ */
    22
    33/*
     
    77 *
    88 * Original WINE code (loader\resource.c)
     9 * WINE level: 991031
    910 *
    1011 * Resources
     
    2526#include "heapstring.h"
    2627
     28typedef VOID (*WVSPRINTFAPROC)(LPSTR,LPCSTR,va_list);
     29WVSPRINTFAPROC wvsprintfAProc = NULL;
     30
     31BOOL LoadwvsprintfA(VOID)
     32{
     33  //CB: load wvsprintfA dynamic to avoid problems with crosslinked DLL's
     34  if (!wvsprintfAProc)
     35  {
     36    HMODULE hUser32 = LoadLibraryA("USER32.DLL");
     37
     38    wvsprintfAProc = (WVSPRINTFAPROC)GetProcAddress(hUser32,"wvsprintfA");
     39    FreeLibrary(hUser32);
     40  }
     41
     42  return wvsprintfAProc != NULL;
     43}
    2744
    2845//******************************************************************************
     
    4764
    4865    /*FIXME: I am not sure about the '1' ... But I've only seen those entries*/
    49     hrsrc = FindResourceA(instance,(LPCSTR)1,(LPCSTR)RT_MESSAGELISTA);
     66    hrsrc = FindResourceW(instance,(LPWSTR)1,RT_MESSAGELISTW);
    5067    if (!hrsrc) return 0;
    5168    hmem = LoadResource(instance, hrsrc);
     
    126143         f;
    127144   DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK;
    128    DWORD nolinefeed = 0;
     145   BOOL  eos = FALSE;
    129146
    130147   dprintf(("KERNEL32: FormatMessageA(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
     
    179196     f=from;
    180197
    181      while (*f && !nolinefeed)
     198     while (*f && !eos)
    182199     {
    183200       if (*f=='%')
     
    250267                 argliststart=(*(DWORD**)args)+insertnr-1;
    251268
    252                if (fmtstr[strlen(fmtstr)-1]=='s')
     269               if (fmtstr[strlen(fmtstr)-1]=='s' && argliststart[0])
    253270                 sprintfbuf = (char*)HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);
    254271               else
     
    256273
    257274               /* CMF - This makes a BIG assumption about va_list */
    258                O32_wvsprintf(sprintfbuf, fmtstr, (va_list) argliststart);
     275               if (LoadwvsprintfA()) wvsprintfAProc(sprintfbuf,fmtstr,(va_list)argliststart);
    259276               x=sprintfbuf;
    260277               while (*x)
     
    280297
    281298           case 'n':
    282              /* FIXME: perhaps add \r too? */
     299             ADD_TO_T('\r');
    283300             ADD_TO_T('\n');
    284301             f++;
     
    286303
    287304           case '0':
    288              nolinefeed=1;
     305             eos = TRUE;
    289306             f++;
    290307             break;
     
    293310             break;
    294311         }
    295        }
    296        else
    297        {
    298          ADD_TO_T(*f++)
     312       } else
     313       { /* '\n' or '\r' gets mapped to "\r\n" */
     314         if(*f == '\n' || *f == '\r')
     315         {
     316           ADD_TO_T('\r');
     317           ADD_TO_T('\n');
     318           if(*f++ == '\r' && *f == '\n')
     319             f++;
     320         } else
     321         {
     322           ADD_TO_T(*f++);
     323         }
    299324       }
    300325     }
    301326     *t='\0';
    302   }
    303 
    304   if (!nolinefeed)
    305   {
    306     /* add linefeed */
    307     if(t==target || t[-1]!='\n')
    308       ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */
    309327  }
    310328
     
    353371   LPSTR from,f;
    354372   DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK;
    355    DWORD nolinefeed = 0;
     373   BOOL  eos = FALSE;
    356374
    357375   dprintf(("KERNEL32: FormatMessageW(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
     
    405423   if (from) {
    406424      f=from;
    407       while (*f && !nolinefeed) {
     425      while (*f && !eos) {
    408426         if (*f=='%') {
    409427            int   insertnr;
     
    456474                  argliststart=(*(DWORD**)args)+insertnr-1;
    457475
    458                if (fmtstr[strlen(fmtstr)-1]=='s') {
     476               if (fmtstr[strlen(fmtstr)-1]=='s' && argliststart[0]) {
    459477                  DWORD                  xarr[3];
    460478
     
    471489
    472490                  /* CMF - This makes a BIG assumption about va_list */
    473                   O32_wvsprintf(sprintfbuf, fmtstr, (va_list) argliststart);
     491                  if (LoadwvsprintfA()) wvsprintfAProc(sprintfbuf,fmtstr,(va_list)argliststart);
    474492               }
    475493               x=sprintfbuf;
     
    481499               break;
    482500            case 'n':
    483                /* FIXME: perhaps add \r too? */
     501               ADD_TO_T('\r');
    484502               ADD_TO_T('\n');
    485503               f++;
    486504               break;
    487505            case '0':
    488                nolinefeed=1;
     506               eos = TRUE;
    489507               f++;
    490508               break;
     
    492510               break;
    493511
    494             }
    495          } else {
    496             ADD_TO_T(*f++)
    497          }
     512          }
     513        } else
     514        { /* '\n' or '\r' gets mapped to "\r\n" */
     515          if(*f == '\n' || *f == '\r')
     516          {
     517            ADD_TO_T('\r');
     518            ADD_TO_T('\n');
     519            if(*f++ == '\r' && *f == '\n')
     520              f++;
     521          } else
     522          {
     523            ADD_TO_T(*f++);
     524          }
     525        }
    498526      }
    499527      *t='\0';
    500    }
    501    if (!nolinefeed) {
    502        /* add linefeed */
    503        if(t==target || t[-1]!='\n')
    504       ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */
    505528   }
    506529   talloced = strlen(target)+1;
     
    521544#undef ADD_TO_T
    522545
     546
Note: See TracChangeset for help on using the changeset viewer.