Sidebar

Word Wrap Utility

General
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

OK, all you green-screen programmers out there, listen up! Today, we're going to discuss the dark cloud that hangs over all of your text-based applications. You know the ones I mean. They're the ones that rain broken words all across an otherwise-professional-looking program. When this storm breaks, it can destroy the appearance of a screen or document and cause the entire context of a phrase to change. For example, the sentence, "You are a doggedly persistent employee" could easily become, "You are a dog" when a word is broken inappropriately across two lines. Imagine reading that on your annual review!

This is the sort of thing PC programmers easily avoid by using common word wrap routines in their applications, something you probably thought would never be available to you. However, no longer is the word wrapping function confined to the PC world. Now, it is available for use with 5250 sessions, too.

This utility can be called from any application in which you need to equip a user with the ability to enter free-form text. When the word wrapper runs, it overlays your application's screens with a window that contains a 10-line subfile. If you pass a character literal to the program for the title, it is centered in the top of the window. At the bottom of the window, a counter keeps track of the current cursor page and line position.

With this function, your users can do real heads-down text entry, since they no longer need to worry about unnatural word breaks or need to press the field exit or Enter key to move to the next line. When they have filled 10 subfile lines, the screen automatically rolls to the next page, positioning the cursor correctly, even if the word wrapper must take the last word typed from the previous page and place it as the first word on the new page. When the user is finished with text entry, he simply presses the F3 key to end the program, which passes the formatted text back to the calling application. From there, your program can load the contents of the returned array into a database file, using the numeric counter passed back to your program to determine the number of times to loop through it. Now, you can print this data on a report or display it on a screen, and it will be perfectly formatted every time.

This utility consists of CLP program WW000C1 (Figure 1), display file WW000D1 (Figure 2), and RPG program WW000R1 (Figure 3). CLP program WW000C1 is included here merely to demonstrate how to call the RPG program and to provide you with a working example that you can use to try out the tool before you integrate it into your applications. In actual practice, you would probably embed the call to WW000R1 within another RPG or COBOL program.

When your application calls the word wrapper program WW000R1 (Figure 3), it will need to pass the program three parameters: an array 50 bytes long with 150 elements, a character string with a length of 56 characters, and a 15-digit packed-decimal field with five decimal places. The first parameter can be empty, or it can be loaded, prior to calling the word wrapper tool, with previously entered text if you want that text to be redisplayed. The second parameter can contain any text you want centered at the top of the word wrapper window to identify the content of the text being typed or displayed. The third parameter is used two ways: If this is the first call to the word wrapper from your application and the first parameter is empty, this field should be passed as a value of 1. If you are passing text to the word wrapper from some previous call, this field will contain the number of elements you are passing to the word wrapper program. In addition, when control returns to your program, this numeric field will contain the number of entries in the first parameter.

Some very ordinary housekeeping performed at program initiation performs the following:

o Centers any header text passed to it

o Clears and loads the subfile with any previously wrapped text you may have passed to this program

o Sets the cursor position in the footer of the word wrapper window

o Positions the cursor to the first row and column of the subfile window

Your user is presented with a window, overlaying the previous application, that contains a centered header that describes the content of the text he will type. In addition, if he has previously keyed anything for this particular record, that text will also be shown. If not, he will see 10 blank subfile lines upon which he may begin to enter data.

The CHECK(LC) and CHECK(ER) keywords are used on the subfile lines to allow the use of lowercase character entry and automatic record advance. When the cursor comes to the end of the line, that subfile line is read and its contents moved to the corresponding element of the input/output array TXT. It is at this point that the line is scrutinized to see if word wrapping should be performed.

The logic used to perform the word wrapping function is quite simple. It consists of some very ordinary RPG string operations. When subroutine WRDWRP begins, it initializes some work variables, including clearing array FTX. This array is used as a work area to temporarily store the formatted text.

The first test is to make sure that the current subfile line read is not blank. If it is empty, the program bypasses the word wrapping logic entirely. Otherwise, the input/output array TXT is moved to work array FTX. The value in the FTX element that is equal to the currently active

subfile line is moved to work variable STRING, which is the same length as the subfile line. The program then clears the FTX array element it just moved to STRING so that the FTX array can later be overwritten with the formatted data.

The last blank position in STRING is located by using the CHEKR op code, and that value is stored in R. I then search for the last nonblank position and store that value in variable LSTCHR. If the last nonblank character found is equal to the values of RMINS1 or ROWLEN, I want to reset the value in LSTCHR to be ROWLEN minus the position of the last blank position. This step is required to ensure that the word wraps properly when it begins in one of the last two positions on the line.

If there are characters at the end of the line, they need to be moved, or wrapped, to the next line. This is done by substringing the characters in variable STRING, beginning at the first position of the line and extending to the last blank position. (This is the reason for locating the last blank position earlier.) This substringed value is placed in work array FTX at the current element. If any characters did not get moved to FTX in that last operation, they are substringed into the first position of the next element of FTX. The number of characters to substring into that element is determined by subtracting from ROWLEN the value of the position of the last blank position from the previous line (the length of the subfile line). This formula gives the length of the number of characters to substring. That value is then subtracted from the value in RPLUS1 (the length of the subfile line plus 1). This is the position in variable STRING in which the characters that need to be moved to the next line begin. This information is then used to substring those characters into FTX at the next element. Finally, array FTX is moved to array TXT.

All that's left to do is build the footer literal to show the current cursor page and line position and to reposition the cursor and subfile page. The first part is accomplished by dividing the current active subfile line number by 10 (size of the subfile page) and adding 1 to it to get the next line number. The subfile record number is also incremented at this point. This new line number is then used in subroutine CURPOS along with some simple concatenation to build the footer literal.

Determining the next cursor position and positioning it to the correct subfile page is achieved by evaluating the current active subfile line. The line number is moved to a one-position numeric variable. If this value is 0, this is the last line of the 10-line subfile, so the cursor should be positioned on the first line of the next page. If it is anything other than 0, the cursor row position is incremented by 1. This positions the cursor on the correct line. To move it to the correct column, I add the value in LSTCHR (where I stored the last nonblank position of the previous line) to RELCOL (the relative position on the screen of the beginning of the subfile line) to get the new column number. This positions the cursor on the next column after the last character typed, even if that character was the last character on the previous line.

There are two final things to be aware of: First, the display file for the word wrapper window should be compiled with RSTDSP(*YES). You may or may not need to do the same with the display used by the calling application. You'll have to experiment with that.

Second, you should have the Typeahead (keyboard buffering) function turned on. Keyboard buffering can take one of two forms: *TYPEAHEAD (which tells the system to turn on the keyboard type ahead feature but not the Attention Key buffering) or *YES (which turns on both).

You can turn the function on by one of three methods:

o For the entire system, set system value QKBDBUF, specifying either *TYPEAHEAD or *YES.

o For individual user profiles, use the Change User Profile (CHGUSRPRF) command, setting parameter KBDBUF to either *TYPE- AHEAD or *YES.

o For the job level, call API QWSSETWS, passing it a parameter of 1 (which is the same as *TYPEAHEAD in the other options) or 2 (which is the same as *YES in the other options).

You can modify the size of the values used in this program. However, if you decide to change these values, you should be aware of the following:

Any reference to the length of the subfile line, which is currently 50, will need to be modified if you change it. This includes the arrays TXT, FTX, and variable STRING. For convenience, variables ROWLEN, RPLUS1, and RMINS1 are initialized with the values of 50, 51, and 49 in the INIT subroutine and then referenced throughout the text to determine row length, row length plus one, and row length minus one.

If you increase or decrease the number of elements in the input/output array TXT, you will also need to reflect those changes in array FTX, as well as change the subfile size parameter in the accompanying DDS. You should also be aware that the logic for determining the next cursor row is based on a 10-line subfile. If you change the size of the subfile page, you must modify this area as well.

If you change the column or row where the subfile is displayed, you must modify variables RELROW and RELCOL. Currently, these values are initialized at 11 and 15 in the INIT subroutine.

Indicator 03 is an arbitrary choice on my part to use for updating the text and closing out the program. You could easily expand this functionality by adding separate indicators for updating, deleting, and exiting.

That's it! Wasn't that simple? OK then, it's time for you to get this tool into production and start basking in the praise that will be heaped upon you by a multitude of satisfied users. You will no longer have to hide in your cubicle because your users' text looks like someone chopped it up with scissors. Now, you can finally walk to the break room for coffee with your head held high, instead of waiting till everyone else in the building has gone to a meeting.

Shannon O'Donnell is a technical editor for Midrange Computing and a senior consultant with Computer Application Solutions, Inc. in Springfield, Illinois. He can be reached at This email address is being protected from spambots. You need JavaScript enabled to view it..

Figure 1: CLP program WW000C1 shows how to pass the 550 X 50 byte array and title to the utility

/*==================================================================*/

/* To compile: */
/* CRTCLPGM PGM(XXX/WW000C1) SRCFILE(XXX/QCLSRC) */
/* */
/* This CL is used as an example of how to call the Wordwrap Tool. */

/*==================================================================*/

PGM

DCL VAR(&TXT) TYPE(*CHAR) LEN(7500)
DCL VAR(&HDRLIT) TYPE(*CHAR) LEN(56) VALUE('Word +

Wrap Utility')
DCL VAR(&CNTR) TYPE(*DEC) LEN(15 5) VALUE(1)

CALL PGM(WW000R1) PARM(&TXT &HDRLIT &CNTR)

ENDPGM A*****************************************************************
A* To Compile:
A* CRTDSPF FILE(XXX/WW000D1) SRCFILE(XXX/QDDSSRC) RSTDSP(*YES)
A*****************************************************************
A DSPSIZ(24 80 *DS3)

A CF03(03 'EXIT/SAVE')
A PRINT
A R S1SFL SFL
A TEXT 50A B 11 15CHECK(ER)

A CHECK(LC)
A11 12' '

A DSPATR(RI)
A11 67' '

A DSPATR(RI)
A R C1SFL SFLCTL(S1SFL)
A SFLSIZ(0150)
A SFLPAG(0010)
A 82 SFLDSP
A 81 SFLDSPCTL
A 80 SFLINZ
A SFLCSRRRN(&SRRN)
A CSRLOC(XROW XCOL)
A OVERLAY
A RECPOS 4S 0H SFLRCDNBR(CURSOR)
AXROW 3S 0H
AXCOL 3S 0H
ASRRN 5S 0H
A HDRTXT 56 O 10 12DSPATR(RI)

A R C1FTR
A OVERLAY
A FTRTXT 56 O 21 12DSPATR(RI)
A R DUMMY
A ASSUME
A DMYFLD 1A B 2 2DSPATR(PR) *****************************************************************

*

* To Compile: CRTRPGPGM PGM(XXX/WW000R1) SRCFILE(XXX/QRPGSRC)
*

*****************************************************************

FWW000D1 CF E WORKSTN
F RRN KSFILE S1SFL

*E TXT 150 50 Input Text To FMT
E FTX 150 50 Formatted Text
E HC 56 1 Header Text Cntrd
E HU 56 1 Header Txt Uncntd
*I 'ABCDEFGHIJKLMNOPQRS- C VC
I 'TUVWXYZabcdefghijkl-
I 'mnopqrstuvwxyz01234-
I '567890`!@#$%^&*()_I

Figure 2: Display file WW000D1 is the pop-up window

Figure 3: RPG program WW000R1 is the word wrap window driver and word wrap utility all in one

Shannon O'Donnell
Shannon O'Donnell has held a variety of positions, most of them as a consultant, in dozens of industries. This breadth of experience gives him insight into multiple aspects of how the AS/400 is used in the real world. Shannon continues to work as a consultant. He is an IBM Certified Professional--AS/400 RPG Programmer and the author of an industry-leading certification test for RPG IV programmers available from ReviewNet.net.
 
BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

RESOURCE CENTER

  • WHITE PAPERS

  • WEBCAST

  • TRIAL SOFTWARE

  • White Paper: Node.js for Enterprise IBM i Modernization

    SB Profound WP 5539

    If your business is thinking about modernizing your legacy IBM i (also known as AS/400 or iSeries) applications, you will want to read this white paper first!

    Download this paper and learn how Node.js can ensure that you:
    - Modernize on-time and budget - no more lengthy, costly, disruptive app rewrites!
    - Retain your IBM i systems of record
    - Find and hire new development talent
    - Integrate new Node.js applications with your existing RPG, Java, .Net, and PHP apps
    - Extend your IBM i capabilties to include Watson API, Cloud, and Internet of Things


    Read Node.js for Enterprise IBM i Modernization Now!

     

  • Profound Logic Solution Guide

    SB Profound WP 5539More than ever, there is a demand for IT to deliver innovation.
    Your IBM i has been an essential part of your business operations for years. However, your organization may struggle to maintain the current system and implement new projects.
    The thousands of customers we've worked with and surveyed state that expectations regarding the digital footprint and vision of the companyare not aligned with the current IT environment.

    Get your copy of this important guide today!

     

  • 2022 IBM i Marketplace Survey Results

    Fortra2022 marks the eighth edition of the IBM i Marketplace Survey Results. Each year, Fortra captures data on how businesses use the IBM i platform and the IT and cybersecurity initiatives it supports.

    Over the years, this survey has become a true industry benchmark, revealing to readers the trends that are shaping and driving the market and providing insight into what the future may bring for this technology.

  • Brunswick bowls a perfect 300 with LANSA!

    FortraBrunswick is the leader in bowling products, services, and industry expertise for the development and renovation of new and existing bowling centers and mixed-use recreation facilities across the entertainment industry. However, the lifeblood of Brunswick’s capital equipment business was running on a 15-year-old software application written in Visual Basic 6 (VB6) with a SQL Server back-end. The application was at the end of its life and needed to be replaced.
    With the help of Visual LANSA, they found an easy-to-use, long-term platform that enabled their team to collaborate, innovate, and integrate with existing systems and databases within a single platform.
    Read the case study to learn how they achieved success and increased the speed of development by 30% with Visual LANSA.

     

  • Progressive Web Apps: Create a Universal Experience Across All Devices

    LANSAProgressive Web Apps allow you to reach anyone, anywhere, and on any device with a single unified codebase. This means that your applications—regardless of browser, device, or platform—instantly become more reliable and consistent. They are the present and future of application development, and more and more businesses are catching on.
    Download this whitepaper and learn:

    • How PWAs support fast application development and streamline DevOps
    • How to give your business a competitive edge using PWAs
    • What makes progressive web apps so versatile, both online and offline

     

     

  • The Power of Coding in a Low-Code Solution

    LANSAWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed.
    Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

    • Discover the benefits of Low-code's quick application creation
    • Understand the differences in model-based and language-based Low-Code platforms
    • Explore the strengths of LANSA's Low-Code Solution to Low-Code’s biggest drawbacks

     

     

  • Why Migrate When You Can Modernize?

    LANSABusiness users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.
    In this white paper, you’ll learn how to think of these issues as opportunities rather than problems. We’ll explore motivations to migrate or modernize, their risks and considerations you should be aware of before embarking on a (migration or modernization) project.
    Lastly, we’ll discuss how modernizing IBM i applications with optimized business workflows, integration with other technologies and new mobile and web user interfaces will enable IT – and the business – to experience time-added value and much more.

     

  • UPDATED: Developer Kit: Making a Business Case for Modernization and Beyond

    Profound Logic Software, Inc.Having trouble getting management approval for modernization projects? The problem may be you're not speaking enough "business" to them.

    This Developer Kit provides you study-backed data and a ready-to-use business case template to help get your very next development project approved!

  • What to Do When Your AS/400 Talent Retires

    FortraIT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators is small.

    This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn:

    • Why IBM i skills depletion is a top concern
    • How leading organizations are coping
    • Where automation will make the biggest impact

     

  • Node.js on IBM i Webinar Series Pt. 2: Setting Up Your Development Tools

    Profound Logic Software, Inc.Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application. In Part 2, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Attend this webinar to learn:

    • Different tools to develop Node.js applications on IBM i
    • Debugging Node.js
    • The basics of Git and tools to help those new to it
    • Using NodeRun.com as a pre-built development environment

     

     

  • Expert Tips for IBM i Security: Beyond the Basics

    SB PowerTech WC GenericIn this session, IBM i security expert Robin Tatam provides a quick recap of IBM i security basics and guides you through some advanced cybersecurity techniques that can help you take data protection to the next level. Robin will cover:

    • Reducing the risk posed by special authorities
    • Establishing object-level security
    • Overseeing user actions and data access

    Don't miss this chance to take your knowledge of IBM i security beyond the basics.

     

     

  • 5 IBM i Security Quick Wins

    SB PowerTech WC GenericIn today’s threat landscape, upper management is laser-focused on cybersecurity. You need to make progress in securing your systems—and make it fast.
    There’s no shortage of actions you could take, but what tactics will actually deliver the results you need? And how can you find a security strategy that fits your budget and time constraints?
    Join top IBM i security expert Robin Tatam as he outlines the five fastest and most impactful changes you can make to strengthen IBM i security this year.
    Your system didn’t become unsecure overnight and you won’t be able to turn it around overnight either. But quick wins are possible with IBM i security, and Robin Tatam will show you how to achieve them.

  • Security Bulletin: Malware Infection Discovered on IBM i Server!

    SB PowerTech WC GenericMalicious programs can bring entire businesses to their knees—and IBM i shops are not immune. It’s critical to grasp the true impact malware can have on IBM i and the network that connects to it. Attend this webinar to gain a thorough understanding of the relationships between:

    • Viruses, native objects, and the integrated file system (IFS)
    • Power Systems and Windows-based viruses and malware
    • PC-based anti-virus scanning versus native IBM i scanning

    There are a number of ways you can minimize your exposure to viruses. IBM i security expert Sandi Moore explains the facts, including how to ensure you're fully protected and compliant with regulations such as PCI.

     

     

  • Encryption on IBM i Simplified

    SB PowerTech WC GenericDB2 Field Procedures (FieldProcs) were introduced in IBM i 7.1 and have greatly simplified encryption, often without requiring any application changes. Now you can quickly encrypt sensitive data on the IBM i including PII, PCI, PHI data in your physical files and tables.
    Watch this webinar to learn how you can quickly implement encryption on the IBM i. During the webinar, security expert Robin Tatam will show you how to:

    • Use Field Procedures to automate encryption and decryption
    • Restrict and mask field level access by user or group
    • Meet compliance requirements with effective key management and audit trails

     

  • Lessons Learned from IBM i Cyber Attacks

    SB PowerTech WC GenericDespite the many options IBM has provided to protect your systems and data, many organizations still struggle to apply appropriate security controls.
    In this webinar, you'll get insight into how the criminals accessed these systems, the fallout from these attacks, and how the incidents could have been avoided by following security best practices.

    • Learn which security gaps cyber criminals love most
    • Find out how other IBM i organizations have fallen victim
    • Get the details on policies and processes you can implement to protect your organization, even when staff works from home

    You will learn the steps you can take to avoid the mistakes made in these examples, as well as other inadequate and misconfigured settings that put businesses at risk.

     

     

  • The Power of Coding in a Low-Code Solution

    SB PowerTech WC GenericWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed.
    Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

    • Discover the benefits of Low-code's quick application creation
    • Understand the differences in model-based and language-based Low-Code platforms
    • Explore the strengths of LANSA's Low-Code Solution to Low-Code’s biggest drawbacks

     

     

  • Node Webinar Series Pt. 1: The World of Node.js on IBM i

    SB Profound WC GenericHave you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application.
    Part 1 will teach you what Node.js is, why it's a great option for IBM i shops, and how to take advantage of the ecosystem surrounding Node.
    In addition to background information, our Director of Product Development Scott Klement will demonstrate applications that take advantage of the Node Package Manager (npm).
    Watch Now.

  • The Biggest Mistakes in IBM i Security

    SB Profound WC Generic The Biggest Mistakes in IBM i Security
    Here’s the harsh reality: cybersecurity pros have to get their jobs right every single day, while an attacker only has to succeed once to do incredible damage.
    Whether that’s thousands of exposed records, millions of dollars in fines and legal fees, or diminished share value, it’s easy to judge organizations that fall victim. IBM i enjoys an enviable reputation for security, but no system is impervious to mistakes.
    Join this webinar to learn about the biggest errors made when securing a Power Systems server.
    This knowledge is critical for ensuring integrity of your application data and preventing you from becoming the next Equifax. It’s also essential for complying with all formal regulations, including SOX, PCI, GDPR, and HIPAA
    Watch Now.

  • Comply in 5! Well, actually UNDER 5 minutes!!

    SB CYBRA PPL 5382

    TRY the one package that solves all your document design and printing challenges on all your platforms.

    Produce bar code labels, electronic forms, ad hoc reports, and RFID tags – without programming! MarkMagic is the only document design and print solution that combines report writing, WYSIWYG label and forms design, and conditional printing in one integrated product.

    Request your trial now!

  • Backup and Recovery on IBM i: Your Strategy for the Unexpected

    FortraRobot automates the routine tasks of iSeries backup and recovery, saving you time and money and making the process safer and more reliable. Automate your backups with the Robot Backup and Recovery Solution. Key features include:
    - Simplified backup procedures
    - Easy data encryption
    - Save media management
    - Guided restoration
    - Seamless product integration
    Make sure your data survives when catastrophe hits. Try the Robot Backup and Recovery Solution FREE for 30 days.

  • Manage IBM i Messages by Exception with Robot

    SB HelpSystems SC 5413Managing messages on your IBM i can be more than a full-time job if you have to do it manually. How can you be sure you won’t miss important system events?
    Automate your message center with the Robot Message Management Solution. Key features include:
    - Automated message management
    - Tailored notifications and automatic escalation
    - System-wide control of your IBM i partitions
    - Two-way system notifications from your mobile device
    - Seamless product integration
    Try the Robot Message Management Solution FREE for 30 days.

  • Easiest Way to Save Money? Stop Printing IBM i Reports

    FortraRobot automates report bursting, distribution, bundling, and archiving, and offers secure, selective online report viewing.
    Manage your reports with the Robot Report Management Solution. Key features include:

    - Automated report distribution
    - View online without delay
    - Browser interface to make notes
    - Custom retention capabilities
    - Seamless product integration
    Rerun another report? Never again. Try the Robot Report Management Solution FREE for 30 days.

  • Hassle-Free IBM i Operations around the Clock

    SB HelpSystems SC 5413For over 30 years, Robot has been a leader in systems management for IBM i.
    Manage your job schedule with the Robot Job Scheduling Solution. Key features include:
    - Automated batch, interactive, and cross-platform scheduling
    - Event-driven dependency processing
    - Centralized monitoring and reporting
    - Audit log and ready-to-use reports
    - Seamless product integration
    Scale your software, not your staff. Try the Robot Job Scheduling Solution FREE for 30 days.