23
Mon, Dec
1 New Articles

Practical CL: The 32-Character Solution

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

Since the System/38, we've had to deal with the implied 32-byte length of character parameters on the command line; this article provides the workarounds.

 

It doesn't matter where I'm working, how skilled the staff is, whether it's new development or mature legacy systems, it never fails that every couple of years I come across the old (and I do mean old) 32-character limitations on character parameters passed from the command line. It's a simple issue, really, but one that still manages to confound us. It may be the greatest example in our community of how those who cannot learn from history (or steal from those who have!) are doomed to repeat it.

What's the Problem?

The problem is simple. Take a program that expects parameters. Call that program from another program. Everything is wonderful! Typically, the system will just pass an address from one program to the other, and as long as the parameters are the same in both size and type on the two machines, everybody is happy. Even in these more modern days of prototypes and keywords like CONST, the compiler knows the size of the parameter, so it creates a variable of the correct size, and the call proceeds apace.

 

However, when you call a program from the command line, the command line has no way of knowing the size of the parameters in the called program. In that case, it creates a temporary variable, but it follows some set rules that were established back in the dawn of time. One of those rules is for character literals. Call a program this way:

 

CALL PGM(MYPGM) PARMS('HELLO')

 

The system will parse out the string HELLO and put it into a temporary variable. The size of the variable is either the size of the actual typed literal or 32, whichever is greater. Why 32? We don't know for certain, but if you really want to know, you can ask Wayne Evans; he wrote that portion of the code. In any event, 32 is the magic number. So why is this a problem?

 

Most of the time it isn't! If your parameter is 32 characters in length or less, the system will create a 32-character field and stuff your literal into it. The address of that temporary variable will be passed to the called program, and everything will be fine. The problem is when your parameter is longer than 32 characters. If you pass less than that (that is, one or more of the rightmost characters of your parameter are blank), then you will have a problem. In the case above, if the first parameter is 32 characters or less, you're fine. But if the first parameter is 50 characters, you end up with the situation shown in Figure 1.

                       

110712PlutaImage1

Figure 1: If you enter a short parameter on the command line, it gets padded to only 32 characters.

 

As you can see, the first 32 characters are just fine. But the contents of the last 18 characters are unknown and in fact are likely to contain garbage, certainly not the blanks that you would expect or need. Now, you can get around this on a command line call by specifying the extra blanks. In this case, simply enclose the parameter value (HELLO) in quotes after being sure to follow it by 45 blanks. Counting out 45 blanks can be a pain, but if you're careful it will work.

Unless You're Submitting

I always remember the information in the preceding paragraphs. And yet I still end up stubbing my toe on this next bit, the submit. More specifically, the SBMJOB command. Take a look at the following simple program.

 

SBM001:     PGM       &PARM

             DCL       &PARM *CHAR 50

 

             DCL       &USER *CHAR 10

             DCL        &JOBTYPE *CHAR 1

             RTVJOBA   USER(&USER) TYPE(&JOBTYPE)

 

             IF         (&JOBTYPE *EQ '1') DO

               SBMJOB     CMD(CALL PGM(SBM001) PARM(&PARM))

               RETURN

             ENDDO

 

             SNDMSG     MSG('SBM001: [' *CAT &PARM *CAT ']') TOUSR(&USER)

             ENDPGM  

 

The code above shows the ubiquitous self-submitting CL. If you've never seen this before, you might want to take a brief peek. The program retrieves the job type using the RTVJOBA command. A value of '1' indicates that this is an interactive job, so the program submits a call to itself using the parameter that was passed in and then exits. Otherwise, the program is running in batch, which means the self-submitting part is done, so then it actually executes the business portion of the CL, which in this case is very trivial: use SNDMSG to send the passed-in parameter back to the caller. Trivial, yes, but it exemplifies the problem wonderfully.

 

You see, if I call this from the command line with a parameter containing less than 50 characters, I'll get garbage in the trailing characters of the message even if I pass the parameter into the program using quotes and padding it out with blanks to 50 characters! It's the latter part that makes people pull their hair out, but it's an utterly predictable result of a few things working in combination.

 

The first is what we've been battling all along here: passing a literal to a parameter of greater than 32 characters will get garbage if the calling parameter is not completely filled. "But," you say, "I padded the value with blanks!" Yes, you did, but there's where the second condition comes into play. You see, the CMD keyword of the SBMJOB command is not really meant for program-to-program calls. We use it because it's so darned convenient, but really the CMD keyword is nothing more than a wrapper around the RQSDTA parameter. It allows you to prompt for the command to execute, but in the end you may pay for the convenience in the fact that it reformats your command into the RQSDTA without regard for parameter lengths (since it doesn't know any!). In the case above, the RQSDTA ends up looking like this:

 

CALL PGM(MYPGM) PARMS('HELLO')

 

Which, as we now know, is just not going to work.

How Do I Fix It?

Two well-known workarounds for this problem exist. One involves creating an extra parameter that in this case would be 51 characters long and then concatenating a non-blank character onto the end of the input parameter into this longer parameter. The longer parameter is what gets sent to the SBMJOB command. It's rather Rube Goldberg-esque to me and a bit hard to explain, but it works. The simpler solution is to create a command definition that wraps around the CL; you specify the parameter length in the command and therefore get around the implicit 32-character limitation. The problem is that you have another object to maintain and possibly get out of sync.

 

This article though will give you what I consider to be a more elegant solution. If you recall, I mentioned that the CMD keyword is a wrapper for the RQSDTA parameter, but one that causes a problem for longer parameters. A way to avoid that problem is to not use the CMD keyword at all and instead use the RQSDTA parameter. You'll have to format the entire call command much the same way you would if you were building a parameter for QCMDEXC, but once you've done that (making sure to pad the input parameter properly), you no longer have to worry about the 32-character limitation. Here's the one-line change in my original program:

 

             /* SBMJOB     CMD(CALL SBM001 &PARMX) */

               SBMJOB     RQSDTA('CALL SBM001 ''' *CAT &PARM *CAT '''')

 

That's all it takes! Instead of using the CMD keyword and its promptable syntax, you just have to make sure to format your own command string. That can be tricky (especially if you have embedded quotes in your character strings), but absent that complication, this is a simple way to get around a tricky problem.

 

Enjoy!

 

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  • SB Profound WC 5536 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. You can find Part 1 here. In Part 2 of our free Node.js Webinar Series, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Brian will briefly discuss the different tools available, and demonstrate his preferred setup for Node development on IBM i or any platform. Attend this webinar to learn:

  • 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 company are not aligned with the current IT environment.

  • SB HelpSystems ROBOT Generic IBM announced the E1080 servers using the latest Power10 processor in September 2021. The most powerful processor from IBM to date, Power10 is designed to handle the demands of doing business in today’s high-tech atmosphere, including running cloud applications, supporting big data, and managing AI workloads. But what does Power10 mean for your data center? In this recorded webinar, IBMers Dan Sundt and Dylan Boday join IBM Power Champion Tom Huntington for a discussion on why Power10 technology is the right strategic investment if you run IBM i, AIX, or Linux. In this action-packed hour, Tom will share trends from the IBM i and AIX user communities while Dan and Dylan dive into the tech specs for key hardware, including:

  • Magic MarkTRY 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. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.

  • SB HelpSystems ROBOT GenericForms of ransomware has been around for over 30 years, and with more and more organizations suffering attacks each year, it continues to endure. What has made ransomware such a durable threat and what is the best way to combat it? In order to prevent ransomware, organizations must first understand how it works.

  • SB HelpSystems ROBOT GenericIT security is a top priority for businesses around the world, but most IBM i pros don’t know where to begin—and most cybersecurity experts don’t know IBM i. In this session, Robin Tatam explores the business impact of lax IBM i security, the top vulnerabilities putting IBM i at risk, and the steps you can take to protect your organization. If you’re looking to avoid unexpected downtime or corrupted data, you don’t want to miss this session.

  • SB HelpSystems ROBOT GenericCan you trust all of your users all of the time? A typical end user receives 16 malicious emails each month, but only 17 percent of these phishing campaigns are reported to IT. Once an attack is underway, most organizations won’t discover the breach until six months later. A staggering amount of damage can occur in that time. Despite these risks, 93 percent of organizations are leaving their IBM i systems vulnerable to cybercrime. In this on-demand webinar, IBM i security experts Robin Tatam and Sandi Moore will reveal:

  • FORTRA Disaster protection is vital to every business. Yet, it often consists of patched together procedures that are prone to error. From automatic backups to data encryption to media management, Robot automates the routine (yet often complex) 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:

  • FORTRAManaging messages on your IBM i can be more than a full-time job if you have to do it manually. Messages need a response and resources must be monitored—often over multiple systems and across platforms. 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:

  • FORTRAThe thought of printing, distributing, and storing iSeries reports manually may reduce you to tears. Paper and labor costs associated with report generation can spiral out of control. Mountains of paper threaten to swamp your files. Robot 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:

  • FORTRAFor over 30 years, Robot has been a leader in systems management for IBM i. With batch job creation and scheduling at its core, the Robot Job Scheduling Solution reduces the opportunity for human error and helps you maintain service levels, automating even the biggest, most complex runbooks. Manage your job schedule with the Robot Job Scheduling Solution. Key features include:

  • LANSA Business 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.

  • 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:

  • LANSASupply Chain is becoming increasingly complex and unpredictable. From raw materials for manufacturing to food supply chains, the journey from source to production to delivery to consumers is marred with inefficiencies, manual processes, shortages, recalls, counterfeits, and scandals. In this webinar, we discuss how:

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • Profound Logic 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.

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? 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: