From Newsgroup: comp.lang.xharbour
I can't compile it and I don't know much about C, but after talking to chatgpt, he generated this in the PP_NextLine function of the pp.c file:
int PP_NextLine(FILE *pPPO, char *sLine, PARSER_CONTEXT *Parser_pContext)
{
char cChar, cLastChar = 0;
char *pSemiColon = NULL;
char cTerminator = 0;
PP_iLineLen = 0;
while ((cChar = getc(Parser_pContext->Files.pLast->hFile)) != EOF)
{
if (Parser_pContext->iLine && (Parser_pContext->iLine % 100) ==
0 && Parser_pContext->bMute == FALSE)
{
printf("\r%i", Parser_pContext->iLine);
fflush(stdout);
}
// printf( "Pos: %i, Char: %c pSemiColon: %p\n", PP_iLineLen,
cChar, pSemiColon );
if (cChar == '\n')
{
Parser_pContext->iLine = ++Parser_pContext->Files.pLast->iLine;
while (PP_iLineLen && isspace(PP_LineBuffer[--PP_iLineLen]))
{
}
if (PP_iLineLen == 0)
{
continue;
}
if (PP_LineBuffer[PP_iLineLen] == ';')
{
// Override the semi colon and continue with next line.
// printf( "Continue after ';' at: %i\n", PP_iLineLen );
pSemiColon = NULL;
continue;
}
++PP_iLineLen;
PP_LineBuffer[PP_iLineLen++] = '\n';
break;
}
else if (cTerminator == 0 && pSemiColon == NULL && cChar == ';')
{
pSemiColon = PP_LineBuffer + PP_iLineLen;
cLastChar = cChar;
}
else if (cTerminator == 0 && pSemiColon && !isspace(cChar))
{
ungetc(cChar, Parser_pContext->Files.pLast->hFile);
while (PP_LineBuffer[--PP_iLineLen] != ';')
{
ungetc(PP_LineBuffer[PP_iLineLen], Parser_pContext->Files.pLast->hFile);
}
PP_LineBuffer[PP_iLineLen++] = '\n';
break;
}
else
{
if (cTerminator)
{
if (cChar == cTerminator)
{
cTerminator = 0;
cLastChar = cChar;
}
}
else
{
if (cChar == '"')
{
cTerminator = '"';
}
else if (cChar == '\'')
{
cTerminator = '\'';
}
else if (cChar == '[')
{
BOOL bLiteral = FALSE;
/* Regra original: '[' depois de char n|uo
alfanum|-rico e n|uo pertencendo a ")]}.\"'" */
if (!isalnum(cLastChar) && strchr(")]}.\"'",
cLastChar) == NULL)
{
bLiteral = TRUE;
}
else
{
/* NOVO: tratar 'RETURN [ ... ]' como literal
entre colchetes */
int i = 0, j = 0;
char kw[7] = {0};
/* pula espa|oos do in|!cio da linha */
while (i < PP_iLineLen &&
isspace(PP_LineBuffer[i]))
i++;
/* l|- at|- 6 letras em mai||sculo para comparar
com "RETURN" */
while (i < PP_iLineLen &&
j < 6 &&
isalpha(PP_LineBuffer[i]))
{
kw[j++] = (char)toupper(PP_LineBuffer[i]);
i++;
}
if (j == 6 && memcmp(kw, "RETURN", 6) == 0)
{
/* entre o fim de RETURN e o '[' atual s||
pode ter espa|oo */
while (i < PP_iLineLen && isspace(PP_LineBuffer[i]))
i++;
if (i == PP_iLineLen)
{
/* a linha |- basicamente "RETURN [..."; tratamos como literal */
bLiteral = TRUE;
}
}
}
if (bLiteral)
{
cTerminator = ']';
}
else if (!isspace(cChar))
{
cLastChar = cChar;
}
}
else if (!isspace(cChar))
{
cLastChar = cChar;
}
}
}
PP_LineBuffer[PP_iLineLen++] = cChar;
}
// printf( "Len: %i\n", PP_iLineLen );
if (PP_iLineLen)
{
strncpy(sLine, PP_LineBuffer, PP_iLineLen);
sLine[PP_iLineLen] = '\0';
// printf( "Source: >%s<\n", sLine );
}
else
{
// printf( "EOF!\n" );
}
return PP_iLineLen;
}
Em 25/11/2025 07:53, Enrico Maria Giordano escreveu:
Somebody could help me to fix this bug?
FUNCTION MAIN()
-a-a-a ? TEST1(), "< /b>" $ TEST1(), LEN( TEST1() )
-a-a-a ? TEST2(), "< /b>" $ TEST2(), LEN( TEST2() )
-a-a-a ? [</b>], "< /b>" $ [</b>], LEN( [</b>] )
-a-a-a INKEY( 0 )
-a-a-a RETURN NIL
STATIC FUNCTION TEST1()
-a-a-a RETURN [</b>]
STATIC FUNCTION TEST2()
-a-a-a LOCAL cStr := [</b>]
-a-a-a RETURN cStr
Result:
< /b> .T.-a-a-a-a-a-a-a-a-a 5
</b> .F.-a-a-a-a-a-a-a-a-a 4
</b> .F.-a-a-a-a-a-a-a-a-a 4
Expected:
</b> .F.-a-a-a-a-a-a-a-a-a 4
</b> .F.-a-a-a-a-a-a-a-a-a 4
</b> .F.-a-a-a-a-a-a-a-a-a 4
--- Synchronet 3.21a-Linux NewsLink 1.2