Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Text Parsen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.06.2005, 15:03 Uhr
~xleave
Gast


Guten Tag liebes Forum!

Ich habe ein mittleres Problem. Und zwar schreibe ich eine Funktion im Windows Drucker System um. Dazu verwende ich routinen aus dem Windows DDK. Mein Problem ist einfach, dass ich noch nicht lange mit C schreibe.

Die Funktion wird vom Spooler mehrmals mit einem Buffer und dessen größe aufgerufen. In diesem Buffer steht ein PostScript Text. Dieser Buffer ist ein einfaches Byte Array und ich bekomme den LPBYTE und die größe cbBuf.


C++:
LangMonWritePort(
    IN  HANDLE  hPort,
    IN  LPBYTE  pBuffer,
    IN  DWORD   cbBuf,
    IN  LPDWORD pcbWritten
)



Nun möchte ich diesen Buffer durchsuchen und Teilen. Ich muss so lange bis ich zb. "%%Page:" gefunden habe, den Buffer als Teil zwischenspeichern (Prolog). Die Position von "%%Page:" muss ich auch speichern, und zwar als ersten Seitenstart.
Dann muss ich weiter suchen bis ich ein "%%PageTrailer" gefunden habe.
Dann muss ich den Prolog, den buffer ab %%Page: bis %%PageTrailer und noch zusätzlich einen kleinen String wegschreiben. Das ganze so lange wiederholen bis ich kein %%Page: mehr finden kann.

Im groben und ganzen soll diese Funktion einen Postscript Druckjob zerteilen in Prolog(header), N Seiten, und Footer. Die Funktion soll dann für jede Seite einzelnd Header, Seite X und Footer wegschreiben.


Kann mir hier jemand unter die Arme greifen? Ich checks echt überhaupt nicht.


C++:
BOOL
WINAPI
LangMonWritePort(
    IN  HANDLE  hPort,
    IN  LPBYTE  pBuffer,
    IN  DWORD   cbBuf,
    IN  LPDWORD pcbWritten
)
/*++

Routine Description:
    Language monitor WritePort

Arguments:
    hPort           : Port handle
    pBuffer         : Data Buffer
    cbBuf           : Buffer size
    pcbRead         : Pointer to the variable to return written count

Return Value:
    TRUE on success, FALSE on error

--*/

{
    PINIPORT    pIniPort        = (PINIPORT)((INIPORT *)hPort);
    BOOL        ret                = FALSE;
    LPBYTE        pBufferTemp        = NULL;
    FILE        *pPimml            = NULL;


        /* ???? */

    ret = (*pIniPort->fn.pfnWritePort)(pIniPort->hPort, pBuffer, cbBuf, pcbWritten);
  
    if ( ret ) {
        pIniPort->status &= ~PP_WRITE_ERROR;
    } else {
        pIniPort->status |= PP_WRITE_ERROR;
    }

    return ret;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2005, 17:08 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich würde dafür std::string verwenden... da gibts ne funktion find mit der sollte sich das mehr oder weniger einfach basteln lassen... mit hilfe der forensuche bekommst du da bestimmt auch ein paar beispiele zu...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.06.2005, 10:35 Uhr
~xleave
Gast


Ja danke für den Tip!

Ich habe den Code auch schon mal fertig gemacht nur dann bemerkt, dass die <string> ja für C++ ist. Da ich den Code aber als Treiber compile, muss ich einen speziellen C compiler von MS nutzen. Also leider keine std::string klasse verfügbar. Hast du vielleicht noch nen anderen Tip?

Ich hab hier auch mal den Source. Konnte es wie gesagt auch leider noch nicht testen. Macht das so Sinn?


C++:
BOOL WINAPI LangMonWritePort(
    IN  HANDLE  hPort,
    IN  LPBYTE  pBuffer,
    IN  DWORD   cbBuf,
    IN  LPDWORD pcbWritten
)
{
    PINIPORT    pIniPort        = (PINIPORT)((INIPORT *)hPort);
    BOOL        ret                = FALSE;
    LPBYTE        pBufferTemp        = NULL;
    string        strBufferTemp    = "",
            strBufferTemp2    = "";
    int            pos                = 0,
            pos2            = 0;

    strBufferTemp = pBuffer;

    if(!bDocPrologSaved) {

        pos = strBufferTemp.find("%%Page:",0);

        if(pos != -1) {
            // nicht gefunden, also den ganzen string dranhaengen
            strPrologBuffer.append(strBufferTemp);
        }
        else {
            // nur bis zur gefundenen Position-1
            pos = pos - 1
            strPrologBuffer.append(strBufferTemp.substr(0,pos));
            bDocPrologSaved = TRUE;
        }
    }


    if(bDocPrologSaved) {
        // Prolog schon gefunden und gespeichert. Also die Seiten rausknallen

        if(!bDocInPage) {
            // erst nach %%Page: suchen, von der Posi dann wegspeichern
            // bis %%PageTrailer gefunden

            pos = strBufferTemp.find("%%Page:",0);

            if(pos != -1) {
                bDocInPage = TRUE;
            }
        }

        if(bDocInPage) {
            // wir haben den anfang noch im buffer, wir suchen noch %%PageTrailer

            pos2 = strBufferTemp.find("%%PageTrailer",0);

            if(pos2 != -1) {
                // alles klar, nun ist auch PageTrailer da, seite kann rausgehen
                
                strBufferTemp2 = strPrologBuffer + strBufferTemp.substr(pos, pos2) + strPageFooter;

                ret = (*pIniPort->fn.pfnWritePort)(pIniPort->hPort, strBufferTemp2.c_str, strBufferTemp2.size(), pcbWritten);
                bDocInPage = FALSE;
            }
            else {
                // endposition noch nicht da, erst wegspeichern und nächste mal schauen
                    
                strPageBuffer.append(strBufferTemp.substr(pos, strBufferTemp.size());
                ret = 1;
            }
        }
    }


/*
    ret = (*pIniPort->fn.pfnWritePort)(pIniPort->hPort, pBuffer, cbBuf, pcbWritten);
*/
    
    if ( ret ) {
        pIniPort->status &= ~PP_WRITE_ERROR;
    } else {
        pIniPort->status |= PP_WRITE_ERROR;
    }

    return ret;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.06.2005, 16:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Wenns in c sein soll kannst du mit strstr suchen...
Wenn du dazwischen Teile vom string wegschmeisst könntest du einfach dort immer nulltermineren und dir jeweils mit einem zeiger merken wo welcher part gerade ist und umgehst dann damit das Problem wilder Allokiererei
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: