int getContractedLength (unsigned int outputLimit) { int inputLength = scr.cols - ses->winx; wchar_t inputBuffer[inputLength]; int outputLength = outputLimit; unsigned char outputBuffer[outputLength]; readScreenText(ses->winx, ses->winy, inputLength, 1, inputBuffer); contractText(contractionTable, inputBuffer, &inputLength, outputBuffer, &outputLength, NULL, getContractedCursor()); return inputLength; }
static wchar_t * cpbReadScreen (size_t *length, int fromColumn, int fromRow, int toColumn, int toRow) { wchar_t *newBuffer = NULL; int columns = toColumn - fromColumn + 1; int rows = toRow - fromRow + 1; if ((columns >= 1) && (rows >= 1) && (beginOffset >= 0)) { wchar_t fromBuffer[rows * columns]; if (readScreenText(fromColumn, fromRow, columns, rows, fromBuffer)) { wchar_t toBuffer[rows * (columns + 1)]; wchar_t *toAddress = toBuffer; const wchar_t *fromAddress = fromBuffer; int row; for (row=fromRow; row<=toRow; row+=1) { int column; for (column=fromColumn; column<=toColumn; column+=1) { wchar_t character = *fromAddress++; if (iswcntrl(character) || iswspace(character)) character = WC_C(' '); *toAddress++ = character; } if (row != toRow) *toAddress++ = WC_C('\r'); } /* make a new permanent buffer of just the right size */ { size_t newLength = toAddress - toBuffer; if ((newBuffer = cpbAllocateCharacters(newLength))) { wmemcpy(newBuffer, toBuffer, (*length = newLength)); } } } } return newBuffer; }