Word wrap bahasa C


Suatu saat saya mencari snippet fungsi word wrap di terminal/console untuk bahasa C namun tidak ada yang memuaskan, tidak bisa untuk kalimat yang terdapat new line lah, tidak bisa untuk kalimat yang tanpa spasi lah, dll.

Akhirnya fungsi ini saya buat sendiri. Barangkali ada yang sedang mencari fungsi word wrap menggunakan bahasa pemrograman C bisa mengambil snippet ini dengan syarat mencantumkan copyright-nya ya. Jika ada bug silahkan laporkan :-)

/*******************************************************************************
 * Fungsi word wrap untuk terminal. Dicoba di OS Linux, untuk OS lain silahkan
 * modifikasi sendiri.
 * Copyright (c) 2015 kaharman <[email protected]>
 *
 * Silahkan gunakan dengan bebas dengan syarat mencantumkan copyright
 ******************************************************************************/

#include 
#include 

size_t wordWrap(char *output,
                size_t maxOutputLen,
                const char *input,
                size_t lineWidth)
{
    char lineBuffer[134];
    unsigned int posInput, posOutput;
    unsigned int i, potLineFeed;

    if (lineWidth > 132)
    {
        lineWidth = 132;
    }

    if (maxOutputLen <= lineWidth)
    {
        strncpy(output, input, maxOutputLen);
        return maxOutputLen;
    }

    if (strlen(input) < lineWidth)
    {
        strncpy(output, input, strlen(input));
        return strlen(input);
    }

    posInput = 0;
    posOutput = 0;
    while (posOutput < maxOutputLen)
    {
        memset(lineBuffer, 0, sizeof(lineBuffer));
        strncpy(lineBuffer, input + posInput, lineWidth + 1);
        potLineFeed = 0;
        if (lineWidth > strlen(lineBuffer))
        {
            if (posOutput + (strlen(lineBuffer)) > maxOutputLen)
            {
                strncat(output, lineBuffer, (maxOutputLen - posOutput));
                posOutput += (unsigned int) (maxOutputLen - posOutput - 1);
            }
            else
            {
                strncat(output, lineBuffer, strlen(lineBuffer));
                posOutput += (unsigned int) strlen(lineBuffer);
            }
            return posOutput;
        }
        for (i = 0; i < lineWidth; i++)
        {
            if ((lineBuffer[i] == ' ') || (lineBuffer[i] == '\n'))
            {
                potLineFeed = i;
            }
            else if (lineBuffer[i] == '-')
            {
                potLineFeed = i + 1;
            }
        }
        if (potLineFeed)
        {
            strncat(output, lineBuffer, potLineFeed);
            posInput += potLineFeed;
            posOutput += potLineFeed;
        }
        else
        {
            if (posOutput + lineWidth > maxOutputLen)
            {
                strncat(output, lineBuffer, (maxOutputLen - posOutput));
                posInput += (unsigned int) lineWidth;
                posOutput += (unsigned int) (maxOutputLen - posOutput - 1);
            }
            else
            {
                strncat(output, lineBuffer, lineWidth);
                posInput += (unsigned int) lineWidth;
                posOutput += (unsigned int) lineWidth;
            }
        }
        if (input[posInput] == ' ')
        {
            posInput++;
        }
        posOutput++;
        strncat(output, "\n", 1);
    }

    return posOutput;
}

int main(int argc,
         char **argv)
{
    size_t retVal = 0;
    unsigned int lineWidth = 49;
    char buffer[1024];

    char string1[] = "Test kalimat pendek.";
    char string2[] = "Test kalimat agak panjang, lebih dari 49 karakter, supaya dapet word wrap;";
    char string3[] = "Test kalimat agak panjang yang memiliki karakter dash untuk kata berulang seperti kupu-kupu, kura-kura, lumba-lumba, dll.";
    char string4[] = "Testkalimatyangtidakmempunyaispasisamasekali,bagaimanacarauntukmemotongnya?";
    char string5[] = "Kalauiniadalahkalimatyangtidakadaspasinyauntuksatubaris dan baris lainnya memiliki spasi dan line feed original.\nDua-duanya harus bisa ditangani.\n\nOke!";
    char string6[] = "Test kalimat agak panjang yang memiliki karakter dash untuk kata berulang seperti kupu-kupu, kura-kura, lumba-lumba, dll. Test kalimat agak panjang yang memiliki karakter dash untuk kata berulang seperti kupu-kupu, kura-kura, lumba-lumba, dll.";

    memset(buffer, 0, sizeof(buffer));
    retVal = wordWrap(buffer, sizeof(buffer), string1, lineWidth);
    printf("retVal 1 = %d\n", retVal);
    if (retVal > 0)
    {
        printf("%s\n", buffer);
    }
    printf("\n");
    memset(buffer, 0, sizeof(buffer));
    retVal = wordWrap(buffer, sizeof(buffer), string2, lineWidth);
    printf("retVal 2 = %zu\n", retVal);
    if (retVal > 0)
    {
        printf("%s\n", buffer);
    }
    printf("\n");
    memset(buffer, 0, sizeof(buffer));
    retVal = wordWrap(buffer, sizeof(buffer), string3, lineWidth);
    printf("retVal 3 = %zu\n", retVal);
    if (retVal > 0)
    {
        printf("%s\n", buffer);
    }
    printf("\n");
    memset(buffer, 0, sizeof(buffer));
    retVal = wordWrap(buffer, sizeof(buffer), string4, lineWidth);
    printf("retVal 4 = %zu\n", retVal);
    if (retVal > 0)
    {
        printf("%s\n", buffer);
    }
    printf("\n");
    memset(buffer, 0, sizeof(buffer));
    retVal = wordWrap(buffer, sizeof(buffer), string5, lineWidth);
    printf("retVal 5 = %zu\n", retVal);
    if (retVal > 0)
    {
        printf("%s\n", buffer);
    }
    printf("\n");
    memset(buffer, 0, sizeof(buffer));
    retVal = wordWrap(buffer, sizeof(buffer), string6, 150);
    printf("retVal 6 = %zu\n", retVal);
    if (retVal > 0)
    {
        printf("%s\n", buffer);
    }
    printf("\n");

    return 0;
}