Part1 - Part2


  SAS Development System

  User's Guide

  Volume 1:

  Introduction, Editor, Compiler

 

 

  Version 6.0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     SAS Institute Inc.

     SAS Campus Drive

     Cary, NC 27513

 

 


 

The correct bibliographic citation for this manual is as follows: SAS Institute

Inc., SAS/C Development System User's Guide, Volume 1: Introduction, Editor,

Compiler, Version 6.0, Cary, NC: SAS Institute Inc., 1992. 316 pp.

 

SAS/C- Dewelopment System User's Guide, Volume 1: Introduction, Editor,

Compiler, Version 6.0

 

Copyright (c) 1992 by SAS Institute Inc., Cary, NC, USA.

ISBN 1-55544-496-2

All rights reserved. Printed in the United States of America. No part of this

publication may be reproduced, stored in a retrieval system, or transmitted, in

any form or by any means, electronic, mechanical, photocopying, or otherwise,M

without the prior written permission of the publisher, SAS Institute Inc.

1st printing, July 1992

 

The SASI System is an integrated system of software providing complete

control over data access, management, analysis, and presentationn Base`SAS

software is the foundation`of the SAS System. Products within the SAS System

include SAS/ACCESS, SAS/AFI, SAS/ASSIST, SAS/CPE, SAS/DMI, SAS/ETS,

SAS/FSP, SAS/GRAPH, SAS/IML, SAS/IMS-DLoI, SAS/OR, SAS/QC,

SAS/REPLAY-CICS, SAS/SHARE, SAS/STAT, SAS/TOOLKIT, SAS/CALC,

SAS/CONNECT, SAS/DB2, SAS/EIS, SAS/ENGLISH, SAS/INSIGHT,

SAS/LAB, SAS/LOOKUP, SAS/NVISION, SAS/PH-Clinical, SAS/SQL-DS, and

SAS/TUTOR software. Other SAS Institute products are SYSTEM 2000 Data

Management Software, with basic SYSTEM 2000, CREATE, Multi-User,

QueX, Screen Writer, and CICS interface software; NeoVisuals software;

JMP, JMP IN and JMP Server software; SAS/RTERM`software; and the

SAS/C Compiler and the SAS/CX Compiler. MultiVendor Architecture and

MVA are trademarks of SAS Institute Inc. SAS Institute also offers SAS

Consulting and On-Site Ambassador services. SAS Communications, SAS

Training, SAS Views, the SASware Ballot, and Observations are published by

SAS Institute Inc. All trademarks above are registered trademarks or

trademarks of SAS Institute Inc. in the USA and other countries. (R) indicates

USA registration. The Institute is a private company devoted to the support

and further development of its software and related services.

 

Amiga Includes and Development Tools Version 2.0

Copyright (c) 1990 Commodore-Amiga, Inc. All rights reserved.

Amiga Workbench Version 2.0

Copyright (c) 1988, 1990 Commodore-Amiga, Inc. All rights reserved.

Installer

Copyright (c) 1991-1992 Commodore Amiga, Inc. All rights reserved.

AmigaGuide and WDisplay

Copyright (c) 1991-1992 Commodore-Amiga, Inc. All rights reserved.

Distributed under license from Commodore.

Enforcer and Mungwall

Copyright (c) 1990-1992 Commodore-Amiga, Inc.

Distributed with permission from Commodore.

Amiga- AmigaDOS, Workbench, and AmigaGuide are registered trademarks

or trademarks of Commodore Amiga, Inc. Commodore is a registered

trademark or trademark of Commodore Electronics Limited.

IBM is a registered trademark of International"Business Machines Corporation.

Other brand and product names are registered trademarks or trademarks of

their respective companies.

 

Doc S17, Ver112.6, 071692


 

 

         Contents

 

 

 

 

 

 

       ix Reference Aids

 

       xi Credits

 

     xiii Acknowledgments

 

       xv Using This Book

 

    xxiii Changes and Enhancements

 

         Part 1 Getting Started

 

Page 3 Chapter 1 Installing Your SAS/C Development System

     3 Introduction

     3 Protecting Your Investment

     4 Installing the Product on A Hard Disk

     8 Installing the Product on Floppy Disks

    10 Assigning Logical Device Names

    10 Setting Environment Variables

 

    13 Chapter 2 Using Your SAS/C Development System

    13 Introduction

    14 Using SAS/C Tools from the Workbench Screen

    22 Using SAS/C Tools from the Shell

    25 Using Icons

 

    27 Chapter 3 Getting Help

    27 Introduction

    27 Using the Help System

    29 Contacting the Technical Support Division

 

       Part 2 Using the Screen Editor (se)

 

    37 Chapter 4 Using se

    37 Introduction

    38 Starting the Editor

    39 Reading the Status Line

    40 Moving Around in a File

    40 Entering and Editing Text

    46 Saving Your File and Exiting se

    47 Managing Windows


 

iv Contents

 

 

 

    48 Compiling from within the Editor

    48 Getting Help

 

    49 Chapter 5 Controlling se

    49 Introduction

    50 Selecting Menu Options

    51 Moving Around in the File

    52 Inserting Text

    52 Deleting Text

    53 Working with Blocks of Text

    53 Searching for and Replacing Strings

    54 Managing Windows

    54 Changing Colors

    55 Creating and Using Keystroke Macros

    55 Editing a New File

    56 Naming Files

    56 Undoing Changes

    56 Saving Your File and Exiting the Editor

 

    57 Chapter 6 Customizing the Editor

    57 Introduction

    57 Displaying the Configuration Window

    59 Displaying Key Definitions

    60 Setting Key Definitions

    61 Setting Tab Stops

    61 Setting Other Options

    64 Saving the New Settings

    64 Reusing Saved Settings

 

    65 Chapter 7 Using the AREXX`Interface to seM

    65 Introduction

    65 Executing A Series of Editor Commands

    68 Communicating with External Programs

    69 AREXX Macros Provided with the Compiler

    70 AREXX Command Summary

 

       Part 3 Using the Compiler and Linker

 

    77 Chapter 8 Compiling and Linking Your Program

    77 Introduction

    77 Compiling Your Program

   120 Linking Your Program

   127 Using Overlays


 

                                                                                                                                                                                                                                  Contents v

 

 

 

   135 Chapter 9 Running Your Program from the Workbench

       Screen

   135 Introduction

   135 Working with argc and argv

   137 Managing the Standard I/O Window

 

   139 Chapter 10 Using Startup Modules, Autoinitialization,

       and Autotermination Functions

   139 Introduction

   140 Understanding Startup Modules

   140 Modifying __main

   141 Linking with a Startup Module

   145 Writing Applications without a Startup Module

   145 Using Autoinitialization and Autotermination Functions

   147 Initializing System Library Bases

 

   153 Chapter 11 Using Amiga Specific Features of the

       SAS/C Language

   153 Introduction

   154 Using Special Keywords

   160 Managing Stack Space

   161 Using #pragma Statements

   163 Using Unnamed Unions

   164 Using Implicit Structure References

   164 Using Equivalent Structures

   166 Using Zero-Length Arrays

   167 Specifying the Size of Enumerated Types

   168 Using the sizeof and Comma Operators in Preprocessor Directives

   168 Using C++ Style and Nested Comments

   168 Using National Characters in Variable Names

   168 Using Common Model External Data

 

   171 Chapter 12   How Does the Compiler Work? 

   171 Introduction

   171 Compiling Your Program

   173 Linking Your Program

   174 Running Your Program

   175 Changing Hunk Names

   176 Addressing Data

   177 Understanding Data Types and Sizes

   179 Storing Data


 

vi Contents

 

 

 

   181 Chapter 13 Writing Portable Code

   181 Introduction

   181 Compiling Your Program

   182 Writing Your Program

 

       Part 4 Appendices

 

   193 Appendix 1   Solving Common Problems

   193 Introduction

   193 Resolving Undefined Symbols

   195 Fixing Compilation Errors

   197 Using CodeProbe

   197 Using Formatted Print Functions

   198 Using getchar

   199 Getting Incorrect Results from Function Calls

   200 Crashing the Machine

   200 Using The asctime Function

   201 Managing the Standard I/O Window

   201 Linking Resident Programs or Creating Resident Libraries

   202 Writing Replacement Functions for SAS/C Library Functions

   202 Eliminating Informational Messages

 

   203 Appendix 2 Error and Warning Messages

   203 Introduction

   203 Using Error and Warning Messages

   204 Explanations of Unnumbered Compiler Messages

   206 Explanations of Numbered Compiler Messages

   258 Explanations of Linker Messages

   265 Enabling Suppressed Messages

 

   267 Appendix 3 Implementation-Defined Behavior

   267 Introduction

   268 F.3.1 Translation

   268 F.3.2 Environment

   268 F.3.3 Identifiers

   269 F.3.4 Characters

   269 F.3.5 Integers

   270 F.3.6 Floating-Point

   270 F.3.7 Arrays and Pointers

   271 F.3.8 Registers

   271 F.3.9 Structures, Unions, Enumerations, and Bit-Fields

   272 F.3.10 Qualifiers

   272 F.3.11 Declarators

   272 F.3.12 Statements

   272 F.3.13 Preprocessing Directives


 

                                                            Contents vii

 

 

 

   273 F.3.14 Library Functions

   278 F.3.15 Locale-Specific Behavior

 

   281 Appendix 4 Converting From Aztec C Options to SAS/C

       Options

 

   285 Appendix 5 Converting from Version 5 to Version 6

   285 Introduction

   285 Upgrading from Previous Versions

   286 Converting Compiler Options

   294 Specifying Version 6 Libraries

 

   295 Index


 

viii


 

 

 

     Reference Aids

 

 

 

 

 

     Displays

 

 

   17 2.1 The SAS/C Compiler Options Index Screen

   18 2.2 The SAS/C Message Browser Window

   19 2.3 The Edit Window Showing example.c

   21 2.4 CodeProbe Windows with example.c

   28 3.1 Editor Help Screen

   39 4.1 Editing hello.c and example.c

   58 6.1 se Configuration Window

   59 6.2 se Configuration Window Showing Ctrl-F4

 

 

 

     Figures

 

 

  128 8.1 An Example Overlay Tree

  130 8.2 Example Overlay Tree with Filenames

  132 8.3 Overlay Tree for hw

  147 10.1 Startup Modules, Autoinitialization Functions, and

           Autotermination Functions

 

 

 

     Tables

 

 

   70 7.1 AREXX Commands with Keystroke Equivalents

   73 7.2 AREXX Commands without Keystroke Equivalents

   80 8.1 Summary of Compiler Options

  119 8.2 Preprocessor Symbols Defined by the Compiler

  120 8.3 Preprocessor Symbols Defined by Compiler Options

  148 10.1 Library Bases for .library Files

  281 A4.1 Converting From Aztec C Options to SAS/C Options

  287 A5.1 Converting Version 5 Options to Version 6 Options

  294 A5.2 Specifying Version 6 Libraries


 

x


 

                                                                xi

 

 

 

Credits

 

 

Software

 

The SAS/C Development System is designed, built, and tested through

the combined effort of many people at SAS Institute. The AmigaDOS

development group includes the following individuals:

 

     Development Steve Krueger, Douglas Walker, Michael S.

                  Whitcher

 

     Testing and Twilah K. Blevins, Jim Cooper, Bob Patten,

       Technical Khristi Tomlinson

         Support

 

These individuals continue to support future development of the SAS/C

Development System.

 

 

 

Documentation

 

     Composition Candy R. Farrell, Denise T. Jones, Blanche W.

                 Phillips, Pamela A. Troutman

 

  Graphic Design Creative Services Department

 

     Proofreading Heather B. Dees, Laurie J. Medley, Karen A.

                  Olander, Josephine P. Pope, Christian Schwoerke

 

Technical Review Jim Cooper, Steve Krueger, Khristi Tomlinson,

                 Douglas Walker, Michael S. Whitcher

 

     Writing and Jeanne Ferneyhough, Steve Krueger, Jeffrey Lopes,

         Editing Khristi Tomlinson, Douglas Walker, Helen Weeks,

                 John M. West

 


 

xii


 

                                                              xiii

 

 

 

 

Acknowledgments

 

 

Many people make significant and continuing contributions to the

development of the SAS/C Development System. First among them is

John A. Toebes VIII, who was instrumental in the development of

Versions 4.0 and 5.0 and who directed the early development of

Version 6.0.

  Others who have contributed to the development and testing of

Version 6.0 of the SAS/C Development System include Aaron Avery,

Ralph Babel, Jim Biggs, Bruce M. Drake, Andy Finkel, Nathan S. Fish,

Jose M. Gallego, John Gerlach Jr., Maximilian Hantsch, Randell Jesup,

David N. Junod, Andrew Kopp, Martin J. Laubach, John Lindwall,

Christian Ludwig, Andrew N. Mercier, Mike Meyer, Tony Preston,

Julius Oklamcak, Joe Porkka, Loren J. Rittle, Tomas Rokicki, Larry

Rosenman, Carolyn Scheppner, Steve Shireman, Michael Sinz, Martin

Taillefer, Steve Tibbett, John Wiederhirn, Loren Wilton, and Kenneth

Yarnall.

  The final responsibility for the SAS/C Development System lies with

SAS Institute alone. We hope that you will always let us know your

feelings about our product and its documentation. It is through such

communication that the progress of SAS software continues to be

accomplished.

 


 

xiv


 

                                                                                xv

 

 

 

 

               Using This Book

 

 

 

               Purpose

 

               SAS/C Development System User's Guide, Volume 1: Introduction,

               Editor, Compiler, Version 6.0 describes how to install and use your

               SAS/C Development System. This books describes the editor and

               compiler in detail and provides an overview of some of the of the

               major tools available to the SAS/C programmer under AmigaDOS,

               such as the debugger, the message browser, and the scopts utility.

                 "Using This Book" describes how you can best use this book. It

               describes the book's intended audience, the audience's prerequisite

               knowledge, the book's organization and its conventions, and additional

               documentation that is available to you.

 

 

 

               Audience

 

               This book assumes you have a working knowledge of the C language

               and the AmigaDOS operating system. For a list of publications you can

               use to learn the C language or the AmigaDOS operating system, refer

               to the "Additional Documentation" section at the end of "Using This

               Book."

 

 

 

               How to Use This Book

 

               This section gives an overview of the book's organization and content.

               The book's chapters are described, followed by a section on how to use

               each chapter.

 

 

  Organization SAS/C Development System User's Guide, Volume 1: Introduction,

               Editor, Compiler is divided into four parts; the chapters and appendices

               contained in each part are described here:

 

 

               Part 1: Getting Started

               Part 1 contains three chapters that show you how to install the SAS/C

               Development System, use its major features, and get help when

               necessary.

 

               Chapter 1, "Installing Your SAS/C Development System"

                  describes how to install the SAS/C Development System, assign

                  logical device names, set environment variables, and upgrade from

                  previous versions of the product.


 

xvi Using This Book

 

 

 

 

Chapter 2, "Using Your SAS/C Development System"

  describes briefly how to use the major features of the SAS/C

  Development System: the editor, the compiler, the debugger, the

  scmsg utility, and the scopts utility.

 

Chapter 3, "Getting Help"

  describes how to use the online help system and how to contact the

  Technical Support Division.

 

 

Part 2: Using the Screen Editor (se)

  Part 2 contains four chapters that describe how to use the editor, how

  to customize the keymap, and how to use AREXX with the editor.

 

Chapter 4, "Using se"

  describes the most frequently used se commands and options.

 

Chapter 5, "Controlling se"

  lists all of the options and commands available in se.

 

Chapter 6, "Customizing the Editor"

  describes how to use the se configuration window. The

  configuration window enables you to customize the meaning of

  various keystrokes within se.

 

Chapter 7, "Using the AREXX Interface to se"

  describes how to use AREXX to create complicated macros and to

  communicate with other programs from se.

 

 

Part 3: Using the Compiler and Linker

 

Part 3 contains six chapters that describe how to compile, link, and

run your program. These chapters also provide guidelines for writing

your application.

 

Chapter 8, "Compiling and Linking Your Program"

  describes how to use the compiler and linker.

 

Chapter 9, "Running Your Program from the Workbench Screen"

  describes special considerations for running your program from the

  Workbench screen.

 

Chapter 10, "Using Startup Modules, Autoinitialization, and

  Autotermination Functions"

  describes what functions the startup modules perform and how to

  write your own autoinitialization and autotermination functions.

 

Chapter 11, "Using Amiga Specific Features of the SAS/C Language"

  describes how to use SAS/C extensions to the C Language.

 


     

                                    Using This Book xvii

 

 

 

 

Chapter 12, "How Does the Compiler Work?"

   describes briefly the format of the object files produced by the

   compiler. This chapter also describes what happens when you

   compile, link, and run your program.

 

Chapter 13, "Writing Portable Code"

   provides guidelines for improving the portability of your program.

 

 

Part 4: Appendices

 

Part 4 contains five appendices.

 

Appendix 1, "Solving Common Problems"

   contains answers to the questions that users ask most frequently

   when they call the Technical Support Division.

 

Appendix 2, "Error and Warning Messages"

   contains explanations for the diagnostic messages produced by the

   compiler and linker.

 

Appendix 3, "Implementation-Defined Behavior"

   describes how the SAS/C Compiler behaves for each of those areas

   where the ANSI Standard allows an implementation to define its

   own behavior.

 

Appendix 4, "Converting from Aztec C Options to SAS/C Options"

   lists each of the Version S Aztec C options and their equivalent

   Version 6 SAS/C options.

 

Appendix S, "Converting from Version S to Version 6"

   lists each of the Version 5.10 options and their equivalent Version

   6 options. This appendix also provides guidelines for converting

   your projects to Version 6 SAS/C software.


 

xviii Using This Book

 

 

 

 

       What You  The following table points you to specific chapters in this book for

    Should Read  information on particular topics. For other references, refer to

                 "Additional Documentation" later in this section.

 

 

                  ___________________________________________________________________

                  For information on                                  You should read

                  ___________________________________________________________________

                  installing the product                              Chapter 1

                  upgrading from previous versions of the product     Chapter 1 and

                                                                      Appendix 5

                  using the major features of the SAS/C               Chapter 2

                  Development System

                  contacting the Technical Support Division           Chapter 3

                  using online help                                   Chapter 3

                  using the editor                                    Chapters 4 and 5

                  specifying the sc command and compiler options      Chapter 8

                  managing the environment in which your program      Chapters 9 and

                  runs                                                10

                  using extensions to ANSI C                          Chapter 11

                  ___________________________________________________________________

 

 

 

                  Conventions

 

                  This section covers the typographical and syntax conventions used in

                  this book.

 

 

    Typographical The SAS/C books for AmigaDOS use special fonts to depict specific

      Conventions types of information. These typographical conventions are as follows:

                       roman is the basic type style used for most text.

 

                   monospace is used to show example statements or programs.

                             Monospace is used also for items specific to the

                             C language, such as the names of functions, header

                             files, and keywords.

 

                     oblique is used for arguments or variables whose values are

                             supplied by the user; for example, you should enter an

                             appropriate filename when you see filename.

 

                      italic is used for terms that are defined. Italic is also used to

                             indicate arguments for which you supply a value.

 

 
                                                                  Using This Book xix

 

 

 

 

         Syntax This book uses the following conventions for syntax:

    Conventions

                 monospace  indicates commands, keywords, and switches that

 

                            should be spelled exactly as shown. These

                            arguments may or may not be optional, depending

                            on whether they are enclosed in square brackets.

                            italic indicates arguments for which you supply a value.

 

                [] (square  indicate an optional argument when they surround

                 brackets)  the argument.

 

             ...(gllipsis)  indicates that you can repeat the argument or

                            group of arguments preceding the ellipsis any

                            number of times.

 

                         |  means to choose one item from a group of items

            (vertical bar)  separated by the bars.

 

                  The following example illustrates these syntax conventions:

                env [function | integer]

 

                env

                   is a command name, so it appears in monospace type.

 

                function

                   is a function for which you supply the name, so it appears in italic

                   type.

 

                [function | integer]

                   are both optional, so they are enclosed in square brackets.

 

                function | integer

                   indicates that you can specify only one of the items separated by the

                   vertical bar.

 

 

 

                Additional Documentation

 

                The following sections list documentation you may find helpful in using

                the SAS/C Development System.

 

 

            SAS If you are interested in SAS documentation, you need to contact the

  Documentation Book Sales department by writing to the following address or by

                calling the following number:

 

                                       SAS Institute Inc

                                       Book Sales Department

                                       SAS Campus Drive

                                       Cary, NC 27513

                                       919-677-8000

 


 

xx Using This Book

 

 

 

 

 

                     SAS/C Development System

                     This book is part of a set of publications for the SAS/C Development

                     System. There are three other publications in the set:

 

                     [] SAS/C Development System User's Guide, Volume 2: Debugger,

                        Utilitles, Assembler, Version 6.0 describes how to use

 

                        [] CodeProbe, the SAS/C Source Level Debugger

                        [] the utilities such as smake, grep, scopts, and scmsg

                        [] the SAS/C Macro Assembler

                        [] the global and peephole optimizers.

 

                     [] SAS/C Development System Library Reference, Version 6.0 describes

                        how to

 

                        [] access libraries

                        [] create your own libraries

                        [] use header files to reduce the amount of time and space required

`                          by your program.

 

                     [] SAS/C Development System Quick Reference, Version 6.0 contains

                        reference tables for the library functions, compiler and linker

                        options, and debugger commands.

 

                        These volumes are sold together as a set with the software. You can

                     order the entire package by specifying order #A56185.

 

 

             Other  The following sections list additional reference material specific to the

   Documentation C  language, Amiga and AmigaDOS programming, and the Motorola

                    68xxx microprocessor family.

 

 

                    C Language

                    The following books describe the C programming language:

 

 

                    American National Standards Committee (1990), American National

                       Standard for Information Systems--Programming Language C, Document

                       Number X3J11/90-013, Washington, D.C.: X3 Secretariat: Computer

                       and Business Equipment Manufacturers Association.

                    Harbison, Samuel P. and Steele, Guy L., Nr. (1990), C: A Reference Manual,

                       Third Edition, Englewood Cliffs, NJ: Prentice-Hall, Inc.

                    Kernighan, Brian W. and Ritchie, Dennis M. (1988), The C Programming

                       Language, Second Edition, Englewood Cliffs, NJ: Prentice-Hall, Inc.

                    Kochan, Stephen G. (1988), Programming in ANSI C, First Edition,

                       Indianapolis, Indiana: Hayden Books.

 

                   
                                             Using This Book xxi

 

 

 

 

                   Amiga and AmigaDOS

                   The following books provide information specifically about

                   programming on the Amiga system. Most of the examples in these

                   books are written in C or assembly language.

 

 

                   Commodore-Amiga, Inc. (1990), Using the System Software, Reading, MA:

                     Addison-Wesley Publishing Company.

                   Commodore Amiga, Inc. (1991), Amiga Hardware Reference Manual, 3rd

                     Edition, Reading, MA: Addison-Wesley Publishing Company.

                   Commodore-Amiga, Inc. (1991), Amiga ROM Kernel Reference Manual:

                     Devices, 3rd Edition, Reading, MA: Addison-Wesley Publishing

                     Company.

                   Commodore Amiga, Inc. (1991), Amiga ROM Kernel Reference Manual:

                     Includes and Autodocs, 3rd Edition, Reading, MA: Addison-Wesley

                     Publishing Company.

                   Commodore-Amiga, Inc. (1991), Amiga User Interface Style Guide,

                     Reading, MA: Addison-Wesley Publishing Company.

                   Commodore-Amiga, Inc. (1991), The AmigaDOS Manual, 3rd Edition, New

                     York, NY: Bantam Books.

                   Commodore-Amiga, Inc. (1992), Amiga ROM Kernel Reference Manual:

                     Libraries, 3rd Edition, Reading, MA: Addison-Wesley Publishing

                     Company.

 

   Motorola 68xxx  The following books contain information specifically about

                   programming the Motorola 68xxx family of microprocessors.

 

                   Motorola, Inc. (1987), MC68881/MC68882 Floating-Point Coprocessor

                     User's Manual, First Edition, Englewood Cliffs, NJ: Prentice Hall, Inc.

                   Motorola, Inc. (1989), MC68030 Enhanced 32-Bit Microprocessor User's

                     Manual, Second Edition, Englewood Cliffs, NJ: Prentice Hall, Inc.

                   Motorola, Inc. (1989), Programmer's Reference Manual, Phoenix, AZ:

                     Motorola Literature Distribution.

 

 

       Contacting  You can contact Commodore Application and Technical Support at the

             CATS  following address:

 

 

                                      1200 Wilson Drive

                                      West Chester, PA 19380

                                      215-429-0643

 

                  

xxii


 

                                             xxiii

 

 

 

 

                        Changes and Enhancements

 

 

The following sections describe some of the changes and enhancements

for the SAS/C Development System, Version 6.0.

 

[] The SAS/C Development System has an extensive online help system

   implemented using the AmigaGuide hypertext system from

   Commodore. The online help describes each utility, CodeProbe

   command, editor command, library function, diagnostic message, and

   compiler option. For a complete description of using the help system,

   see Chapter 3, "Getting Help."

 

[] The SAS Institute Technical Support Division has a new facility called

   EMITS (Electronic Mail Interface to Technical Support) that allows you

   to report problems and receive help through Internet. For more

   information, see Chapter 3, "Getting Help."

 

[] Compiler executables and other files are installed in a directory tree

   pointed to by the assign sc:. Unlike the Version 5 assign lc:, sc:

   points to the root of the compiler's installation directory.

 

[] The lc compiler front-end has been replaced with the new sc front-

   end, which takes options in a different form. The new sc front-end

   accepts C source files, assembly language files, object files, and

   libraries. You may specify options before or after the filenames. See

   Chapter 8, "Compiling and Linking Your Program," for more

   information.

     To help you make the transition to Version 6, the SAS/C

   Development System provides two utilities, sc5 and lctosc. The sc5

   command accepts options in the form accepted by lc and invokes the

   Version 6 compiler. The lctosc utility accepts options in the form

   accepted by lc and prints the equivalent sc options to stdout. Both

   sc5 and lctosc read the sascopts file, if present. Appendix 5,

   "Converting from Version 5 to Version 6," provides guidelines for

   converting your projects to Version 6.


 

xxiv Changes and Enhancements

 

 

 

 

       [] The names of various other executables have changed. The following

          table lists the names of the Version 5 executables and the

          corresponding Version 6 names.

 

 

 

          Version 5          Version 6

          ____________________________

          blink              slink

          lse                se

          sascopts           scopts

          sascsetup          scsetup

 

 

 

       [] Many symbols and functions in the link libraries have new names that

          adhere to the ANSI Standard. The Standard requires that all non-ANSI

          symbols referenced in ANSI header files start with two underscores or

          an underscore and a capital letter. The Version 5 symbols that violated

          this standard have been renamed, usually by adding one or two

          underscores to the front of the name. For information on a specific

          symbol, refer to Chapter 6, "Predefined Data Name Reference," in

          SAS/C Development System Library Reference.

 

       [] The name of the file that is created by the scopts utility has been

          changed from sascopts to scoptions.

 

       [] The AmigaDOS 1.3 header files are no longer shipped with the SAS/C

          Compiler. However, all AmigaDOS 1.3 functions are available under

          AmigaDOS 2.0, so you can develop code that runs under AmigaDOS

          1.3 by restricting your program from using any AmigaDOS 2.0

          functions.

 

       [] The SAS/C Development System, Version 6, does not have separate

          libraries for use with registerized parameters. The normal link libraries

          have both registerized and nonregisterized entry points.

            If you write a function that has the same name as a library function,

          you need to add the _ _ regargs keyword to your function or compile

          with the parms=both or parms=register option. For example,

          you may want to replace the SAS/C library function malloc with

          your own version of malloc. If you compile with the parms=stack

          option or define your version of malloc with the _ _ stdargs

          keyword, then two versions of malloc are linked into your

          executable. If you use other SAS/C library functions that call malloc,

          these functions use the version of malloc in the SAS/C libraries.

          However, your functions that call malloc use your version of

          malloc. To make sure that all calls to malloc are using your version


 

                                      Changes and Enhancements xxv

 

 

 

 

   of malloc, define your version with __ regargs or compile with the

   parms=both or parms=register option.

     For information on using registerized parameters, refer to the

   description of the __ regargs keyword in Chapter 11, "Using Amiga

   Specific Features of the SAS/C Language," and the description of the

   parameters compiler option in Chapter 8, "Compiling and Linking

   Your Program."

 

[] The lc1, lc2, and go commands are not included in Version 6 of the

   SAS/C Development System. The sc driver loads AmigaDOS shared

   libraries to handle the work of the various phases instead of invoking

   multiple programs.

 

[] The lseinst program has been removed, and the se configuration

   window added in its place. Select the Configuration Window option

   from the Options pulldown menu in se to invoke the configuration

   window. For complete description of using the configuration window,

   see Chapter 6, "Customizing the Editor."

 

[] The precompiled header files in Version 5 have been replaced with

   GSTs (Global Symbol Tables). GSTs are much faster than precompiled

   headers because they remain in RAM between compiles. Some

   additional utilities, gst and hypergst, allow you to browse the

   RAM-resident GST files for information on symbols defined in system

   header files or in your header files. For information on creating and

   using GSTs refer to SAS/C Development System Library Reference and

   to the descriptions of the gst and hypergst utilities in SAS/C

   Development System User's Guide, Volume 2: Debugger, Uhlities,

   Assembler. See also the descriptions of the gst and makegst

   compiler options in Chapter 8, "Compiling and Linking Your

   Program."

 

[] The new scmsg utility enables you to integrate any editor that

   supports AREXX into the SAS/C Development System. For more

   information, see the description of the errorrexx compiler option in

   Chapter 8, "Compiling and Linking Your Program," and the description

   of the scmsg utility in SAS/C Development System User's Guide,

   Volume 2.

 

[] The global optimizer supports many new optimizations, including inline

   functions. You can use the __ inline keyword to specify a function

   that is to be inlined. See Chapter 11, "Using Amiga Specific Features of

   the SAS/C Language," for information on special keywords supported

   by the SAS/C Compiler. Refer to SAS/C Development System User's

   Guide, Volume 2 for information on the global optimizer.


 

xxvi Changes and Enhancements

 

 

 

 

[] The new peephole optimizer improves code quality significantly. The

   peephole optimizer is run automatically when you choose the

   optimize compiler option, unless you specifically suppress it with

   nooptpeep. Refer to SAS/C Development System User's Guide,

   Volume 2 for information on the peephole optimizer.

[] The CodeProbe debugger has numerous enhancements. The major

   enhancements include the following:

 

  [] The command syntax has been totally rewritten and greatly

     extended.

  [] The debugger has new support for debugging AmigaDOS shared

     libraries.

  [] The debugger automatically detects Enforcer hits caused by your

     program and halts your program at the location of the hit.

  [] The debugger now has cross-debugging capability. This new feature

     allows you to run your program on one machine and debug the

     program using another machine connected through the serial port

     or a network file system.

 

   Refer to SAS/C Development System User's Guide, Volume 2 for a

   complete description of using the debugger.

 

[] The compiler still generates code by default to check for stack overflow

   at the entry to each function. However, this code is more reliable

   under Version 6.0.

     The compiler also supports a new option that generates code to

   allocate a new stack and allow your program to continue running if the

   old stack runs out. For more information, see the description of the

   stackextend compiler option in Chapter 8, "Compiling and Linking

   Your Program." See also the description of the__ stackextend

   keyword in "Managing Stack Space" in Chapter 11, "Using Amiga

   Specific Features of the SAS/C Language."

 

[] The compiler now supports the common model for external data as

   well as the strict reference-definition model. For more information, see

   Chapter 11, "Using Amiga Specific Features of the SAS/C Language."

 

[] The compiler now supports a coverage option that generates special

   code that tells you which portions of your program were executed by

   your test cases. A new utility, the cover utility, analyzes the data

   produced by the compiler when you specify cover age. This

   information helps you design test cases that test all portions of your

   code. For more information, see the description of the coverage

   compiler option in Chapter 8, "Compiling and Linking Your Program,"

   and the descriqtion of the cover utility in SAS/C Development System

   User's Guide, Volume 2.


 

                                   Changes and Enhancements xxvii

 

 

 

 

 

[] The stringmerge compiler option, equivalent to the -cs in

   Version 5, merges all string constants and places them in    the code

   section. Unlike tie Version S option, stringmerge also places all

   data declared stat i c cons t and all automatic initializer data in the

   code section. For more information, see the description of the

   stringmerge compiler option in Chapter 8, "Compiling and Linking

   Your Program."

 

[] The compiler can now produce a disassembly of the generated object

   code. For more information, see the description of the disassem

   compiler option in Chapter 8, "Compiling and Linking Your Program."

 

[] The compiler now adjusts dynamically to low-memory situations. If you

   compile your program and your machine runs low on memory, the

   compiler displays the message ***Freeing Resources and frees

   memory to enable it to continue the compilation. You can also use the

   memorysize compiler option to limit the compiler's memory use. For

   more information, see the description of the memorysize option in

   Chapter 8, "Compiling and Linking Your Program."

 

[] You can designate autoinitialization functions that you waot the

   compiler to call automatically before it calls your main routine. You

   can also designate autotermination functions that you want the

   compiler to call after main returns. For more information, see

   Chapter 10, "Using Startup Modules, Autoinitialization, and

   Autotermination Functions."

 

[] System library bases that are not defined in your code are

   automatically opened and initialized. For more information, see

  Chapter 10, "Using Startup Modules, Autoinitialization, and

  Autotermination Functions."

 

[] The SAS/C Compiler now permits references to unnamed unions and

   direct references to members of substructures. The compiler also

   permits zero-length arrays as members of structures. For more

   information, see Chapter 11, "Using Amiga Specific Features of the

   SAS/C Language."

 

[] The new #pragma tagcall allows you to call AmigaDOS functions

   that take a variable parameter list without using`assembler stubs. For

   more information, refer to SAS/C Development System Library

   Reference.


 

xxviii  Changes and Enhancements

 

 

[] The new #pragma msg allows you to control`compiler diagnostic

   output more closely. For information, see Chapter 11, "Using

   Amiga Specific Features of the SAS/C Language."

 

[] The compiler now supports char, short, and long enum types. For

   more information, see Chapter 11, "Using Amiga Specific Features of

   the SAS/C Language."


 

 

 

 

 

      [] Part 1

         Getting Started

 

 

 

 

 

Chapters 1 Installing Your SAS/C Development System

         2 Using Your SAS/C Development System

         3 Getting Help

 

 

 


 

2


 

 

 

     1 Installing Your SAS/C

       Development System

 

 

         3 Introduction

         3 Protecting Your Investment

         4 Installing the Product on A Hard Disk

         5 Modifying Your Startup File

         6 What Directories Does the Installation Program Create?

         8 Installing the Product on Floppy Disks

        10 Assigning Logical Device Names

        10 Setting Environment Variables

 

 

 

 

       Introduction

       This chapter describes how to install your SAS/C Development System

       and provides guidelines for upgrading your projects to Version 6.

 

 

 

       Protecting Your Investment

 

       Before you install your SAS/C Development System, you should do the

       following:

 

       [] Make backup copies of the disks distributed with this product. To make

          copies, you can use the AmigaDOS diskcopy command, or you can

          select the disk icon and choose copy from the"Icons menu. Refer to

          your AmigaDOS manual for more information on copying disks.

       [] Write down your registration number where you can find it easily. You

          must give your registration number to the Technical Support staff

          before you can receive help from the SAS Institute Technical Support

          Division.

       [] Complete the registration card that comes with this product and return

          it to SAS Institute Inc. You must"register your purchase to qualify for

          technical support and to be notified about future upgrades.

          If you are upgrading from a previous version, and you have already

          registered the previous version, you do not need to send in a new

          registration card. If you are not sure if you are in the SAS Institute

          database of registered users, write your old registration number and a

          brief explanation on the new card before sending in the card.


 

4 Chapter 1

 

 

 

          Installing the Product on A Hard Disk

 

          The installation program is distributed on disk number 1. You should run

          the installation program from the Workbench screen, not the Shell.

            To install the SAS/C Development System, insert disk number 1 in the

          disk drive and double-click on the disk icon to open the

          SASC_6.0_Disk_1 window. Double-click on the Install-SASC icon to

          open the Install-SASC window.

            If you want to see exactly what the installation program will do before

          you actually install the product, you can select the Pretend to Install and

          Log File options, and then proceed through the installation process. As

          you go through the installation process, the installation program writes to

          a log file all of the commands it would have executed if you were actually

          installing the product. The log file is named install_log_file and is

          written to the directory in which you are installing the product (or to

          ram:, if it cannot write to that directory).

            As you go through the installation process, the installation program

          asks you some questions, including the name of the directory, or

          destination, where you want to install the SAS/C Development System.

          The installation program allows you to save disk space by asking you

          which parts of the product you want to install. For example, you may

          choose not to install the cross debugger. The installation program also

          allows you to choose whether you want to install compressed or normal C

          header files. Choose compressed header files only if you need to conserve

          space on your hard disk. If you choose not to install parts of the product,

          include this information in any communication you have with the

          Technical Support Division.

            After you have answered all of the questions (and if you select Install

          for Real), the installation program then proceeds to install the product.

          The program prompts you to insert disks as necessary.

            Context-sensitive online help is available at any point in the installation

          process by clicking on the Help button, and you can abort the

          installation process at any time by clicking on the Abort button.

            After all the files on the distribution disks have been copied to your

          hard disk, the installation program asks you if you want the following

          statements added to your s:user-startup file.

 

 

                          assign sc: destination:sc

                          assign lib: sc:lib

                          assign include: sc:include

                          path sc:c add

 

          The installation program adds these statements automatically if you select

          Proceed. If you decide to add these statements manually and do not


 

                                              Installing Your SAS/C Development System 5

 

 

 

 

                select Proceed, make sure you add them before any line that calls a

                utility that creates a new Shell, such as PopCLI.

                  Finally, the installation program displays the read.me file.

                  Note: Read the read.me file carefully. This file contains important

                information that is not contained in the documentation distributed with

                the product. This information may concern new or enhanced features,

                bug fixes, or changes to the documentation. The read.me file is installed

                with the rest of the product, so you can refer to this file later.

 

 

Modifying Your  If you are running AmigaDOS 2.0, the modifications that the installation

  Startup File  program makes to your startup file (if you selected Proceed) are

                sufficient to allow the compiler to run.

                  If you are running AmigaDOS 1.3, you may need to make an additional

                change to your s: startup-sequence file to make sure that these

                assign and path statements take effect.

                  The installation program adds the path and assign statements to the

                file s:user-startup. The installation also asks you where to add the

                following lines:

 

 

                      if exists s:User-startup

                         execute s:user-startup

                      endif

 

 

                The installation program suggests a place to enter these lines, but you can

                specify a different place if necessary. Make sure that these lines are

                entered before any line that calls a utility that creates a new Shell, such

                as PopCLI. The installation program adds these lines to either

                s:startup-sequence or s:startupII .

                  If the lines are added to s:startupII, you must verify that

                s: startupII is properly executed from s: startup-sequence.

                Under some older versions of AmigaDOS Version 1.3, s: startupII is

                executed from s: startup-sequence through either a newshell

                command or a run execute command. Therefore, any path

                statements added to the s:user-startup file do not have any effect

                under the Workbench screen or the Shell. Edit your s:startup-

                sequence file, and verify that s:startupII is executed with an

                execute command only. If not, change the command to the following:

 

 

                       execute s:startupII

 

 

                If this command is not in your s: startup-sequence file, add it. If

                s: startupII is executed with a run execute command, delete the

                word run.


 

6 Chapter 1

 

 

 

 

                  After you have saved your s:startup-sequence file with the

                correct command and completed the installation process, re-boot your

                machine. Your compiler should work correctly.

 

 

What Directories  After you finish installing the product, you will have a directory named

     Does the sc  that contains several files and subdirectories. The following list

    Installation  describes the directories that have icons.

Program Create?   Note: Some of these icons may not be present if you choose not to

                install the entire package.

 

            [] starter_project is the directory that the scsetup utility uses as

               a model whenever you set up a project. (A project consists of all of the

               files that make up an application.) You can add icons and programs to

               starter_project as necessary. For example, you can create an

               scoptions file in this directory that contains any compiler options

               that you want to be copied into each of your project directories.

               scsetup copies the entire contents of starter_project into the

               project drawer you specify. The installation program places the

               following icons (and files) in this drawer:

 

                        Edit invokes the se editor

 

                       Build builds the project

 

                       Debug runs the debugger

 

                   SCoptions sets compiler options.

 

            [] c contains the executable modules for the SAS/C Development System,

               including the assembler, compiler, debugger, linker, and various

               utilities.

            [] icons is a directory used by scsetup, se, and other utilities that

               contains default icons for different file types. You can replace any of

               the icons in this directory or add your own icons. For more

               information on using icons, see Chapter 2, "Using Your SAS/C

               Development System."

            [] examples contains example programs. For each example, this

               directory contains complete source code and a read.me file that

               explains the example program and describes how to run the example.

               Some of the examples are in their own subdirectory under the

               examples directory.

            [] help contains help files used by the various SAS/C utilities.

               Chapter 3, "Getting Help," describes the contents of this directory and

               how to use the help system.


 

                          Installing Your SAS/C Development System 7

 

 

 

 

 The installation program also creates some directories that do not have

icons. These directories are as follows:

 

[] env contains default configuration information for tools such as the

   editor. The tools look first in env: sc for their configuration files, and

   if the files are not there, the tool looks in sc: env.

[] source contains C and assembly language source code for various

   parts of the SAS/C Development System. For example, this directory

   includes the source code to the different startup modules.

[] Include contains C header files and assembler header files. The

   INCLUDE: logical device name should point to this directory.

[] Lib contains link libraries. The LIB: assign should point to this

   directory.

[] libs contains resident libraries used by the various SAS/C commands.

   These libraries must exist in the sc:libs drawer. Do not attempt to

   copy them into libs: with the AmigaDOS system libraries. The

   following libraries are included in this drawer:

 

   sc1.library

      is required by the compiler. This library must be present to

      compile any code.

 

   sc2.library

      is required by the compiler. This library must be present to

      compile any code.

 

   scgo.library

      is required by the global optimizer. This library must be present if

      you compile with the optimize option and do not specify the

      nooptglobal option.

 

   scpeep.library

      is required by the peephole optimizer. This library must be

      present if you compile with the optimize option and do not

      specify the nooptpeep option.

 

   scdebug.library

      generates debugging information. Without this library, the

      compiler can generate partial line number information but cannot

      generate any symbolic debugging information.

 

   scgst.library

      generates or accesses GSTs (Global Symbol Tables). This library is

      not required if you never use the GSTs. Refer to SAS/C

      Development System Librar,v Reference, Version 6.0 for information

      on using GSTs.


 

8 Chapter 1

 

 

 

 

    schi.library

       is used by CodeProbe to read the debugging information in an

       executable module. This library is required if you run the

       debugger.

 

    sekeymap.library

      is used by the editor to allow you to modify the editor's

      configuration.

 

    scspill.library

      detects low-memory conditions and attempts to reduce the

      compiler's memory usage. This library is required if you want the

      compiler to react dynamically to low-memory conditions.

         If you compile your program and your machine runs low on

      memory, the compiler displays the message ***Freeing

      Resources and frees memory to enable it to continue the

      compilation. You can force the compiler to free memory at any

      time by pressing Control-F in the window to which the compiler

      is sending output.

 

    sclist.library

      generates listing and cross-reference files. This library is not

      required if you never use the list or xref compiler options.

 

   It is recommended that you do not place your source code in the sc

 directory tree. Installing updates to the SAS/C Development System is

 easier if you can replace the entire directory without worrying about

 losing any of your own program files. Instead, you should set up a

 different directory for your C development work. You may find it useful

 to keep different projects in different directories. Keeping projects

 separated makes it easier to keep track of the smakefiles and compiler

 options required for each project. Remember, a project consists of all of

 the files that make up an application.

 

 

 

 Installing the Product on Floppy Disks

 

 The installation program is distributed on disk number 1. You should run

 the installation program from the Workbench screen, not the Shell.

   Before installing the SAS/C Development System, make sure you have

 at least two blank disks on which to install this product.

   To install the SAS/C Development System, insert disk number 1 in the

 drive df0: and double-click the disk icon to open the SASC_6.0_Disk_1

 window. Double-click the Install-SASC icon to open the Install-SASC

 window.

   If you want to see exactly what the installation program will do before

 you actually install the product, you can select the Pretend to Install and


 

                          Installing Your SAS/C Development System 9

 

 

 

 

Log File options, and then proceed through the installation process. As

you go through the installation process, the installation program writes to

a log file all of the commands it would have executed if you were actually

installing the product. The log file is named install_log_file and is

written to ram:.

  As you go through the installation process, the installation program

asks you some questions, then proceeds to install the product. The

program`prompts you to insert disks as necessary.

  The installation program produces the following two working disks:

 

Disk 1 is a bootable disk that contains the compiler (sc), linker

       (slink), editor (se), and the smake, scopts, and scmsg

       utilities.

 

Disk 2 contains compressed header files, CodeProbe, sc.lib,

       scm.lib, and a small version of amiga.lib containing only

       global symbols (no stubs).

 

The installation program asks you if you want to create a third disk:

 

Disk 3 contains the remaining utilities and the global and peephole

       optimizers, if you choose to create disk 3. Under AmigaDOS 1.3,

       you will not be able to use the global and peephole optimizers.

       Under AmigaDOS 2.0, a multiple-directory assign statement is

       used to access the optimizers.

 

Online help is available at any point in the installation process, and you

can abort the installation process at any time.

  Finally, the installation program displays the read.me file.

  Note: Read the read.me file carefully. This file contains important

information that is not contained in the documentation distributed with

the product. This information may concern new or enhanced features,

bug fixes, or changes to the documentation.


 

10 Chapter 1

 

 

 

 

    Assigning Logical Device Names

 

    When you install the SAS/C Development System (either on floppy disks

    or on a hard drive), the installation program tells you that specific

    assign statements must be added to your startup file. You may choose

    to allow the installation program to add these statements for you. The

    following list describes each of the logical device names that need to be

    added to your startup file.

 

        sc: specifies the directory in which the compiler and other

            utility programs are located. For example, the following

            statement indicates that the compiler and utilities are in the

            directory work:sc.

 

                   assign sc: work:sc

 

   include: specifies the directory in which the compiler can find

            system header files included in your programs by specifying

            the #include statement with angle brackets (<>). For

            example, you could enter the following assign statement

            from the Shell prompt:

 

                     assign include: df0:sc/include

 

            Then, if you compile a program containing the statement

            #include <stdio.h>, the compiler attempts to include

            the file df0: sc/include/stdio.h.

 

       lib: specifies the directory in which the linker can find the

            libraries and other modules needed to build executable

            files. For example, the following Shell command indicates

            that the libraries are in the directory sc/lib on the

            work: volume:

                

                          assign lib: work:sc/lib

 

    Setting Environment Variables

    The various tools in the SAS/C Development System sometimes require

    information in environment variables. For example, the sc command

    looks for default options in a file called scoptions; if the compiler does

    not find such a file in the current directory, it looks in the environment

    variable ENV:sc/scoptions.

      Environment variables are stored in the logical device ENV: in files

    with the same name as the variable. ENV: is usually assigned to the


 

                         Installing Your SAS/C Development System 11

 

 

 

 

    ram: device or some other temporary location. You can set environment

    variables from the Shell with the setenv command.

      All SAS/C utilities that use environment variables access them from the

    ENV: sc subdirectory, so be sure to create this subdirectory in env:

    each time you boot your machine. Under AmigaDOS 2.0, the installation

    program creates this subdirectory by creating the directory ENVARC: SC.

    Under AmigaDOS 1.3, ENVARC: does not necessarily exist, so you must

    make sure that the ENV: SC subdirectory is created each time you boot

    your machine.


 

12


 

                                                                  13

 

 

 

 

 

              2  Using Your SAS/C

                 Development System

 

 

     13 Introduction

     14 Using SAS/C Tools from the Workbench Screen

         14 Setting Up a Project

         15 Creating a Source File with se

         16 Compiling, Linking, and Running Your Program

         20 Debugging Your Program

     22 Using SAS/C Tools from the Shell

         22 Creating a Source File with se

         22 Compiling, Linking, and Running Your Program

         25 Debugging Your Program

     25 Using Icons

 

 

 

 

     Introduction

 

     This chapter introduces the primary features of the SAS/C Development

     System. It shows you how to perform the following tasks:

 

     [] set up a project

     [] set compiler options for the project

     [] create a C source file

     [] compile, link, and run a C program

     [] use the debugger to look at your program.

 

       As you perform these tasks, the SAS/C Development System creates

     several icons. The icons it creates depend on the filename extension of the

     file you create. The last section in this chapter, "Using Icons," describes

     the default icons for each of these files and how to customize these icons.

       Each of the tools used to perform these tasks are described in more

     detail in subsequent chapters in this book and in SAS/C Development

     System User's Guide, Volume 2: Debugger, Utilities, Assembler,

     Version 6.0.

       The SAS/C Development System provides an environment based on

     Intuition from which you can perform each of these tasks. However, you

     can also perform these tasks from the Shell.


 

14 Chapter 2

 

 

 

 

            Using SAS/C Tools from the Workbench

            Screen

         

            The following sections describe how to use the SAS/C Development

            System from the Workbench screen. Specifically, these sections discuss

            the following:

 

            [] setting up a project using the scsetup utility

            [] creating a C source file using the se editor

            [] setting compiler options for the project using scopts

            [] compiling and linking a program using the Build icon

            [] running your program

            [] using the debugger to look at your program.

 

            This chapter provides example directions that you can enter on your

            machine as you read through the chapter. These examples illustrate how

            the many features of the SAS/C Development System work together.

 

 

Setting Up a  To make your C development work easier, you can set up either a new or

     Project  existing project using the scsetup utility. When you set up a project,

              scsetup creates icons for any files or directories that already exist in

              the project and copies the contents of the sc: starter_project

              directory into the project. The starter_project directory contains

              icons for each of the tools you need most often during your development

              work:

 

              SCoptions starts the scopts utility and allows you to specify the

                        compiler options with which you most often want to

                        compile the programs in the directory you are setting up.

 

                 Debug  starts the CodeProbe Source Level Debugger.

                 Build  starts the smake utility. smake is a utility that helps you

                        manage projects that are composed of many files.

 

                  Edit  starts the editor, se. You can substitute your own editor

                        for se by selecting Info from the Workbench pull-down

                        menu and changing the default tool in the Edit icon from

                        sc:c/se to your editor.

 

                It is recommended that you do not place your source code in the sc

              directory tree. Installing updates to the SAS/C Development System is

              easier if you can replace the entire directory without worrying about

              losing any of your own program files.


 

                                            Using Your SAS/C Development System 15

 

 

 

 

                 To set up a project, run the scsetup utility by double-clicking the

               scsetup icon in the sc:c drawer. scsetup asks you for the name of

               the new project drawer (directory). For example, to create a new

               directory called csvuff on the Work: volume, you would enter:

 

 

                  Work:cstuff

 

 

               scsetup creates a new directory called cstuff in Work: that contains

               the four icons described previously.

                 For more information about the scsetup utility, refer to SAS/C

               Development System User's Guide, Volume 2.

 

 

   Creating a  After you set up a directory for your C files, you can start entering your

Source File C  programs. To create a new file, double-click on the Edit icon to start

      with se  the se editor. se displays a window into which you can enter your

               program.

                 Type in the following program:

 

 

                  #include <stdio.h>

                  #include <math.h>

                  #include <proto/dos.h>

                  

                   int main(void)

 

 

                   {

                     int i=42;

                     double d

                   

                     d=i/2;

                     printf("i = %d, d=%2.1f\nl",i,d);

                     Delay(60);

                     return(O);

 

 

 

                 Note: Enter this text exactly as shown. The semicolon missing from

               the declaration of d produces an error message that is used to illustrate

               scmsg, the message browser utility.


 

16 Chapter 2

 

 

 

 

                If you enter any text differently from that shown here, simply use the

              backspace or delete key to delete the incorrect characters and correct the

              error. When you have finished entering the program, you must name the

              file, save it, and close the editor window as follows:

 

                1. Press and hold the right mouse button to display the se menu.

                2. Point to the Project heading in the menu bar to open the Project

                   menu.

                3. Select the Rename option. At the bottom of the screen, se asks you

                   to enter a new filename for the current file.

                4. Type example.c and press Return.

                5. Hold down the right Amiga key and press the letter S to save the

                   file and close the editor window.

 

              Under AmigaDOS 1.3, the icon for this new file is not displayed until you

              close and reopen the window for the directory in which you created the

              file. If necessary, close and reopen the window to display the icon for

              example.c.

                For more information about the se editor, see Chapter 4, "Using se,"

              and Chapter 5, "Controlling se."

 

 

  Compiling,  After you have created a C source program using the editor, you can

    Linking,  and compile, link, and run your program. If you want to compile and link

Running Your  your program with the default compiler options, simply double-click on

     Program  the Build icon. However, if you want to change the default values or

              specify additional options, you can use the scopts utility. With scopts,

              you can set compiler options simply by clicking on the option.

                To successfully run the example shown in this chapter, you need to set

              additional compiler options.

 

 

              Setting Compiler Options with scopts

 

              Usually, you compile all of the programs in a project with the same

              compiler options. The scopts utility allows you to click on the options

              with which you want to compile and to save the options in an

              scoptions file in the project drawer.

                To run scopts, double-click on the SCoptions icon. scopts

              displays the first of several windows on which you can select the options

              with which you want to compile.

                To run the example.c program, you must specify the

              math=standard and the link options. To use the message browser as

              described in the section "Compiling and Linking with the Build icon," you

              must specify the errorrexx option. Also, to use the CodeProbe

              debugger as described in the section "Debugging Your Program," later in

              this chapter, you must specify the debug=symbolflush option.


 

                                              Using Your SAS/C Development System 17

 

 

 

 

                       The link option appears on the first screen that scopts displays, the

                       SAS/C Compiler Options Index screen, as shown in Display 2.1.

 

 

 

           Display 2.1

 The SAS/C Compiler

Options Index Screen

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                  

 

 

                     To select the link option, click once on the NoLink cycle gadget. The

                     gadget changes colors, and the text now reads Link.

                       To select the math=standard option, click on the CODE

                     OPTIONS... gadget, and then click once on the NoMath gadget.

                     NoMath changes to Math=STANDARD. Click on OK to return to the

                     SAS/C Compiler Options Index screen.

                       To select the debug option, click on the COMPILER OPTIONS . . .

                     gadget, and then click three times on the NoDebug gadget. NoDebug

                     changes to Debug=SymbolFlush. Click on the OK gadget to return to

                     the SAS/C Compiler Options Index screen.

                       To select the errorrexx option, click once on the MESSAGE

                     OPTIONS... gadget, and then click on the NoErrorRexx gadget.

                     NoErrorRexx changes to ErrorRexx. Click on OK to return to the

                     SAS/C Compiler Options Index screen.

                       To save the option settings, click on the Save gadget. The scopts

                     utility saves the options you select in the file scoptions in the project

                     directory. When you compile your program, the compiler reads the

                     options from scoptions.


 

18 Chapter 2

 

 

 

 

                   For more information about the scopts utility, refer to SAS/C

                 Development System User's Guide, Volume 2.

 

 

                 Compiling and Linking with the Build icon

                 After you have selected the appropriate options, you can compile and link

                 your program by double-clicking the build icon to start the smake

                 utility.

                   smake examines the drawer and determines that it contains only one C

                 source file, example.c. smake then invokes the sc command to

                 compile example.c using the options you specified with the scopts

                 utility.

                   When the compiler finds the missing semicolon in your program, the

                 compiler invokes scmsg, the message browser. scmsg opens a window

                 in which it displays each of the messages generated by the compiler.

                 Display 2.2 shows the message browser window generated when you

                 compile example.c.

 

 

 

        Display 2.2

The SAS/C Message

   Browser Window

 

                      

                       

 

                      

                      

                      

 

 

 

                      

                      

                      

 

 

 

 

 

 

 

 

 

                    Double click on the message in the message browser window, and the

                 message browser invokes the editor on the file and line number specified

                 in the message, as shown in Display 2.3.


 

                                                  Using Your SAS/C Development System 19

 

 

 

        Display 2.3

  The Edit Window

Showing example.c 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                   Correct the error by inserting a semicolon at the end of the declaration

                 for d. Save the corrected file by selecting the Save & Close option from

                 the Project menu or by pressing Right Amiga-S.

                   Close the message browser window by clicking on the Close gadget,

                 and then close the smake window by pressing Return.

                   Recompile and link your program (also referred to as rebuilding your

                 program) by double-clicking on the Build icon. As before, smake

                 invokes the sc command to recompile your file. smake then invokes the

                 linker, slink, to produce the executable module, example. The linker

                 also creates an icon for the executable module. (If you are running under

                 AmigaDOS 1.3, you need to close then reopen the project drawer to see

                 the icon for example.)

                   For more information about the scmsg and smake utilities, refer to

                 SAS/C Development System User's Guide, Volume 2.

 

 

                 Running Your Program

                 The build process produces an executable module and creates an icon for

                 this module in the project directory. If the icon for this module is not

                 displayed, close and reopen the window for the directory in which you

                 created the file. To run example, double-click on the example icon.


 

20 Chapter 2

 

 

 

 

                    When you run a program from the Workbench screen, the compiler

                  opens a standard I/O window in which your program can display output.

                  In the case of the example program, the output is as follows:

 

                     i = 42, d=21.00

 

                  If you are running under AmigaDOS 1.3, this window closes as soon as

                  your program is finished running. For short programs, this window

                  opens and closes so fast that it is difficult to see what is displayed in it.

                  To make the window stay open for at least a second, the example

                  program calls the AmigaDOS function Delay. If you are running under

                  AmigaDOS 2.0, this window remains open until you click on its Close

                  gadget. For information on changing the attributes of this window, see

                  Chapter 9, "Running Your Program from the Workbench Screen."

 

Debugging Your  When you compile your program with the debug option, you can use the

       Program  CodeProbe debugger to monitor the behavior of your program, line-by-

                  line, as it executes.

                    To run the debugger with the example file, click once on the Debug

                  icon, then hold down the Shift key and double-click on the icon for the

                  executable module. As shown in Display 2.4, CodeProbe opens two

                  windows: the Source window that contains the source code for your

                  program and the Dialog window into which you can enter CodeProbe

                  commands.


 

                                                 Using Your SAS/C Development System 21

 

 

 

         Display 2.4

CodeProbe Windows

    with example.c

                   

 

                   

 

 

 

                   

 

 

 

 

                    

 

 

 

 

 

 

 

 

 

 

 

                   CodeProbe stops on the first line of your main program.

                   To step through your program one line at a time, you can press the

                Return key. Pressing the Return key is equivalent to entering the

                proceed command. The current (highlighted) line is the line that will

                execute next if you press Return. Press Return until the line containing

                printf is the current line.

                  To display the value of a variable, you can use the display command,

                which you can abbreviate as d. To display the value of the variable d,

                enter d d on the command line of the Dialog window. If you have

                already stepped through the line containing d=i/2;, then the debugger

                displays 21 as the value of d.

                  To finish executing your program, enter g (for go) on the command

                line of the Dialog window. You should always finish executing your

                program before quitting CodeProbe, or your machine may be left in an

                uncertain state and may crash later for no reason. To exit from the

                debugger, enter q (for quit).

                  The Debugger has considerably more capabilities than those described

                here. For a complete description of the CodeProbe debugger, refer to

                SAS/C Development System User's Guide, Volume 2.


 

22 Chapter 2

 

 

 

 

                 Using SAS/C Tools from the Shell

 

                 The following sections describe how to use the SAS/C Development

                 System from the Shell. Specifically, these sections discuss the following:

 

                 [] creating a C source file using the se editor

                 [] setting compiler options for the project using scopts

                 [] compiling and linking a program using the sc command

                 [] running your program

                 [] using the debugger to look at your program.

 

                 If you are doing all of your work from the Shell, you do not need to use

                 scsetup to set up a directory for your C files. However, you should

                 create a new working directory using the AmigaDOS makedir command.

                 It is recommended that you do not place your source code in the sc

                 directory tree. Installing updates to the SAS/C Development System is

                 easier if you can replace the entire directory without worrying about

                 losing any of your own program files.

 

 

    Creating a  After you have created a directory for your C files, you can start entering

   Source File  your C programs. To create a new file, enter the se command, as

       with se  follows:

 

                      se

 

                 se displays a window into which you can enter your program.

                   The se editor works the same whether you start it from the

                 Workbench screen or from the Shell. See "Creating a Source File with

                 se" under the previous section, "Using SAS/C Tools from the Workbench

                 Screen," for a description of entering a sample program.

                   Of course, after you save the file and close the window, icons are not

                 displayed. You are prompted for another command.

                   For more information about the se editor, see Chapters 4 and 5 in

                 Part 2, "Using the Screen Editor (se)."

 

 

   Compiling,   After you have created a C source program using the editor, you can

 Linking, and   compile, link, and run your program. If you want to compile your

Running Your   program with the default compiler options, simply enter the sc command

     Program   followed by the name of the source file. However, to successfully run the

                 examples shown in this chapter, you need to set additional compiler

                 options. From the Shell, you can set compiler options using the scopts

                 utility, or you can specify the compiler options on the sc command line.

                 The next section, "Setting Compiler Options with scopts," describes two

                 different ways to use the set options from the Shell. The section


 

                             Using Your SAS/C Development System 23

 

 

 

 

     "Compiling and Linking with sc" describes how to specify options on the

     se command line.

 

 

     Setting Compiler Options with scopts

 

     Usually, you compile all of the programs in a project with the same

     compiler options. The scopts utility allows you to set and save the

     options with which you want to compile the programs in a project.

       From the Shell, you can run scopts in two different ways:

 

     [] You can enter the scopts command followed by the options with

        which you want to compile. For the example programs in this chapter,

        you should enter the following command:

 

          scopts math=standard debug=symbolflush errorrexx link

 

        You can enter the options in uppercase, lowercase, or in mixed case.

        When you specify options on the scopts command, the scopts

        utility does the following:

          1. reads the scoptions file in the current directory, if it exists

          2. adds or changes the options, depending on the options you

             specify on the scopts command

          3. writes the new option settings to the scoptions file in the

             current directory.

 

     [] You can enter the scopts command without specifying options and

        use the scopts screens to set the options:

 

          scopts

 

        scopts displays the first of`several windows on which you can select

        the options with which you want to compile. For the example program

        in this chapter, you should select the math=standard, link,

        errorrexx, and debug=symbolflush options as described in

        "Setting Compiler Options with scopts" under the previous section,

        "Using SAS/C Tools from the Workbench Screen."

 

        The scopts utility saves the options you select in the file scoptions

      in the project directory. When you compile your program, the compiler

      reads the options from scoptions.

        For more information about the scopts utility, refer to SAS/C

      Development System User's Guide, Volume 2.


 

24 Chapter 2

 

 

     Compiling and Linking with sc

 

     If you chose to use scopts to set compiler options, then you can

     compile and link your example.c program by entering the sc

     command as follows:

 

                          sc example.c

 

     sc reads the options from the scoptions file and compiles your

     program.

       However, if you chose not to use scopts to set compiler options, you

     must enter the following command to compile and link the example.c

     program:

 

             sc math=standard debug=symbolflush errorrexx link example.c

 

        In either case, you specified the link option, so the compiler calls

      slink to link your program using the correct libraries. If your program

      links correctly, the linker creates an executable module named example.

        When the compiler finds the missing semicolon in your program, the

      compiler invokes scmsg, the message browser. scmsg opens a window

      in which it displays each of the messages generated by the compiler.

      Display 2.2, earlier in this chapter, shows the message browser window

      generated when you compile example.c. (However, Display 2.2 shows

      the smake window behind the message browser window. On your

      machine, you will see a Shell window.)

         Double-click on the message in the message browser window. The

      message browser invokes the editor on the file and line number specified

      in the message, as shown in Display 2.3, also shown earlier in this

      chapter.

        Correct the error by inserting a semicolon at the end of the declaration

      for d. Save the corrected file by selecting the Save & Close option from

      the Project menu or by pressing Right Amiga-S. Close the message

      browser window by clicking on the Close gadget.

        Recompile and link your program by entering the sc command as

      before. slink produces the executable module example.

        For more information about the sc command, see Chapter 8,

      "Compiling and Linking Your Program."

 

      Running Your Program

      To run a program, enter the program name at the AmigaDOS prompt. To

      run example, enter the following:

 

          example


 

                                                  Using Your SAS/C Development System 25

 

 

                   The example program displays the following output:

 

                      i = 42, d=21.00

 

Debugging Your  When you compile your program with the debug option, you can use the

        Program  CodeProbe debugger to monitor the behavior of your program, line by-

                   line, as it executes.

                     To run the debugger with the example file, enter the following

                   command at the Shell prompt:

 

                      cpr example

 

                   As shown in Display 2.4, CodeProbe opens two windows: the Source

                   window that contains the source code for your program and the Dialog

                   window into which you can enter CodeProbe commands.

                     Enter debugger commands as described in "Debugging Your Program"

                   under the previous section, "Using SAS/C Tools from the Workbench

                   Screen."

                     To finish executing your program, enter g (for go) on the command

                   line of the Dialog window. You should always finish executing your

                   program before quitting CodeProbe, or your machine may be left in an

                   uncertain state and may crash later for no reason. To exit from the

                   debugger, enter q (for quit).

                     The Debugger has considerably more capabilities than those described

                   here. For a complete description of the CodeProbe debugger, refer to

                   SAS/C Development System User's Guide, Volume 2.

 

 

 

                   Using Icons

 

                   The tools included with the SAS/C Development System produce icons for

                   most files that they generate. The sc: icons drawer contains template

                   icons used by these tools. The icons in this drawer all have names

                   starting with def_. With the exception of def_exe and def_se, the

                   letter or letters after the def_ represent the file extension of the files for

                   which the icon is intended. For example, the def_c icon is the icon for

                   files that end in .c (C source files), and the def_h icon is the icon for

                   files that end in .h (C header files). If a file does not have an extension

                   (that is, the filename does not contain a period), the entire filename is

                   used as an extension. Therefore, you can create a default icon for

                   smakefile files called def_smakefile. If a SAS/C tool needs to

                   create an icon, it copies the icon matching the file's extension from

                   sc: icons to the correct directory and renames the icon to match the

                   new filename.


 

26 Chapter 2

 

 

 

 

       If you save a file for which the editor cannot find an icon in

     sc: icons, the editor uses the default icon def_se. Whenever the

     linker creates icons for executable modules (which do not have filename

     extensions), it uses the icon def_exe.

       The following table lists, for each tool that creates icons, the different

     types of items for which they create icons and the default icon each tool

     uses.

 

 

                       Command      Item                    Icon

                       __________________________________________________

                       sc           listing files           def_lst

                                    object files            def_o

                                    preprocessor output     def_p

                                    generated prototypes    def_h

                                    GST files               def_gst

 

                       slink        executable programs     def_exe

                                    map files               def_map

 

                       se           any saved file          def_se is used if the correct icon

                                                            does not exist

 

                       scsetup     creates icons for any file with an extension for which an

                                    icon exists in sc: icons.

 

 

         By default, the SAS/C Development System does not create icons for

       object (.o) files. However, the compiler and assembler check for an icon

       called def_o when they create an object file. If you want to see icons for

       object files, create an icon named def_o. info using any icon editor

       and save it to the sc: icons drawer under the name def_o.

         To prevent all of the SAS/C commands from creating icons, rename the

       sc: icons drawer to sc: noicons or to any other name you like. If a

       tool cannot find the icons drawer, it does not create an icon.

         To prevent a specific type of icon from appearing, rename or delete the

       template for that icon from the sc: icons drawer. For example, if you

       do not want your header (.h) files to have icons, rename or delete the

       def_h icon.

         You can modify the icons in the sc: icons drawer in any way you

       choose. For example, you could replace the provided imagery with your

       own art work.

          For additional information on using icons, refer to the descriptions of

       the Information option or Information window in Using the System

       Software (Commodore-Amiga, Inc. 1990).


 

                                                                          27

 

 

 

3 Getting Help

 

        27 Introduction

        27 Using the Help System

        29 Contacting the Technical Support Division

                 29 Deciding When to Call Technical Support

                 30 Contacting Technical Support by Phone, Mail, or Fax

                 31 Contacting Technical Support through BIX

                 31 Contacting Technical Support through Internet or Usenet

                 33 Collecting the Information Needed by Technical Support

 

 

 

 

        Introduction

 

        This chapter describes how to get help with any of the features of the

        SAS/C Development System. You have three primary sources of help:

 

        [] Appendix 1, "Solving Common Problems." Appendix 1 describes

           solutions to the questions that users ask most frequently when they

           contact the Technical Support Division. This appendix also includes

           Questions that the Technical Support Division anticipates will be

           generated by the conversion to Version 6.

        [] The online help system. This system describes how to use each of the

           features provided by the SAS/C Development System.

        [] The Technical Support Division. You can contact the Technical Support

           Division if, for example, the compiler generates bad object code or

           error messages for correct code. Read the section "Contacting the

           Technical Support Division," later in this chapter, before contacting the

           Technical Support Division.

 

 

 

        Using the Help System

 

        The SAS/C Development System provides an extensive online help facility

        using the AmigaGuide hypertext system provided by Commodore. From

        within se, scopts, scmsg, and CodeProbe, you can display help

        information by pressing the Help key. Within CodeProbe, you can also

        enter the help command on the command line. Display 3.1 shows the

        help screen that is displayed when you press the Help key while inside

        se.


 

28 Chapter 3

 

 

 

         Display 3.1

Editor Help Screen

                                                                                                          

 

 

 

 

 

 

 

 

 

                                                                   

                                                                    

                      

                                                                       

 

 

 

                          You can also display help inform ation by invoking the A migaGuide

                        system directly with the following command:

 

                           amigaguide database-name

 

                        The help databases are located in the directory sc: help. You can

                        specify one of the following databases:

 

                        scmsg . guide

                          describes the error and warning messages returned by the compiler.

                          When you press the Help key from within scmsg, you are accessing

                          this database.

 

                        cpr.guide

                          describes the purpose of and parameters accepted by each of the

                          CodeProbe commands. When you press the Help key from within

                          CodeProbe, you are accessing this database.

 

                        se.guide

                          describes how to use se. When you press the Help key from within

                          the editor, you are accessing this database.

 

                        sc_util.guide

                          describes how to use each ofthe utilities provided with the SAS/C

                          Development System.


 

                                                                            Getting Help 29

 

 

 

                        sc . guide

                           describes each of the options you can specify in the sc command.

                           When you press the Help key from within scopts, you are accessing

                           this database.

 

                        sc_lib.guide

                           describes each of the library functions. This database also allows you

                           to display lists of functions by category or view an alphabetical list of

                           all functions.

 

                         To navigate through a database, simply click on any of the buttons that

                       appear on a screen or select an option from the menu bar. The menu bar

                       on all of the help screens contains the following options:

 

                          Contents  displays the main help screen for the database that you

                                      are viewing.

 

                              Index  is a standard AmigaGuide option that is not used by the

                                      SAS/C Development System.

 

                               Help  displays information about using the help facility.

 

                            Retrace  backtracks through the help screens that you have already

                                      displayed.

 

                          Browse <  displays the previous screen in the database.

 

                          Browse >  displays the next screen in the database.

 

                          To exit the help system, click on the Close gadget.

 

 

 

                       Contacting the Technical Support Division

 

                       When you purchased the SAS/C Development System, you received

                       access to the SAS Institute Technical Support Division. Technical Support

                       can help you with unexpected problems that might arise with the

                       compiler. Technical Support also gathers users' comments on the current

                       product and their suggestions for enhancements.

 

 

Deciding When to    Before you call the Technical Support Division, read through Appendix 1,

    Call Technical   "Solving Common Problems." This appendix describes the solutions to

          Support   several frequently encountered problems.

                       If you cannot find the answer to your problem in Appendix 1, you may

                     need to call Technical Support. The following list describes some of the

                     more common situations for which you should call Technical Support:

 

                       [] The compiler generates an error for code that is correct.

                       [] The compiler does not generate an error or warning for code that is

                          incorrect.


 

30 Chapter 3

 

 

 

                       [] The compiler generates bad object code.

                       [] The compiler detects an internal error (CXERR) condition.

                       [] The compiler or any utilities crash or end abnormally.

                       [] The library functions or utilities do not perform as specified.

                       [] The manuals contain errors or do not provide enough information.

 

 

     Contacting   If you live in the United States, Europe, or Canada, you can contact the

      Technical   Technical Support Division in writing, by phone, or by fax:

        Support   by

    Phone, Mail,

         or Fax    Address:          SAS Institute Inc.

                                      ATTN: Amiga SAS/C Technical Support

                                      SAS Campus Drive

                                      Cary, North Carolina 27513

                                      USA

 

                       Phone:       919-677-8009

 

                        Fax:         919-677-8123

 

 

 

                       If you live in Australia, you should contact our Australian office:

 

 

 

                       Address: SAS Institute Australia Pty. Ltd.

                                    ATTN: Amiga SAS/C Technical Support

                                    Private Bag No. 52

                                    Lane Cove, NSW 2066

 

                       Phone:       (02) 428 0428

 

                       Fax:         (02) 418 7211

 

 

 

 

                       If you live in New Zealand, you should contact our New Zealand office:

 

 

 

                       Address:    SAS Institute (NZ) Ltd.

                                    ATTN: Amiga SAS/C Technical Support

                                    PO Box 10-109

                                    The Terrace

                                    Wellington

 

                       Phone:      (04) 727 595

 

                       Fax:         (04) 727 055


 

                                                                          Getting Help 31

 

 

 

 

                   Whether you choose to call, send a letter, or send a fax, make sure you

                   include or have with you all of the information described in the section

                   "Collecting the Information Needed by Technical Support."

 

 

                   Contacting BIX (Byte Information Exchange) is a subscription service bulletin board

       Technical   system available to users in Canada and the Continental United States.

Support through  You can contact BIX at the following address:

            BIX

 

 

                     Address: BIX/General Videotex Corporation

                              1030 Massachusetts Avenue

                              Cambidge, MA 02138

                              USA

 

                     Phone:       1-800-695-4775 (outside Massachusetts)

                                   617-354-4137 (inside Massachusetts)

 

 

 

 

                       You can sign up for a BIX subscription as follows:

 

                       1. Through a modem, dial BIX at 1-800-225-4129.

                       2. At the login: prompt, enter bix.

                       3. At the Name? prompt, enter bix.amiga.

 

                       When you subscribe to BIX, you receive a user's manual that covers all

                     aspects of their services, including:

 

                     [] the various conferences available

                     [] how to access a conference

                     [] how to access source listings.

 

                       SAS Institute maintains a support conference on BIX named sas.c.

                     This conference is monitored Monday through Friday for new messages.

                     You can contact Technical Support by posting messages to this

                     conference.

                       Note: Do not post your registration number to the public conference.

                       You can also send private email messages on BIX to the ID sas.c (the

                     same name as the conference).

                       Whether you choose to post to the public conference sas.c or to send

                     a private message, make sure you include all of the information described

                     in the section "Collecting the Information Needed by Technical Support."

 

 

       Contacting  You can also contact the Technical Support Division through Internet

        Technical  using the EMITS (Electronic Mail Interface to Technical Support) facility.

Support through

      Internet or

           Usenet

 


 

32 Chapter 3

 

 

 

 

         EMITS logs your mail for the attention for the Technical Support Division

         and sends an email message acknowledging receipt of your mail.

         Before you can use this facility, you must register with EMITS. If you

         have accounts on multiple machines, register from the same host system

         that you want to use for sending messages to the Technical Support

         Division. EMITS extracts your email address from the header of your

         message and uses this address as your account ID. You may register from

         multiple machines if you want to send messages to Technical Support

         from more than one machine. Register with EMITS by sending the

         following information to support@sas.com:

 

             ./register=your name

             ./site=registration number

             ./company=company name or your name (if registering a private copy)

             ./phone=phone number

 

          Include the word EMITS in the subject of the message. Begin the ./ in

          column 1.

          Mail that does not include all of this information or that is syntactically

          incorrect is returned to you.

          Here are some examples:

 

               ./register=John Doe

               ./tsite=SAS-OOOOO1

               ./company=Jane Doe

               ./phone=(555)555-5555

 

             Note: Your phone number does not need to conform to this syntax.

           You can specify phone numbers in any form necessary.

              When your account has been added, EMITS notifies you by email and

           sends you a complete guide to using EMITS.

              There are several points to keep in mind when sending mail to EMITS.

 

            [] All email messages to EMITS should be sent to support@sas.com.

            [] All email messages intended for EMITS must contain the words EMITS

               in the subject.

            [] EMITS is not case sensitive.

            [] EMITS can process only one request for each email message you send.

               For example, send two separate email messages to

               support@sas . com to register and to request the help file.

 

              When you contact Technical Support through EMITS, make sure you

            include in your message all of the information described in the next

            section.

 


                                                                       Getting Help 33

 

 

 

 

Collecting the  The Technical Support staff requires specific information before they can

  Information   handle your questions. Include the following information in your

   Needed by   correspondence, or have this information ready if you call:

    Technical

                 Registration number

                   Technical Support cannot answer any questions unless you provide a

                   valid registration number. This number is found on a cardboard sheet

                   included with the compiler documentation. The postcard that is part of

                   that sheet should be torn loose and mailed to SAS Institute as soon as

                   possible after purchasing the compiler. Please keep the other portion

                   of that sheet with your documentation. If you have upgraded the

                   compiler from an older, registered release, you do not need to send in

                   the new card. If you decide to send in the new card, please note your

                   old number, so that it may be removed from our database. If you do

                   not know your registration number, please contact Book Sales at

                   (919) 677-8000, extension 5042.

                     If you purchased your copy of the compiler from someone who has

                   already registered with us, please contact Book Sales with the

                   following information:

 

                   [] the name, address, phone number, and registration number for the

                      previous owner, so that their name may be removed from our

                      database.

                   [] your name, address, phone number, and registration number so

                      that you may be added to the database and become eligible for

                      Technical Support.

 

                   Version number

                      The version number of the compiler is displayed in the header that

                      appears on the screen each time you run the compiler. You can also

                      display the version number with the AmigaDOS version command.

 

                   Return address and phone number

                      If you send a letter or fax, include your return address in the

                      correspondence--not just on the envelope. Whether you call or

                      write, Technical Support will need a phone number where you can be

                      reached from 9:00 am to 5:00 pm EST.

 

                   Complete problem description

                      Include all error messages and symptoms of the problem. If you are

                      not able to call when you have access to your machine, write down

                      the following information before contacting Technical Support:

 

                      [] the exact text of any error messages, guru meditation numbers, and

                         so on, that you see on the screen

                      [] whether the problem occurs when you are compiling, linking, or

                         executing your program

 


 

34 Chapter 3

 

 

 

 

                      [] any commands, options, or code needed to consistently reproduce

                         the problem (for example, compiler or linker options and CodeProbe

                         commands).

                      [] any parts of the product that you chose not to install.

                      [] the configuration of your machine, including the type of processor,

                         the amount of memory, and the version of the AmigaDOS operating

                         system.

 

 

                       If you have problems with a large piece of code, try to isolate the code

                       that is causing the problem into a test case of 30 lines or less.

                       Technical Support staff can respond faster if you can reduce the

                       problem to a small test case.

 


                                                                               35

 

 

 

 

      [] Part 2

         Using the Screen

         Editor (se)

 

 

 

 

 

Chapters     4 Using se

              5 Controlling se

              6 Customizing the Editor

              7 Using the AREXX Interface to se

 


 

36


 

                                                                          37

 

 

 

 

 

4  Using se

 

 

         37 Introduction

         38 Starting the Editor

         39 Reading the Status Line

         40 Moving Around in a File

         40 Entering and Editing Text

                 41 Searching for and Replacing Character Strings

                 43 Working with Blocks of Text

                 44 Undoing Your Last Change

                 45 Using Keystroke Macros

                 46 Entering Control Characters

         46 Saving Your File and Exiting se

         47 Managing Windows

         48 Compiling from within the Editor

         48 Getting Help

 

 

 

 

        Introduction

 

        This chapter describes how to use the editor, se. Specifically, this chapter

        describes how to:

 

         [] invoke the editor

         [] insert text into and delete text from a file

         [] search for and replace character strings

         [] create and use keystroke macros

         [] save your file and exit the editor

         [] open, close, and switch between windows

         [] compile your program from within se

         [] get help from within se.

 

         This chapter describes the most commonly used features of se. It does

         not cover all of the commands available or all of the ways in which you

         can execute commands. Chapter S, "Controlling se," contains

         comprehensive lists of the commands available in se.

           Note: The instructions in this chapter assume that you are using the

         default keystroke definitions. If you have customized your key definitions

         with the se configuration window, use your customized keystrokes when

         required.

 


 

38 Chapter 4

 

 

 

 

       Starting the Editor

       You can start se by:

 

       [] double-clicking on the Edit icon.

       [] entering the se command at the Shell prompt.

 

       The se command has the following format:

           se [option] [filename]...

 

        where option is one of the following:

 

        -v

           displays the se version number and copyright statement and exits se.

           If you specify the -v option, se ignores anything else you specify in

           the se command. You need the version number from this display if

           you call the Technical Support Division for help with se.

 

        -dfilename

           uses the data file that you specify instead of se . dat. This file

           contains keyboard definitions and default information, including color,

           window size, and so on. When you start the editor, se looks for a

           data file. By default, se looks for se . dat in env: sc and, if it does

           not find the file, se looks in sc: env. You can tell se to use a

           different data file by specifying the filename with the -d option.

 

           If you start se by double clicking on the Edit icon or by entering the

         se command without a filename, se displays an empty edit window.

           When you start se from the Shell prompt, you can specify the names

         of the files that you want to edit. If you specify more than one filename,

         se opens a window for each file. se displays the first file in the top

         window and the second file in the bottom window. If you enter more

         than two filenames, you must press the F6 (cycle windows) key to display

         the additional files. You can specify up to nine filenames on the se

         command line.

           For example, you can edit the files hello.c and example.c from

         the sc/examples directory by entering the following commands:

 

 

                          cd sc:examples

                          se hello.c example.c

 

 

          Display 4.1 shows the two edit windows displayed by se.


 

 

                                                                               Using se 39

 

 

 

         Display 4.1

Editing hello.c and

          example.c

 

                     

                     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                     

                      At the bottom of each edit window is a status line that shows, among

                      other things, the name of the file in that window. The last two lines on

                      the screen are the lines that se uses to display messages and to prompt

                      you for additional information.

                        You can have up to nine files open at one time. To open an additional

                      file, select Open Window from the Windows pull-down menu. se asks

                      you for the file that you want to open. If you are running AmigaDOS 2.0,

                      se displays a file requester. Each open file is displayed in a different

                      window, and you can switch between files by selecting Switch Windows

                      from the Windows pull-down menu. The current window is the window

                      that contains the cursor.

                        The default text window size is 20 lines by 78 columns. You can set

                      each window to occupy a half screen or a full screen by selecting Toggle

                      Display Size from the Windows pull-down menu.

 

 

                      Reading the Status Line

 

                      The status line contains the following items:

 

                      []  current line number.

                      []  current column number. If you turn on the Column Display option

                          from the se configuration menu, se displays the current column

                          number in the status line. Chapter 6, "Customizing the Editor,"

                          describes how to use the se configuration menu.

 


 

40 Chapter 4

 

 

 

 

                       [] current filename.

                       [] the current mode. You can switch between two modes, insert mode

                          and overwrite mode, by pressing the Insert key (NUM-O). In insert

                          mode, any character you enter is inserted at the current cursor

                          position. In overwrite mode, any character you enter replaces the

                          character at the current cursor position.

                       [] window number. se displays the window number within braces. For

                          example, for window number 2, se displays ( 2 ).

                       [] keystroke saver active indicator. By default, the Alt-n key sequence

                          starts recording your keystrokes in that macro. On the status line, se

                          displays the number n that you entered. For more information on

                          creating keystroke macros, see "Using Keystroke Macros," later in this

                          chapter.

                       [] marked block indicator. When you mark a block of text, se displays

                          [*] in the status line. The section "Working with Blocks of Text,"

                          later in this chapter describes how to mark a block of text.

 

 

 

                       Moving Around in a File

 

                       In addition to the arrow keys, you can use the following keys to move

                       around in your file:

 

                       Home (NUM-7)

                          moves the cursor to the beginning of the current line

 

                       End (NUM-1)

                          moves the cursor to the end of the current line

 

                       Control-Home

                          moves the cursor to the beginning of the file

 

                       Control-End

                          moves the cursor to the end of the file

 

                       PgUp (NUM-9)

                          displays the previous page of text

 

                       PgDn (NUM-3)

                          displays the next page of text.

 

 

 

                       Entering and Editing Text

 

                       The following paragraphs describe the most common commands used to

                       insert and delete characters. se offers many more commands that are

                       described in Chapter 5, "Controlling se."

                       When you first open your file, you are in insert mode. Any character

                       that you enter is inserted at the current cursor position. If you press the

 


 

                                                                                Using se 41

 

 

 

 

                     Insert key, se switches to overwrite mode, and any character you enter

                     replaces the character at the current cursor position. Each time you press

                     the Insert key, you switch modes.

                       As stated previously, the default window width is 78 columns. The

                     maximum line length in se is 256 characters. If you have not selected

                     Autowrap from the Options pull-down menu in the se configuration

                     menu, then se does not automatically start a new line when you type

                     past column 78. Instead, se moves the text to the left so that you can

                     still see what you are typing. When you press Return, se redisplays the

                     window beginning with column 1 and displays a greater than (>) sign at

                     the right side of the screen on the line that exceeds 78 columns. (For

                     more information about the Options pulldown menu, see Chapter 6,

                     "Customizing the Editor.")

                       You can use the following keys to delete text:

 

                     Backspace deletes the character to the left of the cursor

 

                     Delete deletes the character at the cursor position

 

                     Control-Y deletes the current line

 

                     Control-E deletes all characters from the current cursor position to the

                                 end of the current line.

 

                     If you decide you want to restore the last line that you deleted with

                     Control-Y, press Alt-Y.

 

 

     Searching for  The following sections describe the Search command and the Search and

    and Replacing  Replace command. To use these commands, you can enter strings as

Character Strings  regular expressions or as simple character strings. By default, se expects

                     you to enter regular expressions. Regular expressions are character

                     strings that may contain characters that have special meanings. For

                     example, abcd, a little lamb, and [tT]+he$ are all valid regular

                     expressions. "Entering Regular Expressions," later in this chapter,

                     provides additional information on using regular expressions under se.

                       If you select String Matching as the Searches Method in the se

                     configuration menu, then se interprets any special regular expression

                     symbols as plain text.

 

                     Searching for Character Strings

                     To search for a character string, press Right Amiga-F. se asks you to

                     enter the string for which you want to search:

 

 

                          REGULAR EXPRESSION SEARCH STRING: (MENU KEY to search backwards)

 

 

                     To search forward (from the current position toward the end) through

                     the file, type the character string and press Return.

 


 

42 Chapter 4

 

 

 

 

          Note: The Search and Search and Replace commands are case-

        sensitive. Enter the character string exactly as it appears in the file.

          To search backward (from the current position toward the beginning)

        through the file, press the F2 key, and se displays the following prompt:

 

 

                         (BACKWARDS) REGULAR EXPRESSION SEARCH STRING:

 

 

         Type the character string and press Return.

           After you press Ruturn, se positions the cursor at the first occurrence

         of the character string. To repeat the search, press Right Amiga-A.

 

 

         Replacing Character Strings

         To replace one character string with another character string, press Right

         Amiga-R. se displays the same prompt as if you had pressed Right

         Amiga-F. You can type the character string that you want to replace and

         press Return, or you can press the F2 key if you want to search

         backward through the file. If you press F2, se displays the same prompt

         as if you were simply searching for the string, and you should type the

         character string that you want to replace and press Return.

           After you enter the character string for which you want to search, se

         prompts you for a second character string:

 

 

                         REPLACE STRING:

 

 

          Type the string with which you want to replace the first character string

          and press Return. se then asks you if you want to be prompted before it

          replaces any occurrences of the first string with the second string:

 

 

                         REPLACE:  Prompt   No Prompt

 

 

          If you want se to ask you before it replaces any strings, select Prompt.

          (Use the arrow keys to highlight Prompt and press Return, or press the

          letter p.)

            If you select No Prompt, se replaces all occurrences of the first string

          with the second string from vhe current position through the remainder

          of the file. (That is, to the end of the file for a forward search or to the

          beginning of the file for a backward search).

            If you select Prompt, se positions the cursor at the first occurrence of

          the character string, and asks you what you want to do:

 

 

                 REPLACE:  Yes  No  Quit  Global

 


 

                                                                            Using se 43

 

 

 

 

                 Select one of the options:

 

                    Yes  replaces the string and positions the cursor at the next

                          occurrence of the character string.

 

                    No   moves the cursor to the next occurrence of the character string.

 

                   Quit  stops the search and replace without replacing any strings.

 

                 Global  replaces all remaining occurrences of the string without

                         displaying any prompts.

 

                 You can highlight your selection by pressing the arrow keys or by

                 pressing the first letter of the option.

 

 

                 Entering Regular Expressions

                 As previously stated, regular expressions are character strings that may

                 contain characters that have special meanings. Regular expressions are

                 also referred to as patterns.

                   Refer to the section "Specifying the Pattern" in the description of the

                 grep utility in`SAS/C Development`System User's Guide, Volume 2:

                 Debugger, Utilities, Assembler, Version 6.0 for a complete description of

                 entering regular expressions. se supports regular expressions in the

                 same manner as grep except that you do not need to enclose in double

                 quotes (") a string that contains spaces. For example, to search for the

                 string a little lamb, you would enter a little lamb instead of "a

                 little lamb".

 

 

 Working with  You can copy, delete, move, print, and write entire blocks of text within

Blocks of Text  the same file, between different files, or to and from the clipboard. To

                 perform an operation on a block of text, you must first mark the block.

                   You can mark a block of text in one of two ways:

 

                 []   Position your cursor on the first character that you want included in

                      the block, and press Control-[. se displays a left bracket in the status

                      line. Then, position your cursor after the last character that you want

                      included in the block, and press Control-].

                  []  Position your mouse cursor on the first character that you want

                      included in the block, and press and hold down the left mouse button.

                      Move the mouse cursor to the last character that you want included in

                      the block, and release the mouse button.

 

                      se displays the marked block in reverse video and displays [*] in the

                     status line. You can have only one marked block at a time.

                       After you have marked a block, you can delete or print the block by

                     selecting the appropriate option from the Block pulldown menu. You can

                     move or copy the block to another open file by positioning the cursor at

 


 

44 Chapter 4

 

 

 

 

               the location to which you want to move or copy the block and selecting

               the appropriate option from the Block pull-down menu. You can also use

               the keyboard shortcuts displayed beside the menu selection.

                 To write the block to a file that is not open, select the Write option

               from the Block pull-down menu. se asks you to enter the name of the file

               to which you want to write the text:

 

 

                     WRITE BLOCK TO FILE:  Filename

 

 

               Type the appropriate filename and press Return. se writes the block to

               the filename you enter. The block text replaces any text that is already in

               the file.

                 If you mark a block of text and then decide that you do not want to

               perform any operations on the block, you can unmark the block by

               pressing Control-[, then Control-] without moving the cursor.

                  Note: The Read option in the Block pull-down menu performs the

               same function as the Insert File option in the Project menu.

 

 

Undoing Your  se remembers the changes you entered for the last 50 lines that you

 Last Change   changed, inserted, deleted, and so on. You can undo these changes with

                 the undo command. You can run the undo command in any of three

                 ways:

 

                     [] press Right Amiga-U

                     [] press Control-U

                     [] select Undo Last Change from the Project menu.

 

                  When you select the undo command, se displays a prompt depending on

                  the last command you entered:

 

 

                      UNDO -- DELETE INSERTED LINE?:  Yes  No

                      UNDO -- DELETE ADDED BLOCK?:  Yes  No

                      UNDO -- RESTORE DELETED BLOCK?:  Yes  No

                      UNDO -- RESTORE DELETED LINE?:  Yes  No

                      UNDO -- RESTORE REPLACED LINE?:  Yes  No

 

 

                   Select the appropriate answer and press Return.

                     Note: se remembers changes for the last 50 lines only. If you delete

                   or add a block of text larger than 50 lines, se remembers only the first

                   50 lines.


 

 

                                                                              Using se 45

 

 

 

 

Using Keystroke  If you need to perform repeatedly a task that requires several keystrokes,

         Macros  you may want to create a keystroke macro to do the task. If you save

                   your keystrokes as a macro, then you can perform the task by pressing

                   only the Alt key and a function key.

 

 

                   Creating and Replaying Keystroke Macros

 

                   To create a keystroke macro, hold down the Alt key and press a number

                   (0-9) key (for example, Alt-O). The number that you press is displayed in

                   the right side of the status line between the window number and the

                   marked block indicator (if present). se displays the following message:

 

 

                        Key Saver Begun

 

 

                      Note: If you press 0, the status line shows the number 10.

                      From this point, all of your keystrokes are stored as part of the macro.

                    Enter all of the keystrokes necessary to perform the task. After you have

                    completed the task, press Alt and the same number key again to stop

                    recording keystrokes. To execute, or replay, the macro, press Alt-Fn,

                    where n is the number you pressed to define the macro (for example,

                    Alt-F10).

                      Any macros you define are saved until you exit from se. The following

                    section, "Saving and Reloading Keystroke Macros," describes how to save

                    keystroke macros in a file and reuse them later.

 

 

                    Saving and Reloading Keystroke Macros

                    If you do not save your keystroke macros in a file or convert them to a

                    key as described under "Assigning a Macro to a Different Key," they are

                    lost when you complete your editing session and terminate se.

                      To save your keystroke macros in a file, select the Save Macros option

                    from the Project pull-down menu. se prompts you for a filename in

                    which to save the macros:

 

 

                        SAVE MACRO FILE: SPECIFY MACRO FILENAME (default is SE.MAC)

 

 

                    Type a filename and press the Return key.

                      To reuse your macros, select the Load Macros option from the Project

                    pull-down menu. se prompts you for the name of the file in which you

                    saved the macro definitions:

 

 

                        LOAD MACRO FILE: SPECIFY MACRO FILENAME (default is SE.MAC)

 


 

46 Chapter 4

 

 

 

 

                     Type the filename and press the Return key. The file that you specify is

                     loaded over any macro files that you may have already loaded. se does

                     not check the file to determine if the file is a valid macro file.

 

 

                     Assigning a Macro to a Different Key

                     When you create a keystroke macro, that macro is assigned to one of the

                     10 possible Alt-Fn key sequences. If necessary, you can assign one or

                     more of the macros to a different key sequence. For example, you may

                     want to assign the Alt-F10 macro to Control-Z.

                       After you assign a macro to a key, you can edit and save the macro

                     using the se configuration window.

                       To assign a keystroke macro to a different key sequence, select the

                     Convert Macro to Key option from the Options pull-down menu. se asks

                     you to enter the macro number:

 

 

                         Enter the macro number to convert to a key(l-10)

 

 

                     Type the appropriate number and press Return. To convert macro

                     number 10, type the number 10, not just a 0 as you did when you

                     created the macro.

                       se displays the keymap portion of the configuration window. Select the

                     key sequence to which you want to assign the macro by clicking on or

                     pressing the appropriate keys such as the Control key and the letter Z.

                     After you have selected the keys, click on the Close gadget.

                       To save the macro assignment for your next editing session, you must

                     redisplay the se configuration menu by selecting the Configuration

                     Window option from the Options pull-down menu. Then, click on the

                     Save gadget or select the Save As option from Project pulldown menu.

 

Entering Control   You can enter control characters into your text file by preceding the

      Characters   control character with the se escape character, Control-\. For example,

                    to enter a form feed character into your text file, press

                    Control-\ Control-L.

 

 

 

                    Saving Your File and Exiting se

 

                    After you have finished editing your file, you can save the file, exit the

                    file without saving your changes, and/or exit se.

                      You cannot save an unnamed file. If you started se by double clicking

                    on the Edit icon or by entering the se command without a filename,

                    then you must name the file before you can save it. To name the file,

 


                                                        Using se 47

 

 

 

 

     select the Rename option from the Project pulldown menu. se asks you

     to enter a filename:

 

 

       ENTER NEW FILENAME for current file:

 

 

     Type the appropriate filename and press Return. You can now save the

     file and quit se.

       To save your file and/or quit the editor, select the appropriate option

     from the Project pull-down menu:

 

     Save & Close

        saves your file and closes the current window. If you have only one

        window open, this option also terminates se. If you have more than

        one window open, the next window becomes the current window.

 

     Close Window

        closes the current window. This option does not save your file. If you

        have only one window open, this option also terminates se. If you

        have more than one window open, the next window becomes the

        current window.

 

     Save & Continue

        saves your file. This option does not close any windows.

 

     Save & ReOpen

        saves and closes your file, then asks you for the name of a new file to

        edit. This option does not open an additional window to edit the new

        file.

 

     Exit SE

        terminates the editor. This option does not save your file.

 

     You may also use the keyboard shortcuts displayed beside the menu

     options.

 

 

 

     Managing Windows

 

     In se, you can have up to nine files open at one time, and each open file

     is displayed in a different window.

       To open an additional window, select the Open Window option from

     the Windows pull-down menu. se asks you for the name of the file to

     read into the new window:

 

 

        OPEN WINDOW: Filename (Menu Key for view mode only)

 

 

     Type the appropriate filename and press Return.

 


48 Chapter 4

 

 

 

 

          If you have only one window open, that window occupies the entire

        screen. By default, if you open two or more windows, se displays two

        windows at a time in split-screen mode. In split-screen mode, each

        window occupies half of the screen. Display 4.1, earlier in this chapter,

        shows two windows in split-screen mode.

          In split-screen mode, you can move between the two currently

        displayed windows by pressing Control-F6. Within the same window, you

        can cycle through the remaining (hidden) windows by pressing F6.

          To switch between split-screen mode and full-screen mode, select the

        Toggle Display Size option from the Windows pull-down menu. To display

        the names of each open file, select the Display Names option from the

        Project pull-down menu.

 

 

 

        Compiling from within the Editor

 

        Before you compile your program, make sure that you have the correct

        options specified in scopts. To specify compiler options from within se,

        press Control-F4 to run the scopts utility. If you change any settings,

        save the new settings before exiting scopts.

          To compile your program, press F4. se displays a message telling you

        that your program is compiling. If the compiler finds any errors in your

        program, it sends the errors to the scmsg utility, and scmsg displays

        the errors in the Message Browser window. To locate the line causing an

        error, double-click on the error message. To move to the next error,

        press F5.

          For additional information on using the scmsg and scopts utilities,

        refer to Chapter 2, "Using Your SAS/C Development System," or to the

        description of the scmsg utility in SAS/C Development System User's

        Guide, Volume 2.

 

 

 

        Getting Help

 

        To display help in se, press the Help key or press F1. se displays either

        the SAS/C Screen Editor Help menu or context-sensitive help information

        for the command you are executing. Chapter 3, "Getting Help," describes

        how to use the help system.


 

                                                                         49

 

 

 

 

 

5 Controlling se

 

 

 

 

   49 Introduction

 ` 50 Selecting Menu Options

   51 Moving Around in the File

   52 Inserting Text

   52 Delehng Text

   53 Working with Blocks of Text

   53 Searching for and Replacing Strings

   54 Managing Windows

   54 Changing Colors

   55 Creating and Using Keystroke Macros

   55 Editing a New File

   56 Naming Files

   56 Undoing Changes

   56 Saving Your File and Exiting the Editor

 

 

 

 

        Introduction

 

        This chapter describes all of the commands available within se and how

        to invoke each command. Some of the commands listed in this chapter

        are described in more detail in Chapter 4, "Using se."

          Note: This chapter describes the default keystroke definitions. If you

        have customized your key definitions with the se configuration window,

        substitute your customized keystrokes when necessary.

          The first section in this chapter, "Selecting Menu Options," describes

        the different ways in which you can select options. The remaining

        sections describe the options and commands you can use to perform

        specific tasks:

 

        [] moving around in a file

        [] inserting text

        [] deleting text

        [] marking, copying, deleting, and moving blocks of text

        [] searching for and replacing character strings

        [] opening, closing, and changing windows

        [] creating and using keystroke macros

        [] editing a new file

        [] saving your file and exiting the editor.

 


50 Chapter 5

 

 

 

 

 

        Each section includes a table that shows, for each specific task, which

        keys/options to press/select to perform the task. For example, to move to

        a specific line in your file, you can:

 

        [] Press Control-L.

        [] Press Right Amiga-L.

        [] Select the Line Number option from the Search pull-down menu.

 

 

 

       Selecting Menu Options

 

       You can select an option or enter a command in one of three ways:

 

       [] Select an option from a pull-down menu.

       [] Enter the appropriate accelerator key for the option or command.

          Many of the menu options are also associated with menu accelerator

          keys (also called keyboard shortcuts). These shortcuts are displayed to

          the right of the option in the pull-down menus. For example, the

          keyboard shortcut for the Save & Close option in the Project menu is

          Right Amiga-S.

       [] Select an option from the abbreviated menus displayed with the F2

          (Main Menu) key. If you press the F2 key, se displays an abbreviated

          menu of the most frequently used commands at the bottom of the

          screen:

 

 

                COMMAND: B C F H L O P R S Q U

 

 

          Each of these options either displays a submenu or executes a

          command. For example, B displays the Block menu, and Q exits the

          editor. To display a brief description of an option, move the cursor to

          that option.

 

        se also provides context-sensitive help that describes each command in

        detail. To display help information, press the Help key.


 

                                                                           Controlling se 51

 

 

 

 

            Moving Around in the File

            The following table lists the keys/options that you can use to move

            around in your file.

 

 

 

Task                                       Key                   Menu/Option

______________________________________________________________________________

Move up one line                           Up arrow

Move down one line                         Down arrow

Move left one character                    Left arrow

Move left one word                         Control-Left arrow

                                           Shift-Left arrow

Move right one character                   Right arrow

Move right one word                        Control-Right arrow

                                           Shift-Right arrow

Go to a specific line                      Control-L             Search/Line Number

                                           Right Amiga-L

Go to the beginning of the line            Home

Go to the end of the line                  End

Go to the top of the file                  Control-Home

Go to the end of the file                  Control-End

Move up one page                           PgUp

Move down one page                         PgDn

Scroll the text up                         Control-6

Scroll the text down                       Control-V

Go to the beginning of a marked block                            Block/Beginning

Go to the end of a marked block                                  Block/End

 


52 Chapter 5

 

 

 

 

               Inserting Text

               The following table lists the keys and options that you can use to insert

               text into your file.

 

 

 

Task                                               Key                   Menu/Option

____________________________________________________________________________

Switch between Insert and Overwrite modes         Ins

Insert a line before current line                 Control-I

Restore deleted line                              Alt-Y

Enter control characters                          Control-\c

Insert a file at current position                                      Project/Insert File

 

 

 

 

               Deleting Text

               The following table lists the keys/options that you can use to delete text

               from your file.

 

 

 

Task                                          Key                   Menu/Option

_____________________________________________________________________________

Delete current character                      Del

Delete previous character                     Backspace

Delete word                                   Control-W

Delete line                                   Control-Y

Delete from cursor position to end of line    Control-E

Delete a marked block                         Right Amiga-D         Block/Delete

 


                                                                           Controlling se 53

 

 

 

 

           Working with Blocks of Text

           The following table lists the keys/options that you can use to mark, copy,

           move, insert, and delete blocks of text. For a more detailed description of

           these commands, see Chapter 4, "Using se."

 

 

 

Task                                        Key                   Menu/Option

_______________________________________________________________________

Mark beginning of block                  Control-[

Mark end of block                        Control-]

Copy a marked block                      Right Amiga-C         Block/Copy

Delete a marked block                    Right Amiga-D         Block/Delete

Move a marked block                      Right Amiga-M         Block/Move

Print contents of a marked block                               Block/Print

Read a disk file into the editor window                        Block/Read

Write contents of marked block to a file                       Block/Write

Go to the beginning of a marked block                          Block/Beginning

Go to the end of a marked block                                Block/End

 

 

 

 

        Searching for and Replacing Strings

        The following table lists the keys/options that you can use to locate

        character strings and to replace a string with another string. For a more

        detailed description of these commands, see Chapter 4, "Using se."

 

 

 

Task                                            Key                   Menu/Option

___________________________________________________________________________

Search for a character string                   Control-S             Search/String Search

                                                Right Amiga-F

Replace one character string with another       Control-R             Search/Search and Replace

                                                Right Amiga-R

Repeat last search or replace command           Alt-S                 Search/Search Again

                                                Right Amiga-A

 


54 Chapter 5

 

 

 

 

      Managing Windows

      The following table lists the keys/options that you can use to open, close,

      and cycle through windows. Some of these commands are described in

      more detail in Chapter 4, "Using se."

 

 

 

Task                                           Key                   Menu/Option

________________________________________________________________________

Switch window (in split-screen mode)           Control-F6         Windows/Switch Windows

                                               NUM-S

Cycle windows (in full-screen mode)            F6

Change window size                             F9                 Windows/Toggle Display

                                                                  Size

Switch between 20 lines and 45 lines           NUM Enter          Windows/Interlace Toggle

                                               Right Amiga-H

Open new window                                Control-O          Windows/Open Window

Open a new Shell                               Control-F          Windows/Create New CLI

Move window front to back                      F10

Close a window                                 Right Amiga-Q      Project/Close Window

 

 

 

 

        Changing Colors

        The colors used in the se windows are based on your Workbench colors.

        You can change the way the Workbench colors are used in the se

        windows with the keys listed in the following table. These keys allow you

        to cycle through the foreground and background colors.

 

 

 

        Task                                       Key

________________________________________________________________

       Cycle foreground colors                     F7

       Cycle background colors                     F8

 


                                                                           Controlling se 55

 

 

 

 

         Creating and Using Keystroke Macros

         The following table lists the keys/options that you can use to create, save,

         and load keystroke macros. For a more detailed description of these

         commands, see Chapter 4, "Using se."

 

 

 

Task                                       Key                   Menu/Option

___________________________________________________________________________

Start/stop saving keystrokes             Alt-n

Execute a keystroke macro               Alt-Fn

Save macros in a file                                           Project/Save Macros

Load macros from a file                                        Project/Load Macros

Assign keystroke macro to a different key                    Options/Convert Macro to

                                                                 Key

 

 

 

 

       Editing a New File

       The following table lists the keys/options that you can use to open new

       files. For a more detailed description of these commands, see Chapter 4,

       "Using se."

 

 

 

Task                                         Key                   Menu/Option

_________________________________________________________________________

Save current file and edit new file        Right Amiga-N         Project/Save & Reopen

Open a new file in the current window    Right Amiga-O         Project/Open New Window

Open a new file in a new window          Control-O             Windows/Open Window

 


 

56 Chapter 5

 

 

 

 

         Naming Files

         The following table lists the keys/options that you can use to change the

         names of files from inside se. For a more detailed description of these

         commands, see Chapter 4, "Using se."

 

 

 

         Task                                        Menu/Option

         Rename current file                         Project/Rename

         Display names of files being edited         Project/Display Names

 

 

 

         Undoing Changes

         The following table lists the keys/options that you can use to undo your

         last change.

           Note: The action taken by the Undo Last Change option depends on

         the last command you entered. For a complete description of this option,

         see Chapter 4, "Using se."

 

 

 

Task                                       Key                    Menu/Option

______________________________________________________________________

Restore the last line you deleted       Alt-Y

 

Undo last change                        Control-U              Project/Undo Last Change

                                           Right Amiga-U

 

 

 

 

        Saving Your File and Exiting the Editor

        The following table lists the keys/options that you can use to save your

        file and exit the editor. For a more detailed description of these

        commands, see Chapter 4, "Using se."

 

 

 

Task                                           Key                    Menu/Option

__________________________________________________________________________

Save the file in the current window         Right Amiga-W         Project/Save & Continue

Save the file and close the current window  Right Amiga-S         Project/Save & Close

Save current file and edit new file         Right Amiga-N         Project/Save & Reopen

Exit the editor without saving your file    F3                    Project/Exit SE

                                            Right Amiga-X


                                                                          57

 

 

 

 

 

6 Customizing the Editor

 

 

 

 

  57 Introduction

  57 Displaying the Configuration Window

  59 Displaying Key Definitions

  60 Setting Key Definitions

  61 Setting Tab Stops

  61 Setting Other Options

  64 Saving the New Settings

  64 Reusing Saved Settings

 

 

 

 

        Introduction

 

        This chapter describes how to use the se configuration window. The

        configuration window allows you to set options and change the functions

        assigned to different keys and key combinations (sequences). For example,

        you can do the following:

 

        [] set the input processing mode

        [] set tab stops

        [] set automatic indention

        [] specify whether searches are to be simple string searches or pattern

        searches

        [] change the command assigned to a key or key combination.

 

 

 

        Displaying the Configuration Window

 

        To display the se configuration window shown in Display 6.1, open the

        Options pull-down menu on the se menu bar, and select the

        Configuration Window option. (Alternatively, you can press Control-M.)

 


58 Chapter 6

 

 

 

      Display 6.1

se Configuration

          Window

 

 

 

 

 

 

 

 

 

 

 

 

 

                     To display the configuration window menu bar, press and hold the right

                     mouse button. The menu bar contains six pull-down menus:

 

                        Project contains options that allow you to save any changes you make

                                 while in the configuration menu or to quit the configuration

                                 window without saving your changes. The sections "Saving

                                 the New Settings" and "Reusing Saved Settings," later in this

                                 chapter, describe how to use the Project menu.

 

                        Options allows you to specify several options that determine how the

                                 editor works. For example, you can specify how tab

                                 characters are processed, whether Search and Replace

                                 commands are case sensitive, whether the se status line

                                 shows the current column number, and so on. The section

                                 "Setting Other Options," later in this chapter, describes how

                                 to use this option.

 

                       Keys 1-4 lists the different commands that you can assign to a key or

                                key combination. The following sections "Displaying Key

                                Definitions" and "Setting Key Definitions" describe how to use

                                these menus.


 

                                                             Customizing the Editor 59

 

 

 

 

                 Displaying Key Definitions

 

                 To display the command assigned to a key or key sequence, you can

 

                 [] click on that key or key sequence in the keymap.

                 [] press that key, if the key is a qualifier key. Qualifier keys are keys that

                    modify the function of other keys, such as the Control key, the Alt key,

                    the Shift key, and so on.

 

                 For example, to display the definition of Control-F4 as shown in Display

                 6.2, click on the Ctrl key and the F4 key.

 

 

 

     Display 6.2

se Configuration

Window Showing

 

         Ctrl-F4

 

 

          

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                 The name of the key or key sequence appears in the Key Name field,

                 CTRL F4, and the command assigned to the key appears in the text

                 gadget below the Key Name, CO.

                   To determine the function of a specific command, open the Keys pull-

                 down menus. These menus contain the explanations of each of the

                 commands that you can assign to a key or key sequence. For example, the

                 Keys 2 pulldown menu shows the function of the CO command as Set SC

                 Options.

                   The configuration screen also displays the raw code and qualifier

                 associated with a specific key combination.


 

60 Chapter 6

 

 

 

 

          Raw code is a hexadecimal code associated with a specific key on the

                     keyboard by the hardware. The AmigaDOS operating

                     system uses keymaps to convert this raw code into a

                     recognizable character.

 

           Qualifier indicates which qualifier keys are part of a key sequence.

                     As stated before, qualifier keys are keys that modify the

                     function of other keys, such as the Control key, the Alt key,

                     the Shift key, and so on.

 

         The raw codes and qualifiers are displayed for reference only. For more

         information about raw codes and qualifiers, refer to the description of

         keyboard.device in Amiga ROM Kernel Reference Manual: Devices,

         3rd Edition (Commodore-Amiga, Inc. 1991).

           After you have displayed a key definition, you can press Return to

         unselect the key, clear the text gadget, and remain in the configuration

         program. You can also select CANCEL or click on the Close gadget to

         exit the configuration program.

 

 

 

         Setting Key Definitions

 

         By default, the left and right Alt keys are equivalent. For example, Left

         Alt-y performs the same function as Right Alt-y.

           You can choose to make the left Alt and right Alt keys work

         independently. That is, you can choose for the left Alt-y key sequence to

         perform a different function than the right Alt-y sequence. Similarly, you

         can choose for the left and right Shift keys to work independently. To

         make the left and right Alt keys or Shift keys work independently, click

         on the check box next to ALT L = R or SHIFT L = R in the bottom

         right of the configuration screen.

           The left and right Amiga keys function independently. You cannot make

         these keys function equivalently.

 

 

  Caution Do not define the Control, I-ight Amiga key, left Amiga key sequence.

        This key combination reboots the machine.

 

 

          To set or change the definition of a key or key sequence, follow these

        steps:

           1. Select the key or key sequence by clicking on the appropriate keys.

              For example, to assign a command to the key sequence Control-C,

              press or click on the Control key and the C key.

           2. Enter the command code in the text gadget. You can type in the

              command code, or you can select the code from the Keys pull-down

              menus. Press Return after entering the command code. For

              example, to assign the CW (Change Window) command to Control-C,

 


                                           Customizing the Editor 61

 

 

 

 

     type in CW and press Return, or select cw from the Keys 2 menu

     and press Return.

       You can repeat this step as many times as necessary to create

     complex key definitions.

  3. Save the new settings as described in "Saving the New Settings,"

     later in this chapter.

 

 

 

Setting Tab Stops

 

By default, tab stops are set at every eighth character, as shown in

Display 5.1.

  You can clear all tab stops by clicking on the Clear tabs gadget. To

set a tab stop, point and click to the place on the tab bar where you want

to set a tab stop. An uppercase T indicates where a tab stop has been set.

To delete a single tab stop, point and click at the tab stop.

  After you have set at least two tab stops, you can set a series of tabs at

equidistant intervals, using the Repeat tabs gadget. When you click on

the Repeat tabs gadget, the configuration program calculates the

interval between the last two tab stops you entered, and sets tab stops for

the remainder of the tab bar using that interval.

  Save the new tab stops as described in "Saving the New Settings," later

in this chapter.

 

 

 

Setting Other Options

 

The Options pulldown menu in the configuration menu allows you to

specify several parameters, including how your input is processed, how

the Search and Replace commands work, whether the editor saves backup

files, and so on. The following list describes each of the options in the

Options pull-down menu.

  If you change any of the options in the Options pulldown menu, you

must save your changes as described in "Saving the New Settings," later

in this chapter.

 

Input Processing

   controls the mode in which you enter text into se. You can choose

   from five modes:

 

   No processing does not convert anything to uppercase or insert

                 carriage returns when you reach the right margin.

                 You must press Return at the end of each line.

 

     Asm modes are designed to make entering assembly language code

                 easier. In the assembly language modes, the editor

                 uses the tab stop settings to determine the start of the

 


62 Chapter 6

 

 

 

 

                   next field. In Asm mode 1, the editor converts

                   anything you enter in field 1 into uppercase. In Asm

                   mode 2, the editor also converts anything you enter

                   in field 2 into uppercase, and in Asm mode 3, it also

                   converts anything you enter in field 3. The editor

                   does not convert anything entered on a line after you

                   enter a comment character (; or *).

                     In any of the assembly language modes:

 

                   [] When you enter a colon (:), space, or tab character

                      into the first field, the cursor moves to the second

                      field.

                   [] When you enter a space or tab character into the

                      second field, the cursor moves to the third field. If

                      you enter a comment character (; or *), the cursor

                      moves to the comment field.

                   [] When you enter a comment character into the third

                      field, the cursor moves to the comment field.

 

                   You can enter a comment character into the text

                   without causing the cursor to move to the comment

                   field by preceding the comment character with a

                   backslash (\).

 

                   Autowrap inserts carriage returns into the text when you reach

                   the right margin. When the word you are entering

                   extends past the right margin, the entire last word is

                   moved to the next line.

 

                   The default setting is No processing. This option affects only the

                   current window.

 

                Tab Expansion Method

                  specifies whether tab characters are converted to spaces (Expand Tabs

                  to Spaces) or left as tab characters (Use TAB Character) . Only the tab

                  characters that are entered while Expand Tabs to Spaces is active are

                  converted to spaces. Tab characters that already exist are not

                  converted when you select Expand Tabs to Spaces. The default setting

                  is Use TAB Character. This option affects only the current window.

 

                Auto-Indent Mode

                  is designed to make entering C source code easier. When auto-indent

                  mode is on, new lines are indented depending on the following

                  criteria:

 

                    [] If the previous line contains an open brace ({), the new line is

                       indented one tab stop to the right of the previous line.

 


                                            Customizing the Editor 63

 

 

 

 

  [] Otherwise, if the character is a close brace (}), the new line is

     indented one tab stop to the left of the previous line.

  [] For any other character, the new line is indented to the same

     position as the previous line.

 

   The default setting is On. This option affects only the current window.

 

Column Display

   specifies whether the column number is displayed on the status line.

   The default setting is Off. This option affects all windows.

 

Prompt Before Undo

   specifies whether you are asked to confirm each undo command. The

   default setting is On. This option affects all windows.

 

Backup File Mode

   specifies how you want the editor to deal with backup files. You can

   specify one of the following:

 

   [] No Backup File indicates that you do not want the editor to save

      backup copies of each file that you edit.

   [] Place Backup File in Backup Dir specifies that you want the editor

      to save a backup copy of each file that you edit using the same

      filename and extension in a different directory. If you select this

      option, the configuration program asks you for the name of the

      backup directory.

   [] Rename Backup with Backup Ext specifies that you want the editor

      to save a backup copy of each file that you edit using the same

      filename in the same directory as the original file but with a

      different filename extension. If you select this option, the

      configuration program asks you to enter the backup file extension.

 

   The default setting is No backup file. This option affects all windows.

 

Searches Method

   specifies whether the Search and Replace commands should treat the

   search patterns you enter as simple character strings (String Matching)

   or as regular expressions (Use Regular Expressions). If you choose to

   Use Regular Expressions, you should enter search patterns as

   described in the description of the grep utility under "Specifying the

   Pattern" in SAS/C Development System User's Guide, Volume 2:

   Debugger, Utilities, Assembler, Version 6.0. The default setting is Use

   Regular Expressions. This option affects all windows.

 

Case Sensitive Characters

   specifies whether the Search and Replace commands are sensitive to

   case. For example, if this option is On and you specify a search

   pattern in lowercase, the Search command will not locate the same


 

64 Chapter 6

 

 

 

 

     pattern in the file if the pattern occurs only in uppercase. The default

     setting is On. This option affects all windows.

 

 

 

   Saving the New Settings

      To save any changes you make using the configuration window, select the

      Use, Save, or Save As options.

 

      []  Select USE to save the settings to the environment variable

          sc/se.dat in ENV:. Settings saved to ENV: are active until you

          reboot your system.

      []  Select SAVE to save the settings to ENV: and ENVARC: (the equivalent

          of ENV: on disk). Settings saved to ENVARC: are copied to ENV: each

          time you boot your system.

      []  Select the Save As option to save the settings in a file in the current

         directory. The configuration program asks you to enter a filename in

          which to save these settings.

 

         If you click on the Close gadget without selecting the Use, Save, or

      Save As option, the new settings are active for your current se session

      only.

 

 

     Reusing Saved Settings

 

     If you use the Save As option to save your configuration settings, you can

     reload these settings later by selecting the Open option from the Project

     menu. The configuration program asks you to specify the filename to

     which you saved the settings. Enter the filename to which you saved the

     settings. To make the settings active, you must click on the SAVE or USE

     gadget.

 


 

 

7 Using the AREXX Interface

  to se

 

 

  65 Introduction

  65 Executing A Series of Editor Commands

  68 Communicating with External Programs

  69 AREXX Macros Provided with the Compiler

  70 AREXX Command Summary

 

 

 

 

  Introduction

 

  This chapter describes the AREXX interface that is available in the se

  editor. AREXX is a script language commonly used for interprocess

  communication on Amiga hardware. AREXX comes with Version 2.0 of

  the AmigaDOS operating system and can be purchased separately from

  Commodore for Version 1.3. For more information about using AREXX,

  refer to Using the System Software (Commodore-Amiga, Inc. 1990) if you

  are running the AmigaDOS operating system, Version 2.0 or to the

  documentation that comes with the AREXX package if you are running

  AmigaDOS operating system, Version 1.3.

    You can use the AREXX interface to do the following:

 

     [] execute a series of editor commands that are too complex to assign to a

        keystroke macro

     [] communicate with external programs.

 

 

 

   Executing A Series of Editor Commands

 

   Sometimes you need to perform an action that is more complex than se

   can handle with simple keystroke macros. For example, you may need to

   use programming logic such as an if-then-else construction. You can

   create an AREXX macro to perform the action, and then you can assign

   that macro to a key. AREXX macros are files that contain AREXX

   commands. AREXX macros that are to be used with se must have a

   filename with a .se suffix.

    Tables 7.1 and 7.2 in "AREXX Command Summary," later in this

   chapter describe each of the commands supported by AREXX. As you

   enter AREXX commands, separate each command with a space. You can

   string multiple commands together.

 


66 Chapter 7

 

 

 

 

       If you are passing characters to a command prompt, you must

    terminate the string with a newline character, \n. For example, the

    following command issues the Open Window command, enters f oo for

    the filename, and terminates the string with a carriage return:

 

 

          /* Issue the Open Window command,                   */

          /* type in "foo" for the filename,                      */

          /* and terminate data entry with a carriage return.  */

 

 

                  'OW "foo\n"'

 

 

     If you do not specify the \n character, se waits until you type a carriage

     return before proceeding.

       After you have created your macro file, you can assign the macro to a

     key using the se configuration window. To display the se configuration

     window, select the Configuration Window option from the Options pull-

     down menu. Select the key to which you want to assign the macro by

     pressing or clicking on the appropriate key(s). Type the following Rexx

     Macro command in the text gadget and press Return:

 

 

         RM "macro-filename"

 

 

      The macro-filename is the name of the file containing your macro. If the

      name you specify does not end in .se, the editor appends . se to the

      filename when you invoke the macro. se searches for the macro file in

      the current directory, then in sc: REXX, and finally in REXX: . You can

      specify a fully-qualified pathname for the filename, if necessary.

        For example, suppose you have a series of #define statements in

      your program such as the following:

 

 

                          #define FRED    1

                          #define BARNEY 4

                          #define WILMA   7

                          #define BETTY  8

 

 

        You want to renumber these statements sequentially:

 

 

                          #define FRED    1

                          #define BARNEY 2

                          #define WILMA   3

                          #define BETTY   4


 

                                   Using the AREXX Interface to se 67

 

 

 

 

You could use the following AREXX macro. If invoked from se, this

macro renumbers the last token on each line of a marked block.

 

 

       /* AREXX macro to renumber #define statements            */

 

 

       /* Tell SE to go to the Block Menu and select End.       */

       /* This effectively moves the cursor to the end of the   */

       /* current marked block.                                 */

   ' BN "En"'

 

 

      /* Ask SE for the line number of the current line.       */

      /* Assign the line number to the variable 'end'.         */

   options results

   'GL'

   end = result

   options

 

 

       /* Tell SE to go to the Block Menu and seleet Beginning. */

       /* This moves the cursor to the beginning of the marked  */

       /* block.                                                *

   'BM "B"'

 

 

       /* Ask SE for the text of the current line.              */

       /* Assign the text of the line to the variable 'line'.   */

   options results

   'GT'

   options

   line = result

 

 

      /* Move the cursor to the end of the current line.       */

   'EL'

 

 

       /* Back up one word */

   'PW'

 

 

       /* Get the index of the current position in the current  */

       /* line.  This index can differ from the current column  */

       /* number if tab characters are present in the line.     */

      /* Assign the index to the variable 'index'.             */

   options results

   'GI'

   options

   index = result


 

68 Chapter 7

 

 

 

 

    /* Read the line and get the number at the end of it.    */

    /* Since the variable 'index' points to the first        */

    /* character of the number, the number consists of       */

    /* everything from the 'indexlth byte of the line to the */

    /* end of the line.                                      */

 num = SUBSTR(Iine, index+l, length(line)-index)

 

 

     /* 'num' now contains the number at the end of the first */

     /* line of the marked block. Move down a line,           */

     /* go to the end of the line, back up a word, and        */

     /* delete to the end of the line. The following          */

     /* sequence of four SE commands does this.               */

 'NL EL PW DE'

 

 

     /* Loop until the end of the block, replacing the last   */

     /* token on the line with the appropriate number.        */

  do forever

     num = num + 1    /* Increment #define number    */

     num              /* Insert the number as text   */

     options results  /* Get the current line number */

     'GL'

     options

     if result >= end then exit(0)  /* Exit if past the end */

     'NL EL PW DE' /* Go to next line and delete last token */

  end

 

 

 

       Communicating with External Programs

 

       You can also use AREXX to communicate with other programs from

       within the editor. For example, you may want to send messages to the

       scmsg utility, which allows you to browse your error and warning

       messages. You can also invoke external commands that are unrelated to

       the editor or send AREXX commands to another program that has an

       AREXX port.

         Each program that has an AREXX port names its port so that other

       programs can find it. The name of se's AREXX port is SC_ SE. If more

       than one copy of se is running, only one copy will have an AREXX port.

         When you invoke an AREXX script from within an application, any

       external commands that the script attempts to execute are sent to the

       AREXX port of the application that launched it. Therefore, when se

       launches a script, it should send se commands as external commands. If

       the script wants to communicate with another utility, it should switch to

       that utility's AREXX port using the AREXX ADDRESS command. The

 


                                   Using the AREXX Interface to se 69

 

 

 

 

script can then send commands in whatever format required by that

utility. To switch back to se, specify the ADDRESS command with

"SC_SE" as its argument.

  For example, the following se script tells scmsg to go to the next

error, then gets the information on the error, and positions the cursor on

the correct line number.

 

 

      /* REXX script to advance to next error */

   address "SC_SCMSG"  /* Switch to the message browser.      */

   'NEXT'              /* Go to the next message on the list. */

   options results     /* Remember the results of commands. */

   'FILE'              /* Get the filename of the next error. */

   file = result

   'LINE'              /* Get the line number.                 */

   line = result

   options

 

 

   address "SC_SE"               /* Back to the editor now     */

   'OW "' || file ||'\n"'  /* Issue Open Window command */

   'LL "' || line ||'\n"'  /* Issue Go to line command  */

 

 

 

AREXX Macros Provided with the Compiler

 

The SAS/C Development System provides seven AREXX macros that you

can use from inside of se. The files for these macros are in sc: rexx.

These macros are as follows:

 

amigaguide.se

   displays the help information in the AmigaGuide databases in the

   sc: help directory. By default, this macro is assigned to Alt-D. When

   you invoke this macro, it asks you to enter the name of an

   AmigaGuide database. For a description of each of the AmigaGuide

   databases in the sc: help directory, see Chapter 3, "Getting Help."

 

deletetabs.se

   converts all of the tabs within a marked block to spaces. By default,

   this macro is assigned to the asterisk (*) key in the numeric keypad

   (NUM ).

 

findsym.se

   looks in the GSTs in memory for the definition of the symbol that is

   under the cursor. If it finds the symbol in a GST, f indsym displays

   the source file in which the symbol is defined. If you do not have any

   GSTs in memory, this macro does nothing. By default, this macro is

   assigned to the left parenthesis key on the numeric keypad, NUM (.


 

70 Chapter 7

 

 

 

 

                      indent.se

                         indents a marked block three spaces. By default, this macro is assigned

                         to the plus (+) key on the numeric keypad (NUM +).

 

                      unindent.se

                         unindents a marked block three spaces. By default, this macro is

                         assigned to the minus (--) key on the numeric keypad (NUM--).

 

                      tolower.se

                         converts the current character to lowercase. This macro is not

                         assigned to a key by default, but you can assign it to a key using the

                         se Configuration Window.

 

                      toupper.se

                         converts the current character to uppercase. This macro is not

                         assigned to a key by default, but you can assign it to a key using the

                         se Configuration Window.

 

                        To assign any of these macros to a key, use the Rexx Macro command

                      as described in "Executing A Series of Editor Commands," earlier in this

                      chapter.

 

 

 

                      AREXX Command Summary

                      The following tables list the AREXX commands and their keystroke

                      equivalents supported by the editor.

 

 

             Table 7. 1

AREXX Commands with                                                  Default Key

Keystroke Equivalents  Command  Function                           Definition

____________________________________________________________________________

                            A1  assign macro 1                     Alt-1

                            A2  assign macro 2                     Alt-2

                            A3  assign macro 3                     Alt-3

                            A4  assign macro 4                     Alt-4

                            A5  assign macro 5                     Alt-5

                            A6  assign macro 6                     Alt-6

                            A7  assign macro 7                     Alt-7

                            A8  assign macro 8                     Alt-8

                            A9  assign macro 9                     Alt-9

 

                                                                                   (continued)


 

                                             Using the AREXX Interface to se 71

 

 

 

Table 7.1                                                          Default Key

(continued) Command        Function                           Detinition

_______________________________________________________________________

               AO            assign macro O                     Alt-O

               BL            beginning of line                  Num 7

               BM            go to block menu                   Ctrl-b

               BT            beginning text                     Ctrl-Num 7

               CO            invoke scopts utility              CtrlF4

               CS            change display size                F9

               CW            change windows                     Num 5

               DC            delete character                   Num .

               DE            delete to end of line              Ctrl-e

               DL            delete line                        Ctrly

               DW            delete word                        Ctrl-w

               EL            end of line                        Num 1

               ES            se escape character                Ctrl\

               ET            end text                           CtrlNum 1

               FB            toggle window front to back        F10

               FD            go to fork command                 Ctrl-f

               FW            cycle through open windows         F6

               GL            go to locate line command          Ctrll

               HE            get se help                        F1

               IL            insert line                        Ctrln

               IM            toggle interlace mode              Enter

               IN            toggle insert mode                 Num O

               MB            mark beginning of block            Ctrl[

               MC            Match character                    Ctrl-5

               ME            mark end of block                  Ctrl]

               MM            go to main se menu                 F2

 

                                                                      (continued)


 

72 Chapter 7

 

 

 

  Table 7.1                                                              Default Key

  (continued)     Command        Function                           Definition

________________________________________________________________________

                      M1             execute macro 1                    Alt-F1

                      M2             execute macro 2                    Alt-F2

                      M3             execute macro 3                    Alt-F3

                      M4             execute macro 4                    Alt-F4

                      M5             execute macro 5                    Alt-F5

                      M6             execute macro 6                    Alt-F6

                      M7             execute macro 7                    Alt-F7

                      M8             execute macro 8                    Alt-F8

                      M9             execute macro 9                    Alt-F9

                      M0             execute macro 10                   Alt-F10

                      NC             next character                     Num 6

                      NE             go to next compiler error          F5

                       NL            next line                          Num 2

                       NP            next page                          Num 3

                       NW            next word                          CtrlNum 6

                       OM            go to configuration menu           Ctrlm

                       OW            go to open window command          Ctrlo

                       PC            previous character                 Num 4

                       PL            previous line                      Num 8

                       PM            go to project menu                 Ctrl-p

                       PP            previous page                      Num 9

                       PW            previous word                      Ctrl-Num 4

                       QU            go to quit se command              F3

                       RK            restore kill buffer                Alt-y

                       SA            go to next string match            Alt-s

                       SC            invoke SAS/C compiler              F4

 

                                                                            (continued)


 

                                                      Using the AREXX Interface to se 73

 

 

 

 Table 7.1                                                              Default Key

(continued) Command             Function                           Definition

_________________________________________________________________________

              SD                 scroll down                            Ctrl-v

              SE                 go to search command               Ctrl-s

              SR                 go to search/replace command       Ctrl-r

              SU                 scroll up                              Ctrl-6

              UN                 go to undo command                 Ctrl-u

 

 

 

 

                     The following AREXX commands do not have keystroke equivalents.

 

 

 

 

AREXX Commands   Command       Function                           Example

without Keystroke  BP          build project                      'BP'

      Equivalents  CR          carriage control                   'CR'

                   DM          display message                    'DMExample

                                                                  Message'

                   GC          get column of cursor               'GC'

                   GE          get error from last command        'GE'

                   GI          get index of cursor                'GI'

                   GL          get number of current line         'GL'

                   GM          prompt user for input              'GM'

                   GT          get text of current line           'GT'

                   GW          get word                           'GW'

                   RM          REXX macro                         'RM "filename"'


                                                                              75

 

 

 

 

        Part 3

        Using the Compiler

        and Linker

 

 

 

 

 

     Chapters 8 Compiling and Linking Your Program

              9 Running Your Program from the Workbench Screen

             10 Using Startup Modules, Autoinitialization, and Autotermination

                Functions

             11 Using Amiga Specific Features of the SAS/C Language

             12 How Does the Compiler Work?

             13 Writing Portable Code


 

76                                                                                      77


 

 

 

 

 

            8 Compiling and Linking Your

              Program

 

 

              77 Introduction

              77 Compiling Your Program

                     77 Entering the sc Command

                     79 Using Compiler Options

                    119 Using Preprocessor Symbols Defined by the Compiler

              120 Linking Your Program

                    121 Entering The slink Command

                    121 Specifying Linker Options

              127 Using Overlays

                    132 Specifying Compiler Options with Overlays

                    133 Customizing the Overlay Manager

 

 

 

 

                  Introduction

 

                  This chapter describes how to compile and link your program. It

                  describes the sc command and its options, and it describes the slink

                  command and its options.

 

 

 

                  Compiling Your Program

 

                  As described in Chapter 2, "Using Your SAS/C Development System,"

                  you can compile your program from the Shell by entering the sc

                  command or from the Workbench screen by double-clicking on the

                  Build icon. When you double-click the Build icon, you are indirectly

                  running the se command as well.

 

Entering the sc   The sc command has the following format:

        command

                  sc [options] [source-filename(s)]

 

                  The sc command accepts C source files, assembly source files, object

                  files, and link libraries as input files. You can enter the filenames

                  anywhere on the se command line, and you can use standard AmigaDOS

                  wildcards to specify filenames.


 

78 Chapter 8

 

 

 

 

   sc determines the input file type by looking at the file extension. sc

 recognizes the following filename extensions:

             . c   C source file

             . p   C source file (preprocessor output)

             . h   C header file (treated as a C source file)

             . o   Object file

             .lib  Link library

             . a   Assembler source file

             . asm Assembler source file

             . s   Assembler source file

   If you have a file that does not end in one of the recognized extensions,

 you must use the correct sc option to specify the filename:

   csource=filename

      specifies a C source file. You can abbreviate this option as csrc.

 

   assembler=filename

      specifies an assembler source file. You can abbreviate this option as

      asm.

 

   object=filename

      specifies an object file. You can abbreviate this option as obj.

 

   library=filename

      specifies a link library. You can abbreviate this option as lib.

 

   See "Compiler Option Descriptions," later in this chapter for a complete

   description of each of these options.

     If you specify an item in the s c command that does not end in a

   recognized extension and is not a valid option, s c appends the . c

   extension and attempts to compile the resultant filename. If the sc cannot

   find the file, it reports an error and proceeds to the next file to be

   compiled.

      Note: You can use a plus (+) sign or a comma (,) to separate multiple

   filenames. Therefore, you cannot enter a filename containing a plus sign

   or a comma unless the name ends in a recognized extension.

      To display help information about the sc command, enter sc followed

   by a question mark (?):

 

 

            sc ?


 

                                                   Compiling and Linking Your Program 79

 

 

 

 

Using Compiler  You can specify compiler options in the following ways:

       Options

                [] saving the options as project options in an scoptions file (using the

                    scopts utility). The se command looks for this file when you compile

                    your program.

                [] saving the options as global default options in the variable ENV: sc/

                    scoptions (using the scopts utility). If the se command cannot

                    find a project options file, it looks for global default options.

                [] entering the options in the se command. Even if you are using an

                    scoptions file, you can also specify options on the se command line.

 

                    When you enter the se command, the compiler first tries to read options

                    from the file scoptions in the current directory. If this file does not

                    exist, the compiler looks for options stored in the ENV: sc/scoptions

                    environment variable. Finally, the compiler processes any options you

                    enter on the sc command line in the order in which you enter them. If

                    an option is specified twice, the compiler uses the setting of that option

                    that was specified last. Therefore, you can override the setting of an

                    option in the scoptions file or environment variable by specifying that

                    option in the se command. sc reads all options before processing any

                    files, so any options specified on the command line after an input file

                    name still apply to that file.

                      If your current directory contains an scoptions file but you do not

                    want the compiler to use the options specified in the file, specify the

                    resetoptions option as the first option in the sc command.

                    resetoptions sets all options to their default values. resetoptions

                    does not change the contents of the scoptions file but does affect the

                    compilation in progress. For more information, see the description of the

                    resetoptions option later in this section.

                      The compiler accepts two types of options:

 

                    switch options

                       do not take parameters. All switches have a negative and a positive

                       version. To specify the negative version, precede the option with no.

                       For example, to use ANSI escape sequences to highlight errors in

                       diagnostic output, specify the errorhighlight option. If you do not

                       want to highlight errors, specify noerrorhighlight.

 

                    keyword options

                       take parameters. Specify the option name, followed by a blank or an

                       equal (=) sign and the parameter. For example, to generate debugging

                       information for your program, you can specify debug=line or

                       debug 1 ine. Some keyword options also have a negative form like

                       the switch options. For example, if you do not want the compiler to

                       generate debugging information, you specify nodebug.


 

80 Chapter 8

 

 

 

 

                         The option descriptions that follow give the full name and minimum

                       acceptable abbreviation for each option (if the option has an

                       abbreviation). You can also use intermediate forms of the options. For

                       example, the minimum abbreviation for the absfunctionpointer

                       option is afp. Other acceptable abbreviations include absfp,

                       absfuncp, and afptr. The compiler options are not casesensitive. You

                       can enter options in upper, lower, or mixed case.

 

 

                       Summary of Compiler Options

                       For each option accepted by the compiler, Table 8.1 shows:

 

                       [] the full name.

                       [] the minimum abbreviation. The minimum acceptable abbreviation is

                          shown with uppercase letters.

                       [] whether the option takes a parameter. An option that takes a

                          parameter is listed with an equals (=) sign.

                       [] whether the option has a negative form.

                       [] the default value, if any.

 

 

           Table 8.1

 Summary of Compiler                                   Negative

             Options    Option Name                    Form?     Default Value

___________________________________________________________________________________

                       AbsFuncPointer                  Yes       noafp

                       ADDSYMbols                      Yes       noaddsym

                       ANSI                            Yes       noansi

                       ARGument SIZe=                  No        512

                       ASseMbler=                      No

                       AUTOREGister                    Yes       autoreg

                       BATCH                           Yes       nobatch

                       BSSMEMory=                      No        any

                       BSSNAME=                        Yes       udata

                       CODE=                           No        near

                       CODEMEMory=                     No        any

                       CODENAME=                       Yes       text

                       CommentNEST                     Yes       nocnest

                       COMMON                          Yes       nocommon


 

                                                                                 (continued)

 

                                                     Using Compiler Options 81

 

 

 

  Table 8.1                                   Negative

(continued) Option Name                       Form?       Default Value

            ____________________________________________________________

            CONSTLIBbase                      Yes         constlib

            COVERage                          Yes         nocover

            CPU=                              No          any

            CSouRCe=                          No

            DATA=                             No          near

            DATAMEMory=                       No          any

            DATANAMEe                         Yes         data

            DeBuG=                            Yes         nodebug

            DEF i ne =                        No

            DISASseMble=                      Yes         nodisasm

            ERRor=                            No

            ERRorCONsole                      Yes         errcon

            ERRorHIGHl ight                   Yes         errhigh

            ERRorLIST                         Yes         errlist

            ERRorREXX                         Yes         errrexx

            ERRorSouRCe                       Yes         errsrc

            EXTernalDEFs                      Yes         extdef

            FindSYMbol=                       No

            FROM                              No

            GenProtoDATAitems                 Yes         gpdata

            GenProtoEXTerns                   Yes         gpext

            GenProtoFILE=                     Yes         filename _ protos.h

            GenProtoPARaMeters                Yes         nogpparm

            GenPROTOs                         Yes         nogproto

            GenProtoSTATics                   Yes         nogpstat

 

                                                                    (continued)


 

2 Chapter 8

 

 

 

 

  Table 8.1                                    Negative

(continued)  Option Name                       Form?       Default Value

________________________________________________________________________

             GenProtoTypeDEFs                  Yes         gptdef

             GlobalSymbolTable=                Yes         nogst

             GSTIMMediate                      Yes         nogstimm

             ICONs                             Yes         icons

             IDentif ierLENgth=                No          255

             IGNore=                           No

             IncludeDIRectory=                 No

             KeepLINE                          Yes         nokline

             LIBCODE                           Yes         nolibcode

             LIBrary=                          No

             LINX                              Yes         nolink

             LINKerOPTions=                    Yes         nolinkopt

             LIST                              Yes         nolist

             ListFILE=                         Yes         filename.1st

             ListHEADers                       Yes         nolhead

             ListINCludes                      Yes         listinc

             ListMACros                        Yes         nolmac

             ListNARRow                        Yes         lnarr

             ListSYStem                        Yes         nolsys

             MakeGlobalSymbolTable=            Yes

             MAP                               Yes         nomap

             MapFILE=                          Yes         executable.map

             MapHUNK                           Yes         nomaphunk

             MapLIB                            Yes         nomlib

             MapOVerLaY                        Yes         nomovly

             MapSYMbols                        Yes         nomsym

             MapXREFerence                     Yes         nomxref


                                                                                (continued)

 

                                           Using Compiler Options 83

 

 

 

 

 

 

Option Name                       Form?       Default Value

____________________________________________________________

MATH=                             Yes         nomath

MAXimumERRors=                    Yes         50

MAXimumWaRNings=                  Yes         nomaxwrn

MEMorySIZE=                       No          large

MODified                          Yes         nomod

MultipleCharacterCONStants        Yes         nomccons

MultipleINCludes                  Yes         minc

OBJect=                           No

OBJectLIBrary=                    Yes

OBJectNAME=                       Yes

OLDPreProcessor                   Yes         nooldpp

ONERRor=                          No          stop

OPTimize                          Yes         noopt

OPTimizerALIAS                    Yes         optalias

OPTimizerCOMPlexity=              Yes         3

OPTimizerDEPth=                   Yes         3

OPTimizerGlObal                   Yes         optgo

OPTimizerINLine                   Yes         optinl

OPTimizerINLOCAL                  Yes         nooptinlocal

OPTimizerLOOP                     Yes         optloop

OPTimizerPEEPhole                 Yes         optpeep

OPTimizerRecurDEPth=              Yes         3

OPTimizerSIZE                     Yes         nooptsize

OPTimizerTIME                     Yes         noopttime

PARaMeters=                       No          stack

PRECision=                        No          mixed

PreProcessorBUFfer=               No          8192

PreProcessorONLY                  Yes         nopponly

ProgramNAME=                      No

 

                                                          (continued)


 

84  Chapter 8

 

 

                                  Negative

Option Name                       Form?       Default Value

______________________________________________________________

RESetOPTions                      No

SAVEDS                            Yes         nosaveds

ShortINTegers                     Yes         nosint

SmallCODE                         Yes         noscode

SmallDATA                         Yes         nosdata

SouRCeIS=                         Yes

STacKCHecK                        Yes         stkchk

STacKEXTend                       Yes         nostkext

STanDardIO                        Yes         stdio

STaRTup=                          Yes         c (for c.o)

STRICT                            Yes         nostrict

STRingsCONst                      Yes         nostrcons

STRingMERge                       Yes         nostrmer

STRIPDeBuG                        Yes         nostripdbg

STRuctureEQuivalence              Yes         nostreq

TO=                               No

TRIGraph                          Yes         notrig

UnderSCORE                        Yes         nouscore

UnsignedCHAR                      Yes         nouchar

UTILityLIBrary                    Yes         noutillib

VERBOSE                           Yes         noverbose

VERsion                           Yes         version

WaRN=                             No

WarnVoidRETurn                    Yes         wvret

WITH=                             No

XREFerence                        Yes         noxref

XreferenceHEADers                 Yes         noxhead

Xref erenceSYStem                 Yes         noxsys


 

                                           Using Compiler Options 85

 

 

 

 

Compiler Option Descriptions

The following pages describe each of the options accepted by the s~

command. The compiler options are not case-sensitive. You can enter

options in upper, lower, or mixed case.

 

 

AbsFuncPointer

   generates 32-bit references to functions when loading function

   pointers. The default value is noabsfuncpointer. The minimum

   acceptable abbreviation is afp.

     If you specify noabsfuncpointer and you take the address of a

   function that is more than 32k away, the linker generates an ALV

   (automatic link vector) jump instruction that allows your code to work.

   However, if you compare the address of the function to a function

   pointer assigned elsewhere, you may get a different value. Specify

   absfuncpointer if your code is larger than 64K or in multiple

   code hunks and you compare function pointers. Specifying

   absfuncpointer may increase the size of your executable.

 

 

AddSymbols

   tells the linker to add symbol information to the executable module.

   The default value is noaddsymbols. The minimum acceptable

   abbreviation is add sym.

     This option is automatically enabled if you specify the debug

   option. This option is ignored if you do not specify the link option.

 

 

ANSI

   enforces the strictest interpretation of the ANSI C standard. Using this

   option produces many additional warning messages. The default value

   isnoansi.

     To be completely ANSI-compliant (that is, if you require a pure

   ANSI namespace), you should also define the preprocessor symbol

   _ STRICT _ ANSI before including any header files. For more

   information about_ STRICT_ANSI, refer to Chapter 7, "Library

   Reference," in SAS/C Development System Library Reference,

   Version 6.0. If you require support for ANSI trigraphs, specify the

   trigraph option also.

     For more information about improving the portability of your code,

   see Chapter 13, "Writing Portable Code."

 

 

ArgumentSize=n

   sets the size of the maximum argument to a preprocessor macro. The

   minimum acceptable abbreviation is argsiz. This option does not

   have a negative form. The default value is 512. However, the


 

86 Chapter 8

 

 

 

 

  memorysize option sets the argumentsize (and other internal

  limits) to different default values if you do not specify

  argumentsize.

    See the description of the memorysize option for more

  information.

 

 

Assembler=filename(s)

  specifies assembly-language files that are to be assembled and, if you

  specify the link option, linked into the program. The minimum

  acceptable abbreviation is asm. This option does not have a negative

  form.

    You can use AmigaDOS wildcard characters to specify filenames. To

  specify several filenames or wildcard patterns, separate each filename

  with a plus (+) sign or a comma (,). You can specify the assembler

  option as many times as necessary.

    If you are assembling a disassembly that was generated with the

  disassemble compiler option, specify the underscore compiler

  option also. (If you assemble a disassembly by calling the assembler

  directly, specify the -u assembler option.)

    See also the descriptions of the csource, ob ject, and library

  options.

 

 

AutoRegister

  enables automatic register selection by the code generator. The default

  value is autoregi ster. The minimum acceptable abbreviation is

  autoreg.

    If you specify autoregister, the compiler attempts to add

  register variables to the variables that have already been chosen by

  the global optimizer or declared with the register keyword.

 

 

Batch

  tells the linker not to prompt for definitions of undefined symbols. The

  default value is nobatch. This option is ignored if you do not specify

  the link option. See also the description of the batch linker option.

 

 

BSSMemory=type

  specifies the type of memory into which uninitialized external data

  items should be loaded. You can specify any, chip, or fast for type.

  You can abbreviate these values as a, c, or f. The default value is

  any. This option does not have a negative form.

    This option affects code generated by both the compiler and the

  assembler. See also the descriptions of the datamem and codemem

  options.


 

                                           Using Compiler Options 87

 

 

 

 

 

BSSName=name

    names the uninitialized data section. The default value is udata. You

    can specify bssname=none or nobssname if you want an unnamed

    BSS section. The linker automatically merges all sections with the

    same name. See also the descriptions of the codename and

    dataname options. See Chapter 12, "How Does the Compiler Work?"

    for information on data and code sections.

 

 

Code = reference-type

    specifies whether you want 16-bit or 32-bit references to functions not

    declared in the current file. You can specify near or n for 16-bit

    references or far or f for 32-bit references. The default value is

    near. This option does not have a negative form.

     Most programs do not need this option even if they are very large,

   because the linker creates a jump instruction (an ALV) for any

   references to functions that are out of range. See also the description

   of the data option.

 

 

CodeMemory=type

   specifies the type of memory into which code should be loaded. You

   can specify any, chip, or fast. You can abbreviate these values as

   a, c, or f. The default value is any. This option does not have a

   negative form.

     This option affects code generated by both the compiler and the

   assembler. See also the descriptions of the bssmem and datamem

   options.

 

 

CodeName =name

   names the code section. The default value is text. You can specify

   codename=none or nocodename if you want an unnamed code

   section. The linker automatically merges all sections with the same

   name. See also the descriptions of the bssname and dataname

   options. See Chapter 12, "How Does the Compiler Work?" for

   information on data and code sections.

 

 

CommentNest

   allows nested comments. The default value is nocommentnest. The

   minimum acceptable abbreviation is cnest.

     Nested comments occur when one comment is totally contained

   inside another. The ANSI Standard prohibits nested comments, so in

   ANSI compliant code, the first comment end sequence (*/) terminates

   both comments. For example, the statement below generates an error


 

88 Chapter 8

 

 

 

 

  with nocommentnest, but compiles successfully with

  commentnest.

 

      /* i = i+1;/* This is a comment */ */

 

  The statement below compiles successfully with nocommentnest, but

  generates an error with commentnest.

 

      /* i = i+l; /* This is a comment */

 

 

 

 

Common

  tells the compiler to use the common model for external data. If you

  specify nocommon, the compiler uses the strict reference-definition

  model. The default value is nocommon.

    The section "Using Common Model External Data" in Chapter 11,

  "Using Amiga Specific Features of the SAS/C Language," describes

  common and strict reference-definition models.

 

 

ConstLibBase

  tells the compiler that library base pointers are set once then remain

  constant throughout your entire program. The default value is

  constlibbase. The minimum acceptable abbreviation is

  constlib.

    If you change the value of your library bases after setting them, you

  should specify the noconstlibbase option. Specifying

  constlibbase allows the compiler to prevent extra register loading

  when making a series of calls to library functions through an external

  variable containing the library base.

 

 

Coverage

  tells the compiler to generate code to collect coverage analysis

  information. The default value is nocover. The minimum acceptable

  abbreviation is c over.

    Coverage analysis information allows you to determine which lines

  of your program have been executed by your test cases. For more

  information, refer to the description of the cover utility in SAS/C

  Development System User's Guide, Volume 2: Debugger, Utlities,

  Assembler, Version 6.0.


 

                                           Using Compiler Options 89

 

 

 

 

     If you specify the cover option, make sure that you:

   [] Link with the file sc: examples/cover/covutil.o or

      LIB:covutil.o.

   [] Do not specify the nostdio option.

   [] Use startupsc to link with the standard c.o startup module.

 

 

 

CPU=processor

   generates code specific to the specified processor. You can specify any,

   a, or 68000 to generate code for any processor. You can also specify

   68010, 68020, 68030, or 68040 to generate code for a specific

   processor. The default value is any. This option does not have a

   negative form.

     This option defines one or more preprocessor symbols. See the

   section "Using Preprocessor Symbols Defined by the Compiler," later

   in this chapter for a list of those symbols.

     This option affects code generated by both the compiler and the

   assembler.

 

 

CSource=filename

   specifies C source files that are to be compiled and, if you specify the

   link option, linked into the program. The minimum acceptable

   abbreviation is csrc. This option does not have a negative form.

     You can use AmigaDOS wildcard characters to specify filenames. To

   specify several filenames or wildcard patterns, separate each filename

   with a plus (+) sign or a comma (,). You can specify the csource

   option as many times as necessary. See also the descriptions of the

   assembler, object, and library options.

 

 

Data =reference-type

   specifies whether you want the compiler to generate 16-bit or 32-bit

   references to external and static data items. You can specify any of the

   following:

 

   near or n

      tells the compiler to use 16-bit references. If you specify near, all

      data not declared with the _ _ far or _ _ chip keyword are placed

      into the near data section. The default value is near.

 

   far or f

      tells the compiler to use 32-bit references. Register A4 is still

      reserved to point to the near data section so that you can mix code

      compiled with data=near and data=far.


 

90 Chapter 8

 

 

 

 

faronly or fo

  tells the compiler that your program never uses near data. If you

  specify faronly, the compiler generates 32-bit references and

  may use register A4 as an additional register variable. If you

  compile with the data = faronly option, and you declare data

  with the __near keyword, the compiler displays the warning

  message 194:

 

 

     too much local data for NEAR reference,

     some changed to FAR

 

 

  If your entire project is in one source file or is compiled with

  data=faronly, you can ignore this warning unless you get an

  error later in the compilation or link.

 

auto or a

  indicates that the first 64k of external data should generate 16-bit

  references and the remaining external data should generate 32-bit

  references. This option does not have a negative form.

 

    You can override this option on individual data items by using the

  _ _ near, _ _ far, or _ _ chip keywords. _ _ near forces the

  compiler to generate a 16-bit reference, and _ _ far forces the

  compiler to generate a 32-bit reference. _ _ chip forces the compiler

  to place the data item into chip memory. For more information, refer

  to the section "Using Special Keywords" in Chapter 11, "Using Amiga

  Specific Features of the SAS/C Language."

  See also the description of the code option.

 

 

DataMemory=type

  specifies the type of memory into which initialized static or external

  data should be loaded. You can specify any, chip, or fast. You can

  abbreviate these values as a, c, or f. The default value is any. This

  option does not have a negative form.

    This option affects code generated by both the compiler and the

  assembler. See also the descriptions of the bssmem and codemem

  options.


 

                                  Using CompilerOptions 91

 

 

 

 

 

DataName=name

   names the initialized data section. The default value is data. You can

   specify dataname=none or nodataname if you want an unnamed

   data section.

     The linker automatically merges all sections with the same name.

   See also the descriptions of the bssname and codename options. See

   Chapter 12, "How Does the Compiler Work?" for information on data

   and code sections.

 

 

Debug=level

   sets the debugging level of the compiler. If you do not want the

   compiler to generate debugging information, specify nodebug. The

   default value is nodebug. The minimum acceptable abbreviation is

   dbg.

     To generate debugging information, specify debug=level, where

   level is one of the following:

 

   line or l

      produces line number information only.

 

   symbol or s

      produces line number information, information on automatic and

      formal variables, and information on external and static symbols

      that are referenced in the module being compiled.

 

   symbolflush or sf

      produces the same information as symbol, and flushes any non-

      register variables being held in registers to memory at each line

      boundary to allow the debugger to accurately display their values

      in C source mode.

 

   full or f

      produces the same information as symbol. However,

      debug=full produces information on au symbols whether or not

      the module references the symbol.

 

   fullflush or ff

      produces the same information as full, and flushes any non-

      register variables being held in registers to memory at each line

      boundary to allow the debugger to accurately display their values

      in C source mode.

 

     Any debug option except nodebug adds the -d assembler option to

   any assembled files to force debugging line number information on

   assembler output. Also, if you specify the link option and any debug

   option except nodebug, the addsym option is passed to the linker.


 

92 Chapter 8

 

 

 

 

 

 

Define[=]symbol[=value]

  defines the specified preprocessor symbol, as if with a #define

  statement. The minimum acceptable abbreviation is def. This option

  does not have a negative form.

    Do not enter a space between the symbol name and the following

  equal sign. If the value contains a space, enclose the entire argument

  in double quotes ("). As with all other compiler options, the equal sign

  between the define option and the symbol name is optional, so both

  of the following examples are acceptable:

 

 

     define foo=bar

     define=foo=bar

 

 

  You can specify the define option as many times as necessary.

    Any symbols defined with the define option are defined in the

  assembler as well.

    Note: The define compiler option does not affect the linker. Do

  not confuse this option with the define linker option.

 

 

DisAssemble=filename

  tells the compiler to disassemble the code as it is generated and to

  send the disassembly to the file you specify. The default value is

  nodisassemble. The minimum acceptable abbreviation is disasm.

    To send the disassembly to the Shell, use disasm=*.

 

 

Error=n

  tells the compiler to treat the specified message as an error. You can

  specify all or a to promote all enabled warnings to errors, or you

  can specify one or more message numbers to promote only those

  messages. The minimum acceptable abbreviation is err. This option

  does not have a negative form.

    To specify several message numbers, separate each number with a

  plus (+) sign or a comma (,). You can specify the error option as

  many times as necessary. See also the descriptions of the warn and

  ignore options.

 

 

ErrorConsole

  enables printing of diagnostics to the console (stdout). The default

  value is errconsole. The minimum acceptable abbreviation is

  errcon.


 

                                          Using Compiler Options 93

 

 

 

 

 

 

ErrorHighlight

   highlights the token that caused the error using ANSI escape

   sequences in diagnostic output that is sent to the console. The default

   value is errorhighlight. The minimum acceptable abbreviation is

   errhigh.

 

 

ErrorList

   prints diagnostic messages to the listing file. The default value is

   error list. The minimum acceptable abbreviation is errlist. This

   option is ignored if you do not specify the list option.

 

 

ErrorRexx

   sends diagnostic messages to the scmsg utility. The default value is

   noerrorrexx. The minimum acceptable abbreviation is errrexx.

     For more information, refer to the description of the scmsg utility

   in SAS/C Development System User's Guide, Volume 2.

 

 

ErrorSource

   prints lines from the C source file with the diagnostic messages that

   are sent to the console. The default value is errorsource. The

   minimum acceptable abbreviation is errsrc.

 

 

ExternalDefs

   treats all external definitions as definitions. The default value is

   externaldefs. The minimum acceptable abbreviation is extdef.

     If you specify noexternaldefs, all external definitions are

   treated as external declarations. This action has the same effect as if

   you had declared each variable with the extern keyword. For

   example, int i is treated as extern int i, and it would need to

   be defined in a file compiled without noexternaldefs.

 

 

FindSymbol=symbol-name

   tells the compiler to print a warning message each time the specified

   symbol is defined. The minimum abbreviation is fsym. This option

   does not have a negative form. You can specify the findsymbol

   option as many times as necessary.

     If you specify the findsymbol option, a message is produced for

   any definition of the symbol, including #def ine statements, structure

   and union declarations, prototypes, and extern, static, and local

   variable definitions. Use the fsym option to quickly determine where

   a given preprocessor symbol or prototype is coming from.


 

94 Chapter 8

 

 

 

 

 

 

  From

    is included only for compatibility with the slink command. The

    compiler ignores this option. This option does not have a negative

    form.

 

 

  GenProtoDataItems

    generates external declarations for variables defined in the source files

    that are not defined as static. The minimum abbreviation is

    gpdata. The default value is gpdata. This option is ignored if you

    do not specify the genprotos option.

 

 

  GenProtoExterns

    generates prototypes for externally-known routines. The default value

    is genprotoexterns. The minimum acceptable abbreviation is

    gpext.

      This option is ignored if you do not specify the genprotos option.

 

 

  GenProtoFile=filename

    specifies the name of the file in which to place the generated

    prototypes. The default value is filename_protos.h. The

    minimum acceptable abbreviation is gpfile.

      This option is ignored if you do not specify the genprotos option.

 

 

  GenProtoParameters

    generates prototypes using the __PARMS macro. The default value is

    nogenprotoparameters. The minimum acceptable abbreviation is

    gpparm.

      This option allows your C code to compile successfully on compilers

    that support prototypes and on those that do not. On ANSI compilers,

    the __PARMS macro expands to the parameter list for the function,

    thereby creating a prototype. On non-ANSI compilers, the __PARMS

    macro expands to an open-close parentheses pair, which declares the

    function's return type without defining a prototype. This option is

    ignored if you do not specify the genprotos option.

 

 

  GenProtos

    generates prototypes and data declarations instead of compiling your

    file. The default value is nogenprotos. The minimum acceptable

    abbreviation is gproto.

    This option defines the preprocessor symbol _GENPROTO. If you

    specify a filename with the genprotofile option, the prototypes are


 

                                          Using Compiler Options 95

 

 

 

 

   written to the specified file. Otherwise, the prototypes are written to

   the file filename_ protos .h.

     While generating prototypes, the compiler suppresses most warnings

   automatically, because many of the warnings may be due to incorrect

   or missing prototypes. The compiler also checks all #include

   statements as they are reached. If your file #includes the same

   prototype file that is being generated, the compiler skips that

   #include statement. This feature allows you to use this option to

   maintain declarations for all externally-known symbols in each C

   source file and regenerate the declarations as the files change.

     To set up your project so that you can use this option to maintain

   prototype files, do the following:

     1. Create a header file that contains # include statements for each

        of the files in your project, as follows:

 

 

           #include "file1_protos.h"

           #include "file2_protos.h"

             .

             .

             .

           #include "filen_protos.h"

 

 

     2. Include this header file in each file in your project.

     3. Compile your entire project with the genproto option.

 

   As each .c file is compiled, the compiler creates the corresponding

   _protos.h file. The compiler suppresses the header file not

   found warnings that would normally be produced.

 

 

GenProtoStatics

   generates prototypes for static routines. The default value is

   nogenprotostatics. The minimum acceptable abbreviation is

   gpstat.

     This option is ignored if you do not specify the genprotos option.

 

 

GenProtoTypedefs

   tells the compiler to use typedefs instead of resolved types when

   generating prototypes for any functions using typedefs for parameters

   or return values. The default value is genprototypedefs. The

   minimum acceptable abbreviation is gptdef.

     This option is ignored if you do not specify the genprotos option.


 

96 Chapter 8

 

 

 

 

 

 

  GlobalSymbolTable=gst

    tells the compiler to use the specified GST (Global Symbol Table). The

    default value is noglobalsymboltable. The minimum acceptable

    abbreviation is gst.

      The GST must have been created using the

    makeglobalsymboltable option during a previous compilation.

    The gst option is ignored if you specify the

    makeglobalsymboltable option. Therefore, you can enter the

    makeglobalsymboltable in the sc command even if your

    scoptions file contains the gst option.

      This option defines the preprocessor symbol _ GST.

   

  GST=gst-filename

    is a synonym for the GlobalSymbolTable option.

 

 

  GSTImmediate

    is included for compatibility with projects using precompiled header

    files as implemented in Version 5 of the compiler. This option makes

    the contents of the GST you specify with the gst option immediately

    available to the program. The default value is nogstimmediate. The

    minimum acceptable abbreviation is gstimm.

      Normally, symbols defined in a specific header file in the GST are

    available to your program only after you have included the header file

    with a #include statement. This option makes the contents of the

    GST you specify with the gst option immediately available to the

    program, even if your program does not contain #include

    statements for the header file. With Version 5 precompiled header

    files, all symbols in the precompiled header files were available to

    your program even if your program did not contain #include

    statements for the header file.

 

 

  Icons

    tells the compiler to create icons for files that it creates, including

    listing files, preprocessor output files, prototype files, and object files.

    The default value is icon.

      If you specify icons, then each time the compiler generates a file,

    it looks in the drawer sc: icons for an icon named

    def_extension, where extension is the filename extension of

    the file it created. If the compiler finds an icon file appropriate to the

    file extension, it copies the icon to the directory in which the file was

    created. If the compiler cannot find sc: icons or cannot find an icon

    with the appropriate extension, it does not create an icon. If you


   

                                              UsingCompilerOptions 97

 

 

 

 

   specify noicons and link, the noicons option is also passed to the

   linker. For more information, see the section "Using Icons" in

   Chapter 2, "Using Your SAS/C Development System."

 

 

IdentifierLength=n

   specifies the maximum number of significant characters in an

   identifier. The default value is 255. The minimum acceptable

   abbreviation is idlen. This option does not have a negative form.

     Identifiers longer than n are truncated without warning. Identifiers

   longer than n bytes that differ after the first n bytes are treated as

   identical.

 

 

Ignore=n

   tells the compiler to ignore the specified warning message. The

   minimum acceptable abbreviation is ign. This option does not have a

   negative form.

     You cannot ignore error messages. You can specify a 11 or a to

   ignore all warning messages, or you can specify one or more message

   numbers to ignore only those messages. To specify several message

   numbers, separate each number with a plus (+) sign or a comma (,).

   You can specify the ignore option as many times as necessary.

     See also the descriptions of the error and warn options.

 

 

IncludeDirectory=directory

   adds a directory to the list of directories to search for include files.

   The default list is the current directory and include:. The minimum

   acceptable abbreviation is idir. This option does not have a negative

   form. You can specify the incdirectory option as many times as

   necessary.

     Any directories you specify with includedirectory are also

   passed to the assembler as header file search directories.

 

 

ReepLine

   generates #line directives in the preprocessor output file that

   correspond to the lines in the original source files. The default value is

   nokeepline. The minimum abbreviation is kline.

     This option allows you to compile the preprocessed source and get

   error and warning messages that refer you to the correct line in the

   nonpreprocessed version of the file.

     This option is ignored if you do not specify the pponly option.


 

98 Chapter 8

 

 

 

 

 

 

LibCode

  tells the compiler that the compiled code will be linked into a shared

  library. The default value is nolibcode.

    Any functions compiled with libcode and either the __saveds

  keyword or the saveds option load their near data section from a

  point relative to the library base register A6 instead of from a global

  data area. libcode also guarantees that the current library base will

  be in register A6 whenever A6 is referenced or an internal call is

  made.

    Do not use this option when creating a normal executable module.

 

 

Library=link-library-filename(s)

  specifies the link libraries that are to be passed to the linker. The

  minimum acceptable abbreviation is lib. This option does not have a

  negative form.

    You can use AmigaDOS wildcard characters to specify filenames. To

  specify several filenames or wildcard patterns, separate each filename

  with a plus (+) sign or a comma (,). You can specify the library

  option as many times as necessary. Any libraries you specify are

  passed to the linker before the SAS/C libraries. This option is ignored

  if you do not specify the link option.

    See also the description of the csource, object, and asm

  options.

 

 

Link

  tells the compiler to invoke the linker to produce a final executable.

  The default value is nolink.

    If you do not specify link, the compiler ignores any object files and

  link libraries that you specify.

    The options passed to the linker are placed into the file

  program. lnk, and the linker is invoked using this file as a with

  file. To see which linker options were generated, look at the . lnk file

  after sc runs the linker.

 

 

LinkerOptions=option(s)

  passes the provided parameter to the linker as command line options.

  The default value is nolinkeroptions. The minimum acceptable

  abbreviation is linkopt.


 

                                          Using Compiler Options 99

 

 

 

 

     If you want to specify more than one option, or if the option you

   want to specify contains a blank, surround the entire option string

   with double quotes ("), as in the following example:

 

 

           sc linkeroptions=llbufsize 10000 maxhunk 2" link myprog.c

 

 

   Any options specified in the options string are passed to the linker

   after any compiler options that are identified as valid only if you

   specify link. Therefore, the linkeroptions values override the

   values passed by the sc options.

     This option is ignored if you do not specify the link option.

 

 

List

   tells the compiler or assembler to produce a listing file. The default

   value is nolist.

     The compiler writes the output to the filename you specify with the

   listfile option. If you do not specify an output filename, the

   compiler uses the name of the first source file you specify but with the

   extension.lst.

 

 

ListFile=filename

   names the listing and/or cross reference file. The default filename is

   the same filename as the source file but with the extension.lst. The

   minimum acceptable abbreviation is lfile .

     This option is ignored if you do not specify the list or

   xreference options.

 

 

ListHeaders

   tells the compiler or assembler to include user header files in the

   listing. The default value is listheaders. The minimum acceptable

   abbreviation is lhead.

     This option is ignored if you do not specify the list option.

 

 

ListIncludes

   lists the names of all included .h files in the listing file. The default

   value is listinc. The minimum acceptable abbreviation is linc.

     This option is useful for determining:

 

   [] .h file dependencies for smake

   [] the exact path of each .h file used

   [] exactly which .h files are included by other .h files.


 

100 Chapter 8

 

 

 

 

    The hierarchy of files is indicated by indention levels; a file included

  by another file is indented one level deeper than the parent file. This

  option is ignored if you do not specify the list option.

 

 

ListMacros

  tells the compiler or assembler to expand macros in the listing. The

  default value is nolistmacros. The minimum acceptable

  abbreviation is lmac.

    This option is ignored if you do not specify the list option.

 

 

ListNarrow

  tells the compiler or assembler to produce a narrow listing (less than

  80 columns wide). The default value is listnarrow. The minimum

  acceptable abbreviation is lnarr.

    This option is ignored if you do not specify the list option.

 

ListSystem

  tells the compiler to include system header files in the listing. The

  default value is nolistsystem. The minimum acceptable

  abbreviation is lsys .

    This option is ignored if you do not specify the list option.

 

 

MakeGlobalSymbolTable=gst-filename

  creates a GST (Global Symbol Table). The minimum acceptable

  abbreviation is mgst.

    If you specify the gst and makegst options, the gst option is

  ignored. Therefore, you can enter the makegst in the sc command

  even if your scoptions file contains the gst option. This option

  automatically enables the nomultipleincludes and

  noexternaldefs options. For more information on creating and

  using GSTs, refer to SAS/C Development System Library Reference.

    This option defines the preprocessor symbol _ MGST.

 

 

Map

  produces a map of the executable module. The default value is nomap.

  This option is ignored if you do not specify the link option.

 

 

MapFile=filename

  names the map file. The default value is executable.map. The

  minimum acceptable abbreviation is mfile.

    This option is ignored if you do not specify the link and map

  options.


 

                                        Using Compiler Options 101

 

 

 

 

 

 

MapHunk

   maps all output hunks by size and originating function. The default

   value is nomaphunk. The minimum acceptable abbreviation is

   nomhunk .

     This option is ignored if you do not specify the link and map

   options.

 

 

MapLib

   generates a list of hunks by library symbol in the map. The default

   value is nomaplib. The minimum acceptable abbreviation is mlib.

     This option is ignored if you do not specify the link and map

   options.

 

 

MapOverlay

   includes a list of hunks in each overlay in the map. The default value

   is nomapoverlay. The minimum acceptable abbreviation is movly.

     This option is ignored if you do not specify the link and map

   options.

 

 

MapSymbols

   includes a list of defined symbols and the location at which they are

   defined. The default value is nomapsymbols. The minimum

   acceptable abbreviation is msym.

     This option is ignored if you do not specify the link and map

   options.

 

 

MapXreference

   writes a symbol cross-reference to the map file that lists each symbol

   definition and the places each symbol is used. The default value is

   nomapxreference. The minimum acceptable abbreviation is

   mxref.

     This option can generate a lot of output, but it is useful when you

   are trying to track down where an unresolved symbol is referenced.

   This option is ignored if you do not specify the link and map

   options.


 

102 Chapter 8

 

 

 

 

 

 

Math=type

  chooses a format for floating-point math and, if you also specify the

  link option, links with the appropriate math library. The default

  value is nomath.

    You can specify one of the following as the type:

 

  standard or s

    links with the library scm.lib (or with scms.lib if you specify

    the shortint option). The math format is IEEE.

 

  ffp or f

    generates code to call the FFP shared library provided by

    Commodore. The math format is FFP.

 

  68881, 68882, or 8

    generates inline code for the 68881 and 68882 coprocessors. If

    you specify one of these coprocessor options, your program will not

    run if a coprocessor is not available. coprocessor is a synonym

    for these options. The math format is IEEE.

 

  ieee or i

    generates code to call the IEEE shared library provided by

    Commodore. The math format is IEEE.

   

  Some math options define preprocessor symbols. See the section

  "Using Preprocessor Symbols Defined by the Compiler," later in this

  chapter, for a list of those symbols.

    For additional information about compiling and linking with math

  libraries, refer to Chapter 3, "Using the SAS/C Libraries," in SAS/C

  Development System Library Reference.

 

 

MaximumErrors=n

  sets the limit on the number of errors for a single compilation. The

  default value is 50. The minimum acceptable abbreviation is maxerr.

    If a single compilation generates more than n errors, the compiler

  aborts the compilation. nomaxerr removes any limits.

 

 

MaximumWarnings=n

  sets the limit on the number of warnings for a single compilation. The

  default value is nomaxwrn. The minimum acceptable abbreviation is

  maxwrn.

    If a single compilation generates more than n warnings, the

  compiler aborts the compilation. nomaxwrn removes any limits.


 

                                         Using Compiler Options 103

 

 

 

 

 

MemorySize=size

   tells the compiler approximately how much memory you have on your

   system. You can specify one of the following:

 

   [] tiny or t

   [] small or s

   [] medium or m

   [] large or l

   [] huge or h

 

   The default value is large. The minimum acceptable abbreviation is

   memsize. This option does not have a negative form.

     Larger sizes allow sc to compile more complex programs and to

   compile faster. Smaller sizes allow sc to continue to work under low-

   memory conditions. If the compiler runs out of memory during a

   compilation, it displays the message ***Freeing Resources,

   attempts to free up memory, and automatically drops to a lower

   memorysize value.

     memorysize affects how and where the compiler stores any

   debugging information. If the compiler begins to run out of memory, it

   starts writing debugging information to a disk file. This file is referred

   to as a debug side file.

     memorysize also affects the disposition and buffering of the

   compiler intermediate file. This option tells the compiler how much

   initial memory space to reserve for the intermediate information. For

   large and huge, the intermediate file is kept totally in memory,

   which is much faster than writing it to disk when the memory is

   available. At smaller values, the intermediate file is written to disk,

   but the memorysize value affects the amount that is buffered.

     In addition, if you do not specify the preprocessorbuffer

   (ppbuf) and/or argumentsize (argsize) options, the

   memorysize option sets these values for you. If you specify the

   preprocessorbuffer and/or argumentsize options, the values

   you specify override the values set by memorysize.


 

104 Chapter 8

 

 

 

 

  The following table lists the default values for argumentsize and

preprocessorbuffer by memorysize. It also lists the buffer size

and location of the compiler intermediate file.

 

 

 

                             Intermediate    Debug Side

memsize   argsize   ppbuf    File Buffer     File Buffer

 

tiny      127       1024     1024            2K

small     255       2048     4096            8K

medium    511       4096     8192            32K

large     1023      8192     no limit        64K

huge      4800      16384    no limit        128K

 

 

 

  See also the descriptions of the prepro~essorbuffer and

argumentsize options.

 

Modified

  tells the sc command to process only files that are out of date with

  respect to their output files. The default value is nomodified. The

  minimum acceptable abbreviation is mod.

    This option is useful if you are compiling several files with a single

  sc command and only some of the files need to be recompiled. This

  option also works when you are generating prototypes or preprocessor

  output. If you also specify the link option, all object files are

  included in the link, even if their source files were not recompiled.

 

 

MultipleCharacterConstants

  allows up to four bytes to appear within single quotes as a character

  constant. This option is included only for compatibility with previous

  releases of the compiler, and its use is not recommended. The

  minimum acceptable abbreviation is mccons. The default value is

  nomccons.


 

                                         Using Compiler Ophons 105

 

 

 

 

     If you specify mccons, a single constant of type int is generated.

   If fewer than four bytes are provided, they are padded on the left with

   ~eroes, as in the following example:

 

 

      #include <stdio.h>

       void main(void)

 

 

         long l = 'abcd';

         long m = '\x01\x02\x03';

         printf("l=0x%081x, m=0x%081x\n", l, m);

 

 

 

   This example program prints the following:

 

 

      l=0x61626364, m=0x00010203

 

 

 

 

MultipleIncludes

   tells the compiler to include header files that are included more than

   once. The default value is multipleincludes. The minimum

   acceptable abbreviation is minc.

     This behavior is required by the ANSI Standard. However, many

   projects do not need this behavior, and specifying nominc can save

   compilation time.

 

 

Object=filename(s)

   lists the object files that are to be linked into the program. The

   minimum acceptable abbreviation is obj. This option does not have a

   negative form.

     The object files must have been created during a previous

   compilation. Do not specify object files that will be created by the

   same sc command in which you specify the ob ject option. You can

   use AmigaDOS wildcard characters to specify filenames. To specify

   several filenames or wildcard patterns, separate each filename with a

   plus (+) sign or a comma (,). You can specify the ob ject option as

   many times as necessary.

     This option is ignored if you do not specify the 1 ink option. See

   also the descriptions of the csource, library, and assembler

   options.


 

106 Chapter 8

 

 

 

 

 

ObjectLibrary=link-library-name

  specifies that any resulting object files are to be placed in the named

  link library. The minimum acceptable abbreviation is objlib.

    Do not specify this option if you also specify the link option.

 

 

ObjectName=file-or-directory-name

  specifies the name of the file or directory to hold compiler and

  assembler output. The minimum acceptable abbreviation is objname.

  If you are compiling or assembling only one C source file or

  assembly-language file, you can use this option to specify the file

  where you want the compiler or assembler output. If you are

  compiling or assembling more than one file, you can use this option to

  specify a directory where you want the output, and sc uses the same

  filename as the source file but replaces the extension with .o. The

  directory name must end with a forward slash (/) or a colon (:). If you

  do not use the objectname option, sc uses the same filename with

  the extension of .o, but it places the files in the same directory as the

  source file.

 

 

OldPreprocessor

  is provided for compatibility with pre-ANSI style preprocessors. The

  default value is nooldpreprocessor. The minimum acceptable

  abbreviation is oldpp.

    The oldpp option does the following:

 

  [] allows old-style token pasting using comments

  [] substitutes values for parameters specified as quoted strings in

     macro definitions.

 

  For example, suppose you have the following program:

 

 

     #define FOO ( bar ) "bar"

       void main(void)

       {

         printf ( "%s\n", FOO(test) );

       }


 

                                         Using Compiler Options 107

 

 

 

 

   If you compile this program with oldpp, the program prints test. If

   you compile this program with nooldpp, the program prints bar. To

   make this program work with the ANSI features and the nooldpp

   option, substitute the following for the #define:

 

 

     #define FOO(bar) #bar

 

 

    As an additional example, suppose you have the following program:

 

 

     #define FOO(bar) foo_/**/bar

      void main(void)

      {

 

        int foo_test;

        int foo_xxx;

 

 

        FOO(test) = 10;

        FOO(xxx)  = 20;

        printf("%d %d\n", foo_test, foo_xxx);

      }

 

 

   If you compile this program with oldpp, the #define concatenates

   the text of the argument after the string foo_ and the program prints

   10 20. If you compile this program with nooldpp, the program

   produces a compilation error. To make this program work with the

   ANSI features and the nooldpp option, substitute the following for

   the #define:

 

 

     #define FOO(bar) foo_##bar

 

 

 

OnError=x

   tells sc what action to take if a C or assembly language source file

   generates an error. The minimum acceptable abbreviation is onerr.

   This option does not have a negative form.


 

108 Chapter 8

 

 

 

 

    You can specify one of the following:

 

  stop or s

    tells sc not to process any more source files. The default value is

    stop.

 

  continue or c

    tells sc to process the next source file.

 

  If you specify the link option, but your program generates errors,

your program is not linked even if you specify onerr=continue.

 

 

Optimize

  enables the global optimizer (unless you specify nooptglobal) and

  peephole optimizer (unless you specify nooptpeep). The default value

  is nooptimize. The minimum acceptable abbreviation is opt.

 

 

OptimizerAlias

  disables type-based aliasing assumptions in the optimizer. The default

  value is nooptimizeralias. The minimum acceptable abbreviation

  is optalias.

    If you specify optimizeralias, the global optimizer uses worst-

  case aliasing. Specifying optimizeralias can significantly reduce

  the amount of optimization that can be performed. This option is

  ignored if you do not specify the optimize and optglobal options.

 

 

OptimizerComplexity=n

  defines the maximum complexity level of functions to be automatically

  inlined. The default value is 3. The minimum acceptable abbreviation

  is optcomp.

    The parameter n represents the relative complexity of the function

  to be inlined and is a count of the number of discrete operations in

  the function. Try different values for this number until you get the

  results you want. Specify a value of 3 or higher. The higher the

  number, the more functions you can inline, but the size of your code

  will grow significantly as well.

    If you specify nooptcomp, no complexity-based inlining occurs.

  This option is ignored if you do not specify the optimize,

  optglobal, and optimizerinline options.


 

                                         Using Compiler Options 109

 

 

 

 

 

 

OptimizerDepth=n

   defines the maximum nesting depth of automatically inlined functions.

   The default value is 3. The minimum acceptable abbreviation is

   optdep.

     Specify a value of 3 or higher. This option is ignored if you do not

   specify the optimize, optglobal, and optimizerinline

   options.

 

 

OptimizerGlobal

   enables the global optimizer. The default value is

   optimizerglobal. The minimum abbreviation is optgo. This

   option is ignored if you do not specify the optimize option.

 

 

OptimizerInline

   allows inlining of functions, including functions defined with the

   _ _ inline keyword. The default value is optimizerinline. The

   minimum acceptable abbreviation is optinl.

     This option is ignored if you do not specify the optglobal and

   opt imi z e options.

     If you do not specify this option, the optinlocal, optdepth,

   optcomplexity, and optrdepth options are ignored.

 

 

OptimizerInLocal

   inlines single use static functions. The default value is

   nooptimizerinlocal. The minimum acceptable abbreviation is

   optinlocal.

     This option is ignored if you do not specify the optimize,

   optglobal, and optimizerinline options.

 

 

OptimizerLoop

   enables loop optimizations. The default value is optimizerloop.

   The minimum acceptable abbreviation is optloop.

     This option is ignored if you do not specify the optimize and

   optglobal options.

 

 

OptimizerPeephole

   enables the peephole optimizer. The default value is

   optimizerpeephole. The minimum acceptable abbreviation is

   optpeep.

     This option is ignored if you do not specify the optimize option.


 

110 Chapter 8

 

 

 

 

 

 

OptimizerRecurDepth=n

  defines the maximum depth of recursion of automatically inlined

  functions. The default value is 3. The minimum acceptable

  abbreviation is optrdep.

    Specify a value of 3 or higher. This option is ignored if you do not

  specify the optimize, optglobal, and optimizerinline

  options.

 

 

OptimizerSize

  disables optimizations that may sacrifice code size to save time. The

  default value is nooptsize. The minimum acceptable abbreviation is

  optsize.

    This option is ignored if you do not specify the optimize and

  optglobal options. Do not specify both the optimizersize and

  optimizertime options.

 

 

OptimizerTime

  disables optimizations that may sacrifice time to save space. The

  default value is nooptimizertime. The minimum acceptable

  abbreviation is opttime.

    This option is ignored if you do not specify the optimize and

  optglobal options. Do not specify both the optimizersize and

  optimizertime options.

 

 

Parameters =method

  indicates how parameters should be passed. The minimum acceptable

  abbreviation is parm. This option does not have a negative form.

    You can specify one of the following:

 

  stack or s

    indicates parameters should be passed on the stack. The default

    value is stack.

 

  register or r

    indicates parameters should be passed in registers.

 

  both or b

    generates a combination prolog that allows parameters to be passed

    on the stack or in registers.

 

  If your program has prototypes for all routines, you should probably

  use parameters=register for increased efficiency. If you are

  placing code into a link library, specify parms=both so that your

  library functions accept registerized parameters and parameters that

  are passed on the stack.


 

                                         Using Compiler Options 111

 

 

 

 

     If you write a function that has the same name as a library function,

   you need to add the __regargs keyword to your function or

   compile with the parms=both or parms=register option. For

   example, you may want to replace the SAS/C library function malloc

   with your own version of malloc. If you compile with the

   parms=stack option or define your version of malloc with the

   __stdargs keyword, then two versions of malloc are linked into

   your executable. If you use other SAS/C library functions that call

   malloc, these functions use the version of malloc in the SAS/C

   libraries. However, your functions that call malloc use your version

   of malloc. To make sure that all calls to malloc are using your

   version of malloc, define your version with __regargs or compile

   with the parms=both or parms=register option.

     For information about passing parameters between C language

   functions and assembly-language functions, refer to Chapter 11,

   "Using Assembly Language with C Language," in SAS/C Development

   System User's Guide, Volume 2.

 

 

Precision=precision

   specifies the size of floating-point variables. You can specify double

   or mixed. The default value is mixed. The minimum acceptable

   abbreviation is prec. This option does not have a negative form.

     If you specify double, data declared as float are treated as if

   they were declared as double. If you specify mixed, data declared as

   float and data declared as double are different sizes.

 

 

PreprocessorBuffer=n

   sets the maximum number of bytes to which a macro can be expanded

   by the preprocessor. The default value is 8192 unless set differently

   by the memorysize option. The minimum acceptable abbreviation is

   ppbuf. This option does not have a negative form.

     If a macro expands to greater than n bytes, the compiler issues an

   error message and aborts the compilation. See the description of the

   memorysize option for more information.

 

 

PreprocessorOnly

   tells the compiler to run only the preprocessor on the C source files.

   The default value is nopreprocessoronly. The minimum

   acceptable abbreviation is pponly.


 

112 Chapter 8

 

 

 

 

    If you specify a filename with the ob jectname option, the

  compiler writes the output to the file you specify. If you do not specify

  an output filename, the compiler writes the output to the same

  filename as the source file but with the extension . p.

    This option defines the preprocessor symbol _ PPONLY.

 

 

ProgramName=output-module-name

  specifies the name of the executable module. The default value is the

  root name of the first source file specified in the sc command. The

  minimum acceptable abbreviation is pname. This option does not have

  a negative form.

    This option is ignored if you do not specify the 1 ink option.

 

 

ResetOptions

  resets all options to their default values. The minimum acceptable

  abbreviation is resopt. This option does not have a negative form.

    If you specify this option as the first option in the sc command, it

  resets any option specified in the scoptions file. If you specify this

  option after other options or filenames in the sc command, it resets

  the options preceding it, including the filenames.

 

 

Saveds

  generates code as if you had defined all functions in the source files

  with the __saveds keyword. The default value is nosaveds.

    The __saveds keyword restores the near data pointer in register

  A4 at each function entry point. You should specify this option if you

  are compiling code that is used as an interrupt routine, called with the

  AddTask function, used in a shared library, or called from another

  process. This option does not work if your code is linked with the

  cres.o or catchres.o startup modules.

 

 

ShortIntegers

  enables 16-bit integers. The default value is noshortintegers. The

  minimum acceptable abbreviation is sint.

    If you specify shortintegers, types int and short are the

  same size. If you specify noshortintegers, types int and long

  are the same size. If you are running the assembler, this option

  defines the symbol shortint. This option also defines the

  preprocessor symbol _SHORTINT.


 

                                         Using Compiler Options 113

 

 

 

 

 

 

SmallCode

   tells the linker to merge all code hunks into a single hunk. The

   default value is nosmallcode. The minimum acceptable abbreviation

   is scode.

     This option is ignored if you do not specify the link option. See

   also the description of the smallcode linker option.

 

 

SmallData

   tells the linker to merge all data and bss sections into a single hunk.

   The default value is nosmalldata. The minimum acceptable

   abbreviation is sdata.

     This option is ignored if you do not specify the link option. See

   also the description of the smalldata linker option.

 

 

SourceIs=filename

   sets the name of the C source file in the object file and in debugging

   information to the specified value instead of the actual name of the C

   source file. The minimum acceptable abbreviation is srcis.

     You can use this option if you plan to rename or move the source

   file before using the debugger to debug your program. If you are

   compiling or assembling exactly one source file, sourceis can

   specify the name of the file to be placed into the debug information. If

   you are compiling or assembling multiple files, sourceis should

   specify a directory name (ending with a forward slash or colon).

 

 

StackCheck

    generates stack overflow checking code at each function entry. The

    default value is stackcheck. The minimum acceptable abbreviation

    is stkchk.

     When a program is about to run out of stack space, the program

   displays a requestor and terminates gracefully. For a complete

   description of the stackcheck option, see Chapter 11, "Using Amiga

   Specific Features of the SAS/C Language."

 

 

StackExtend

    generates stack extension code at each function entry. The default

    value is nostackext. The minimum acceptable abbreviation is

    stkext.

     When a program runs out of space in the current stack, a new stack

   is allocated, and your program continues to run. For a complete

   description of the stackext option, see Chapter 11, "Using Amiga

   Specific Features of the SAS/C Language."


 

114 Chapter 8

 

 

 

 

 

 

StandardIO

  specifies the use of __main instead of __tinymain. The default

  value is standardio. The minimum acceptable abbreviation is

  stdio.

    To use __tinymain, specify nostdio. Using __tinymain

  makes your program require less space, but you cannot read from or

  send output to stdin, stdout, and stderr. This option is ignored

  if you do not specify the link option.

 

 

StartUp=module-name

  specifies which startup module to use. The default value is c (for

  c.o). The minimum acceptable abbreviation is strt.

    If the module name that you specify does not contain a colon (:),

  forward slash (/), or period (.), the compiler adds lib: to the

  beginning and . o to the end of the name you specify. If you do not

  want to compile with a startup module, specify nostartup. This

  option is ignored if you do not specify the link option.

 

 

Strict

  enables a large number of diagnostics dealing with portability and

  questionable situations in your code. The default value is nostrict.

    Specifying strict may produce warning messages for situations

  that are not a problem.

    For more information on improving the portability of your code, see

  Chapter 13, "Writing Portable Code."

 

 

StringsConst

  tells the compiler to consider all string constants to be of type

  const char *. The default value is nostringsconst. The

  minimum acceptable abbreviation is strcons .

  If you do not specify stringsconst, the compiler considers string

  constants to be of type char *. If you specify stringsconst,

  passing a string constant to a function that expects the type char *

  generates a warning message indicating that the function may modify

  the string constant.

 

 

StringMerge

  merges all identical string constants in the C source file and places all

  strings, all data declared static const, and all auto initializers in

  the code section instead of the data section. The default value is

  nostringmerge. The minimum acceptable abbreviation is strmer.


 

                                       Using Compiler Options 115

 

 

 

 

  If you specify stringmerge, the compiler examines each string

constant defined in the code and checks for duplicates. If the compiler

finds a duplicate string constant, it forces both references to refer to

the same memory location.

If you specify stringmerge and you modify a string constant, the

constant is modified in all locations. For example, suppose you have

the following program:

 

 

   #include <stdio.h>

   void modifyme(char *);

   void main(void)

   {

 

     modifyme("Hello, World! \n");

     printf("Hello, World ! \n");

 

   }

 

   void modifyme(char *msg)

   {

     strcpy(msg, "Foobar\n");

 

   }

 

If you compile the program with stringmerge, the program prints

Foobar. If you compile the program with nostringmerge, the

program prints Hello, World!.

The stringmerge option has two useful side effects. Because some

data are placed in the code section:

 

[] Less data needs to be placed into the near data section. If you have

   more than 64k of data, you can use the stringmerge option to

   try to reduce the amount of data and allow your code to continue to

   use the near data model.

[] The string constants are addressed relative to the PC (program

   counter) instead of the beginning of the near data section.

   Therefore, it is possible to generate programs with no near or far

   data.

 

For more information on the code and near data sections, see

Chapter 12, "How Does the Compiler Work?"


 

116 Chapter 8

 

 

 

 

 

 

StripDebug

  strips all debugging information from the final executable. The default

  value is nostripdebug. The minimum acceptable abbreviation is

  stripdbg.

    This option is ignored if you do not specify the link option.

 

 

StructureEquivalence

  tells the compiler not to issue messages if a pointer to one structure

  type is passed to a function when the function expects a pointer to a

  different type, if the type passed is equivalent to the type expected.

  The default value is nostructureequivalence. The minimum

  acceptable abbreviation is streq.

  For information on using"equivalent structures, see Chapter 11,

  "Using Amiga Specific Features of the SAS/C Language."

 

 

To =filename

  is included only for compatibility with the slink command. to is a

  synonym for the programname option. This option does not have a

  negative form.

 

 

Trigraph

  specifies whether to use ANSI trigraphs. The default value is

  notrigraph. The minimum acceptable abbreviation is trig.

    Specifying trigraph slows down the compiler.

 

 

Underscore

  adds underscores to the beginning of all external names defined in any

  assembler source files assembled. The default value is

  nounderscore. The minimum acceptable abbreviation is uscore.

  The underscores allow you to refer to these names in assembly

  language in the same way you do in C source files. This option is

  ignored if you do not specify any assembly-language files in the sc

  command. For more information, refer to Chapter 11, "Using

  Assembly Language with C Language," in SAS/C Development System

  User's Guide Volume 2.

 

 

UnsignedChar

  makes the default type of char variables unsigned instead of

  signed. The default value is nounsignedchar. The minimum

  acceptable abbreviation is uchar. This option defines the preprocessor

  symbol _UNSCHAR.


 

                                         Using Compiler Options 117

 

 

 

 

 

UtilityLibrary

   generates inline calls to the AmigaDOS 2.0 ROM-resident library

   utility. library to do integer multiplication and division instead

   of calling SAS/C library functions to do these operations. The default

   value is noutilitylibrary. The minimum acceptable abbreviation

   is utillib.

     Specifying utilitylibrary makes your executable smaller and

   faster by taking advantage of 68020 instructions if they are available,

   but your program runs only under AmigaDOS 2.0. If you link using

   the sc command and the utilitylibrary and link options, sc

   defines all the SAS/C library integer conversion stub routines to stubs

   that call utility. library. This action prevents the SAS/C library

   routines that use integer conversion routines from using the SAS/C

   versions of the routines. If you link using the slink command, you

   need to specify the following def ine linker options:

 

 

     define __CXM33=__UCXM33

     define __CXD33=__UCXD33

     define __CXM22=__UCXM22

     define __CXD22=__UCXD22

 

 

   These define options are in the file LIB:utillib.with, so you

   can link with the following command:

 

 

     slink with LIB:utillib.with options

 

 

 

 

Verbose

   displays messages about each stage of compiling and linking. The

   default value is noverbose.

 

 

Version

   prints a banner containing the compiler version number and a

   copyright message. The default value is version. The minimum

   acceptable abbreviation is ver.

 

 

Warn=n

   enables the specified compiler warning message. The minimum

   acceptable abbreviation is wrn. This option does not have a negative

   form.

     You can specify a 11 or a to enable all warning messages, or you

   can specify one or more message numbers to enable only those


 

118 Chapter 8

 

 

 

 

  messages. To specify several message numbers, separate each number

  with a plus (+) sign or a comma (,). You can specify the warn option

  as many times as necessary.

  See also the description of the error and ignore options.

 

 

WarnVoidReturn

  issues a warning message if a function declared as returning an

  integer actually returns no value. The default value is

  warnvoidreturn. The minimum acceptable abbreviation is wvret.

  The nowarnvoidreturn option suppresses the return value

  mismatch warning message for functions declared as returning an

  integer, but that do not contain a return statement or that do not

  include an expression in the return statement.

 

 

With=filename

  specifies the name of a file containing additional options. The

  additional options are read immediately, as if they were specified in

  the sc command at the position occupied by the with option. Options

  specified after the with option may override options specified in the

  with file. This option does not have a negative form. You can specify

  the with option as many times as necessary.

    Note: Do not confuse this option with the with linker option.

 

 

XREF

  is a synonym for the xreference option.

 

 

XReference

  produces a cross-reference. The default value is noxreference. The

  minimum acceptable abbreviation is xref.

  The compiler writes the output to the filename you specify with the

  listfile option. If you do not specify an output filename, the

  compiler uses the name of the first source file you specify but with the

  extension.lst.

 

 

XReferenceHeaders

  generates a cross-reference of user header files. The default value is

  xreferenceheaders. The minimum acceptable abbreviation is

  xhead.

    This option is ignored if you do not specify the xre f erence

  option.


 

                                                                Using Compiler Options 119

 

 

 

 

 

 

                    XReferenceSystem

                       includes symbols defined in system header files in the cross-reference.

                       The default value is xreferencesystem. The minimum acceptable

                       abbreviation is xsys.

                         This option is ignored if you do not specify the xreference

                       option.

 

 

             Using    The compiler automatically defines certain preprocessor symbols each

      Preprocessor    time you run the compiler, and it defines other symbols only when you

   Symbols Defined    use specific compiler options.

   by the Compiler      Table 8.2 lists each of the symbols that the compiler automatically

                      defines each time you run the compiler.

 

 

           Table 8.2

Preprocessor Symbols   Symbol               Value

      Defined by the   _AMIGA               1

            Compiler   _M68000              1

                       __SASC               1

                       __SASC_60            1

                       __VERSION__          6

                       __REVISION__         0

                       __STDC__             1

                       __ FILE __           current filename

                       __ LINE __           current line number

                       __ FUNC __           current function

                       __ DATE __           current date

                       __ TIME __           current time

 

 

 

 

                       Table 8.3 lists each of these preprocessor symbols defined when you

                     use specific compiler options and the options that #def ine these

                     symbols. These symbols are defined to 1 when you specify the

                     corresponding option. For example, if you specify the noansi option, the

                     AMIGA symbol is defined as follows:

 

 

                                #define AMIGA  1


 

120 Chapter 8

 

 

 

 

            Table 8.3

 Preprocessor Symbols   Symbol               Compiler Options

  Defined by Compiler   AMIGA                noansi

              Options   LPTR                 noansi and noshortint

                        SPTR                 noansi and shortint

                        LATTICE              noansi

                        LATTICE_50           noansi

                        _M68010              cpu=68010|68020|68030|68040

                        _M68020              cpu=68020|68030|68040

                        _M68030              cpu=68030|68040

                        _M68040              cpu=68040

                        _M68881              math=68881

                        _FFP                 math=FFP

                        _IEEE                math=IEEE

                        _SHORTINT            shortint

                        _UNSCHAR             unschar

                        _PPONLY              pponly

                        _GENPROTO            genproto

                        _MGST                makegst

                        _GST                 gst

 

 

 

                       Linking Your Program

 

                       As described in Chapter 2, "Using Your SAS/C Development System,"

                       you can link your program from the Shell by specifying the link option

                       in the sc command or from the Workbench screen by specifying the

                       link option in your scoptions file and double-clicking on the Build

                       icon.

                         You can also compile and link your program in separate steps. If you

                       do not specify the link option on the sc command line, you need to call

                       the linker, slink, to link your program. Use the slink command only

                       if you are limited by the s c command. For the majority of programs,

                       linking with the sc command is much simpler and easier than linking

                       with the slink command. If you link using the sc command, you can

                       specify linker options with the linkeropt compiler option.


 

                                                                Using Compiler Options 121

 

 

 

 

     Entering  The After you have compiled your program, you can enter the slink

slink Command  command as follows:

                 slink object-files [options]

 

               You must specify at least one object file. You probably also need to

               specify a startup module and one or more libraries.

 

 

Specifying Linker  The slink command accepts the following options:

          Options

                    addsym

                       generates hunk_symbol records for all externally-visible symbols in

                       each object file and library module whether or not the object file was

                       compiled with the debug compiler option. This option gives

                       CodeProbe the location, but not the size or type, of any externally

                       visible symbols in your program.

 

                     batch

                        sets the value of all undefined data symbols to 0 and all undefined

                        code symbols to _ _ _ stub. Normally, slink asks you to enter a

                        value for each undefined symbol. However, if you specify batch,

                        slink does not prompt you to enter values for undefined symbols.

                           If an undefined function is called, the library function _ _ stub

                        (_ _ _stub to the linker) is called instead. The library's version of

                         _ _ stub displays a requester telling you that an undefined routine

                         was called and allows you to choose whether to abort or continue.

 

                     bufsize n

                        sets the I/O buffer size for slink. By default, slink buffers all

                        object modules. Buffering requires more memory but reduces the time

                        required to link your program. If you run out of memory while

                        linking, try linking with bufsize 4096. This specification tells

                        slink to buffer only one file at a time and to use a buffer size of

                        4096 bytes.

 

                      chip

                        specifies that all hunks are to be placed in chip memory regardless of

                        the input object hunk specifications. However, if you specify f a st or

                        chip for the datamem, codemem, or bssmem compiler options, that

                        value overrides this option.

                          The chip option is provided for compatibility with previous

                        versions of the linker. It is recommended that you use the datamem,

                        codemem, and bssmem compiler options instead.

 

                     define symbol[=value]

                        defines a symbol to be used in the linking process. You can use this

                        option with the prelink option to force specific routines from the


 

122 Chapter 8

 

 

 

 

  libraries to be linked into your program even though your program

  does not contain any references to the routines.

    Remember that linker symbols have an extra underscore added to

  the beginning of the symbol name. To refer to a function f oo using

  the define option, you must specify _foo. To refer to registerized

  functions, add an at (@) sign to the beginning of the symbol name, as

  in @foo.

    Note: Do not confuse this option with the define compiler

  option.

 

fancy

  enters control characters to highlight and bold headings in the map

  file. The option is on by default. To disable the use of these control

  characters, specify the plain option. fancy is ignored if you do not

  specify the map option.

 

fast

  specifies that all hunks are to be placed in fast or expansion memory

  regardless of the input object hunk specifications. However, if you

  specify fast or chip for the datamem, codemem, or bssmem

  compiler options, that value overrides this option.

    The fast option is provided for compatibility with previous

  versions of the linker. It is recommended that you use the datamem,

  codemem, and bssmem compiler options instead.

 

faster

  is included only for compatibility with the Commodore linker, alink.

 

from object-filename(s)

  identifies the object files that are the primary input to the linker. You

  can specify the from option as many times as necessary in the slink

  command. If you specify the object files as the first items in the

  slink command, you do not need to use the from option. The root

  option is a synonym for this option.

    The object files are copied to the root of the object module. You

  must specify at least one object file in the slink command.

 

fwidth n

  specifies the filename width, in columns, in the map file. The default

  value is 16. This option is ignored if you do not specify the map

  option.

 

height n

  specifies the total number of lines on a page in a map file. If you

  specify 0, the linker does not add form feed characters to the file. The

  default value is 55. This option is ignored if you do not specify the

  map option.


 

                                        Specifying Linker Options 123

 

 

 

 

hwidth n

   specifies the hunk name field width, in columns, in the map file. The

   default value is 8. This option is ignored if you do not specify the map

   option.

 

indent n

   specifies the number of columns to indent on a line in the map file.

   The map file is indented n columns from the value specified by the

   width option. The default value is 0. This option is ignored if you do

   not specify the map option.

 

libfd filename

   specifies the name of a function description ( . fd) file. Use this option

   only if you are building a shared library.

     For information on creating shared libraries, refer to SAS/C

   Development System Library Reference.

 

libprefix prefix

   specifies the prefix you want added to the functions listed in the

   function description ( .fd) file. The default prefix is an underscore ( _ ).

   Use this option only if you are building a shared library. The

   libpref ix option allows the library to call entry points within itself,

   without using the library base.

     Make sure that the function declarations in your source code match

   the full name, including any specified prefix. For example, suppose

   your library has a function called myfunc. Your . fd file contains the

   following line:

 

 

      myfunc(a)(dO)

 

 

   If you specify a prefix of _ LIB, you should declare the function in

   your source code as LIBmyfunc, as shown in the following example:

 

 

      #pragma mylibbase myfunc 1e OOl

 

 

      __asm LIBmyfunc(register __d int a)

 

      {

        return a+l;

      }

 

 

      void test(void)

      {

 

         LIBmyfunc(l); /* Call myfunc directly.                  */

         myfunc(2);      /* Call myfunc through the library base. */

      }


 

124 Chapter 8

 

 

 

 

    For information on creating shared libraries, refer to SAS/C

  Development System Library Reference.

 

library link-library-filename(s)

  specifies the library files that you want the linker to search for

  modules referenced in your code. Only referenced modules from

  library files are included in the final executable module. You can

  abbreviate this option as lib.

 

librevision n

  specifies a minor revision number of the library you are creating. If

  you do not specify a revision number, it defaults to 0. Use this option

  only if you are building a shared library.

    For information on creating shared libraries, refer to SAS/C

  Development System Library Reference.

 

libversion n

  sets the version number of the library you are creating. You can set

  the version number to any number from 0 to 255. The default is 1.

  Use this option only if you are building a shared library.

    For information on creating shared libraries, refer to SAS/C

  Development System Library Reference.

 

map [mapfile [map-option[,]map-optlon...]]

  tells slink to create a map file. The map file contains information on

  the size and location of all hunks and the value of all symbols.

    If you do not specify a mapfile, the linker writes the map

  information to the file executable.map. If you specify a mapfile,

  you can also specify the following map file options:

   f  lists the hunks in each file

   h  lists hunks by size and originating function

   l  lists hunks by library function

   o lists hunks in each overlay

   s lists where symbols are defined

   x creates a symbol cross-reference that lists where the symbols are

     defined and their definition.

 

maxhunk n

  limits to n bytes the size of the hunks that slink creates when

  merging hunks. By default, there is no limit on hunk size.

 

noalvs

  issues warning messages if slink generates an automatic link vector

  (ALV) instruction to resolve 16-bit program counter-relative

  references. Using this option stops slink from creating a non-

  relocatable module from what was intended to be relocatable code.


 

                                        Specifying Linker Options 125

 

 

 

 

nodebug

   is included for compatibility with previous release of the linker. Use

   the stripdebug option instead. You can abbreviate this option as

   nd.

 

onedata

   tells the linker to merge all data, bss, and chip sections. Merging

   hunks may decrease the time required to load your program but may

   produce larger hunks that are difficult to scatter load.

 

overlay

   identifies the start of an overlay tree. You should enter the overlay

   option and the list of files in each overlay in a with file, as follows:

 

   overlay

   overlay-1-filename(s)

   *overlay-2-filename(s)

   .

   .

   .

   #

 

   You must terminate the overlay tree with a line consisting of a single

   pound (#) sign. For more information, see " Using Overlays," later in

   this chapter. See also the description of the with option.

 

ovlymgr filename

   tells slink to use the filename you specify as the overlay manager

   instead of the default filename, ovs .o, which is contained in the

   libraries. The file you specify should consist of a single code hunk

   named NTRYHUNK and define the global symbol _ ovlyMgr.

 

prelink

   tells slink to produce an object module with symbol references and

   definitions still intact. You can then link with this object module to

   produce an executable module. This option is useful if you are

   developing a large application and changing only a single source

   module. Do not specify this option if you are using overlays.

 

plain

   turns off the fancy option. This option tells the linker not to enter

   control characters for highlighting and bold in the map file. This

   option is ignored if you do not specify the map option.

 

pwidth n

   specifies the width of program unit name field in the map file. The

   default value is 8. This option is ignored if you do not specify the map

   option.


 

126 Chapter 8

 

 

 

 

quiet

  suppresses all linker messages except error messages.

 

root object-filename(s)

  specifies the object files that are the primary input to the linker. These

  object files are always copied to the root of the object module. You

  must specify at least one object file for the root. If the primary input

  files appear as the first option to slink, then the root keyword is

  optional and may be omitted. The from option is a synonym for

  root. You can specify the root option more than once. The files you

  specify with root are added to the list of files to be linked.

 

swidth n

  specifies the width of the symbol names field in the map file. Default

  value is 8. This option is ignored if you do not specify the map option.

 

smallcode

  tells the linker to merge all code hunks. You can abbreviate this

  option as sc.

 

smalldata

  tells the linker to merge all data and bss sections. Merging hunks

  may decrease the time required to load your program, but may

  produce larger hunks that are difficult to scatter load. You can

  abbreviate this option as sd. The smalldata option does not merge

  chip data with non-chip data. To merge chip data also, specify the

  onedata option instead.

 

stripdebug

  suppresses any H_DEBUG and H_SYMBOL debug information in the

  final executable file.

 

to filename

  specifies the name of the final executable module. If you do not specify

  a to filename, the linker uses the filename of the second object

  module listed with the from option but drops any file extension. The

  first module is assumed to be startup code.

 

verbose

  prints the names of each file as the file is processed.

 

verify filename

  specifies a file to which you want the linker to write all messages. If

  you do not specify the verify option, the linker writes all messages

  to stdout. You can abbreviate this option as ver.

 

width n

  sets the maximum line length for the map and cross reference listing

  files. The default value is 80. This option is ignored if you do not

  specify the map option.


 

                                        Specifying Linker Options 127

 

 

 

 

with filename

    specifies a file containing slink options. The linker processes the

    contents of with files as if you had specified the option in the slink

    command. You can specify the with option as many times as

    necessary. Also, you can enter with options in a with file.

     The following is an example with file.

 

 

      from lib:c.o vtl00.o init.o window.o xmodem.o remote.o

         kermit.o script.o

         library lib:sc.lib lib:amiga.lib

         verbose

         smallcode

         smalldata

         to vtl00

 

 

     Note: Do not confuse this option with the with compiler option.

 

xref filename

   specifies a file to which you want the linker to write cross reference

   information. If you do not specify xref, but you specify the map

   option, the linker writes the cross reference information in the map

   file.

     Note: Do not confuse this option with the xref compiler option.

 

 

Using Overlays

 

Overlays are intended primarily for large applications (l00k or more)

that must run in a small amount of memory and leave more room for

data. Overlays are groups of functions (and the data they require) that

reside in memory only while in use. When the group in memory is no

longer needed, the overlay manager reclaims the memory used by this

group and loads in the next group of functions (and data).

Before deciding to use overlays, consider using multiple shared

libraries instead. If memory is tight, the AmigaDOS system removes

unused shared libraries, thereby giving you some of the benefits of

overlays. On systems with more memory, the AmigaDOS system allows

shared libraries to remain resident, which improves performance. Use

overlays only in very tight memory situations.

The overlays are organized into an overlay tree. The overlay tree

consists of a root node, which is always resident in memory, and one or

more overlays. Figure 8.1 shows an example overlay tree.


 

128 Chapter 8

 

 

 

        Figure 8.1               root

An Example Overlay         .-------|---------------.

              Tree         |                       |

                         overlay1              overlay2

                                                   |

                                       .-----------|-----------.

                                       |                       |

                                    overlay3              overlay4

                                       |

                                    overlay5

 

 

 

                   Overlays at the same level in the tree are mutually exclusive. In this

                   example tree, the functions in overlays 1 and 2 are mutually exclusive,

                   and the functions in overlays 3 and 4 are mutually exclusive. If any

                   function in overlay 1 is running, overlay 2 cannot be loaded. However, if

                   your program calls a function that is in overlay 2, the overlay manager

                   reclaims the memory occupied by overlay 1 and loads overlay 2. Then, if

                   your program calls a function in overlay 3, the overlay manager loads

                   overlay 3. If overlay 3 is loaded, overlay 5 can be loaded if necessary,

                   but overlay 4 cannot be loaded.

                     A function in an overlay can call functions in only certain other

                   overlays. For example, a function in overlay 3 can call a function in

                   overlays 5 and 2 and in the root node. The following list shows which

                   functions the functions in each overlay of the example tree can call.

 

 

 

                       Functions

                       in.........Can call functions in

                       root       can call functions in overlays 1 and 2

                       1          can call functions in the root node

                       2          can call functions in the root node and overlays 3 and 4

                       3          can call functions in the root node and overlays 2 and 5

                       4          can call functions in the root node and overlay 2

                       5          can call functions in the root node and overlays 2 and 3.

 

 

 

 

                     As you can see, applications best suited to overlays are those that are

                   modular and have a definite calling hierarchy among the functions.

                     You must determine which functions should be in each overlay. Decide

                   which functions can operate independently of others. The root node must


 

                             Compiling and Linking Your Program 129

 

 

 

 

contain your main program and should contain any functions that are

called frequently or by many other functions in the program. The root

node usually contains the libraries also. In general, the more frequently

you call a function, the closer it should be to the root node.

  You can have up to 50 overlays. Your tree could have all overlays

hanging from the root node, or your tree could be organized as one long

chain of overlays. Organize the overlays of your tree efflciently; that is,

according to the calling hierarchy of your program. If you create an

inefficient tree, your program may not run efficiently because the overlays

will have to be swapped more often. If you create an incorrect tree,

slink issues a warning message.

  To use overlays, you should enter the overlay option and the overlay

filenames in a with file, as follows:

 

overlay

overlay-1-filenames

*overlay-2-filenames

 

 

 

 

 

 

 

List the filenames for each overlay on a separate line, and separate the

filenames with plus ( + ) signs. If you cannot fit all of the filenames on one

line, end the line with a plus sign, and enter the remaining filenames on

the next line. Indicate the depth in the tree of the overlay by entering the

appropriate number of asterisks at the beginning of the line. The overlays

immediately beneath the root node are at depth 1, but you should not list

them with asterisks. For overlays at depth 2, begin the line(s) with one

asterisk; for overlays at depth 3, begin the line(s) with two asterisks, and

so on. Enter an overlay immediately after the overlay to which it is

subordinate. Terminate the overlay tree with a line consisting of a single

pound (#) sign.

  For example, Figure 8.2 shows the same overlay tree as in Figure 8.1,

but figure 8.2 shows which object files comprise each overlay.


 

130 Chapter 8

 

 

 

          Figure 8.2  root node  __________

Example Overlay Tree             |        |

      with Filenames             |  main  |

                                 \________/

                                     |

                               _____/\______

                              /             \

                        _____|____       ____|_____

           overlay1     |        |       |        |    overlay2

                        |beech.o |       | ash.o  |

                        |maple.o |       \________/

                        \________/           |

                               _____________/\____

                              /                   \

                      _______|____         ________|_________

             overlay3 |          |         |                |  overlay4

                      |  fir.o   |         |    sweetgum.o  |

                      |  pine.o  |         |     pecan.o    |

                      \__________/          \______________/

                      ______|_____

             overlay5 |          |

                      |  birch.o |

                      \__________/

 

 

 

 

                   The with file for the example in Figure 8.2 looks like this:

                  

                          overlay

                          beech.o+maple.o

                          ash.o

                          *fir.o+pine.o

                          **birch.o

                          *sweetgum.o+pecan.o

                          #

 

 

                         Suppose you have three files: hw.c, hello.c, and world.c. The file

                       hw.c contains the following functions:

 

 

                          #include <stdio.h>

                          int main(void)

                          {

 

                             Hello(void);

                             World(void);

                             return(O);

                          }


       

                      Compiling and Linking Your Program 131

 

 

 

 

   void SayWord ( s )

       char *s;

   {

       printf ("%s", s);

   }

 

 

The file hello.c contains only one function:

 

 

   void Hello ( void )

 

   {

       SayWord("\nHello, " );

   }

 

 

world.c also contains only one function:

 

 

    void World ( void )

 

    {

       SayWord("World! \n");

    }

 

 

After you compiled these three files, you have the three object files hw.o,

hello.o, and world.o. To link this application, you can create a with

file that contains all of the link options you need, including overlay

specifications.

 

 

   from lib:c.o hw.o

   overlay

   hello . o

   world . o

   #

   library lib:sc.lib lib:amiga.lib

   map fhlosx

   to hw

 

 

slink evaluates the with file, creates an executable module named hw,

and creates a map file named hw.map. The executable module consists of

a root node and two overlays. The root node contains all of the code and

data for c.o, hw.o, sc.lib, and amiga.lib. One overlay contains

the code and data for hello.o, and the other overlay contains the code

and data for world.o. Figure 8.3 shows the overlay tree for this

application.


 

132 Chapter 8

 

 

 

         Figure 8.3                   ____________

Overlay Tree for hw                  |    c.o     |

                                     |    hw.o    |

                                     |   sc.lib   |

                                     | amiga.lib  |

                                      \__________/

                                   ________|___________

                             _____|____          ______|____

                            | hello.c  |        |   world.c |

                            |__________|        |___________|

 

 

 

 

                      You can run this application in the same way you run an application

                    that does not use overlays. The overlay manager loads overlays as

                    necessary.

 

 

      Specifying    Using overlays modifies the behavior of some compiler options. The

Compiler Options    following list describes each of the options affected by overlays.

   with Overlays

                    data=near

                      places all data not declared with __ far or __ chip in the near

                      data section. If you are using overlays, the near data segments of all

                      files compiled with data=near are moved to the root node.

                      Therefore, you cannot statically initialize near data items into code

                      hunks that are not in the root node. For example, you cannot initialize

                      a character pointer to a constant string in an overlay node if you

                      specify the stringmerge option.

 

                    smallcode

                       merges all code hunks into a single hunk. If you are using overlays

                       and you specify smallcode, slink merges as much of the code as

                       possible without crossing overlay boundaries. The linker does not

                       move code out of the overlay in which it was defined.

 

                    smalldata

                       merges all data and bss hunks into a single hunk. The near data

                       section is always placed in the root node. However, sl i nk does not

                       merge hunks that are in overlays that are not named __MERGED into

                       the near data section.

 

                    stringmerge

                       places string constants into the code section, and the strings

                       themselves are overlaid if the module they are used in is overlaid.

                       Therefore, the value of the string constant may change as its overlay

                       node is swapped out. For example, a function may return a string


 

                                                    Compiling and Linking Your Program 133

 

 

 

 

                    constant or assign it to an external variable. It is recommended that

                    you do not compile with stringmerge if you are using overlays.

 

 

Customizing the   For some applications, you may want to replace the overlay manager with

Overlay Manager   a custom overlay manager. For example, you can write an overlay

                  manager to support function calls across mutually exclusive overlays. This

                  section describes the necessary attributes of an overlay manager.

                    The overlay manager must contain one code hunk named NTRYHUNK

                  and define the global symbol _ ovlyMgr.

 

 

                         section    NTRYHUNK,code

                         xdef       ovlyMgr

 

 

                     First:

                         bra        FirstModule

 

 

                  ovlyMqr:

 

 

                       ;Overlay manager code goes here.

 

 

 

                  FirstModule:

                      lea      First(PC),a3  ; pointer to start of module

                      move.l   -4(a3),d7     ; BPTR to next seglist entry

                      asl.l    t4,d7         ; make into APTR

                      move.l   d7,a3

                      jmp      4(a3)         ; jump to code in next hunk

 

 

                    Assemble this code with the -u assembler option so that the assembler

                  adds the necessary underscores to all global symbols.

                    The linker makes NTRYHUNK the first hunk in the executable and does

                  not merge this hunk with any other hunks. Therefore, NTRYHUNK must

                  also contain a valid entry point to the program and properly transfer

                  control to the rest of the program. The first instruction in the preceding

                  code branches to the symbol FirstModule, where the seglist is

                  decoded, and a jump instruction transfers control to the next hunk in the

                  segment list.

                    For more information, examine the file ovs.a in the source

                  directory. This file contains the source to the default overlay manager.


 

134


 

                                                                                        135

 

 

 

 

 

               9 Running Your Program from

                 the Workbench Screen

 

 

                 135 Introductlon

                 135 Working with argc and argv

                         135 Running From the Shell

                         136 Running From the Workbench Screen

                 137 Managing the Standard I/O Window

                         137 Eliminating the Window

                         137 Changing the Window Attributes  

 

 

 

 

                  Introduction

 

                  If you run your program by double-clicking its icon from the Workbench

                  screen, your program runs under a different environment than programs

                  that are run from the Shell. Specifically:

 

                  [] If not handled correctly, the command line arguments argc and argv

                     receive different values that may cause unwary programs to crash.

                  [] If your program uses stdin, stdout, or stderr, the library routine

                     __main opens a console window to which your program writes

                     output and from which it reads input.

 

                  The following sections describe how to manage these unusual situations.

 

 

 

                  Working with argc and argv

 

                  Programs that run from the Workbench screen receive a different

                  environment than those run from the Shell. The following sections

                  describe the different environments.

 

Running From the  If you run your program from the Shell, your program receives two

           Shell  arguments, argc and argv. argc is an integer guaranteed to have a

                  value of at least 1. Unless you modify __main as described in

                  Chapter 10, "Using Startup Modules, Autoinitialization, and


 

136 Chapter 9

 

 

 

 

                  Autotermination Functions," argv is an array of 32 character pointers

                  that point to the different items on the command line:

 

                  argv[0]

                      is a pointer to the name of the command that was executed.

 

                  argv[1] to argv[nl

                      are pointers to the arguments entered after the command. The number

                      n represents the number of arguments specified. The maximum

                      number of arguments is 30.

 

                  argv[n+1] to argv[31]

                      are NULL.

 

 

Running From the  If you run your program from the Workbench screen, the startup code

       Workbench  sets up argv and argc in a different way than if your program is run

          Screen  from the Shell. argc is set to O (zero) to give you a quick way to check

                  in your program if you are running from the Workbench screen, and

                  argv is a pointer to a struct WBStartup instead of an array of

                  character pointers. The definition of struct WBStartup is in the

                  header file workbench/startup.h.

                    To eliminate any problems caused by running your program from the

                  Workbench environment, structure your program as follows:

 

 

                     int main(int argc, char *argv[1])

 

                     {

                       struct WBStartup *startup;

                       if(argc == O)

                       {

 

                           /* The program was started from the Workbench.         */

                           /* Use the WBStartup message instead of argc and argv. */

                          startup = (struct WBStartup *)argv;

                          ...

                        }

                        else

                        {

 

 

                          /* The program was started from the Shell. */

                          /* Use argc and argv as usual.             */

                          ...

                        }

                      }

 

 

 

                    For more information on main, refer to SAS/C Development System

                  Library Reference, Version 6.0.


 

                                           Running Your Program from the Workbench 137

 

 

 

 

                  Managing the Standard I/O Window

 

                  When you run a program from the Workbench screen, the compiler

                  opens a standard I/O window in which your program can read from and

                  write to stdin, stdout, and stderr. You can delete the window,

                  change its size, or add a title.

                  The window is opened by the library routine __main, which is

                  automatically run before your main routine if you link with a startup

                  module.

 

 

Eliminating the   If your application does not use stdin, stdout, or stderr, you can

         Window   use an alternate routine that does not open the window:

 

                  [] You can use the alternate routine __tinymain. If you link your

                     program using the link compiler option, specify the nostdio option

                     to delete the window. If you run the linker by specifying the slink

                     command, specify the define linker option as follows:

 

 

                       define ___main=___tinymain

 

 

                     Use this define option regardless of any other compiler options you

                     are using. This option works even if you are using registerized

                     parameters.

                     [] You can write your own routine.

                     You can copy main.c from the sc: source directory and modify it

                     for your application.

 

 

             >>  Caution Your program may crash.

                    If you attempt to use any function that refers to stdin, stdout, or

                    stderr in a program run from the Workbench screen after deleting the

                    standard I/O window, your program will crash. Such functions include

                    printf and scanf (but not fprintf or fscanf).

 

 

      Changing the  To keep the window but change its attributes you need to declare the

            Window  external variable __ stdiowin in your program. Normally, __main

        Attributes  gets the definition of __ stdiowin from the library with which you link

                    your program. However, if you declare __ stdiowin in your program,

                    __main uses the definition in your program.

                      This variable is declared in the SAS/C Libraries as follows:

 

 

                        char __stdiowin[]= "CON:10/10/320/80/";


 

138 Chapter 9

 

 

 

 

  This specification opens a console window starting at location (10,10)

that is 320 pixels wide and 80 pixels high. For more information on

console specifications, refer to The AmigaDOS Manual, 3rd Edition

(Commodore-Amiga, Inc. 1991).

  To change the window attributes, include a line similar to the previous

line in any C source file in your project. Declare this variable external to

any function, and be sure to statically initialize the variable. (Any changes

made to this external variable after your program starts do not affect the

window.) For example, to make the initial window 600 pixels wide and

100 pixels tall and add a window title of "My Window," you would enter

the following line:

 

 

     char __stdiowin[]= "CON:10/10/600/100/My Window";

 

 

  If you are running under AmigaDOS 2.0, __main appends the

contents of the array __stdiov37 to the __stdiowin variable before

opening the window. This array contains keywords that control other

aspects of the window and is defined in the SAS/C Libraries as follows:

 

 

   char __stdiov37[]= "/AUTO/CLOSE/WAIT";

 

 

These keywords do the following to your startup window:

 

     /AUTO  indicates that you do not want the window to open unless

            output is written to or input is read from the window.

 

    /CLOSE  adds a Close gadget to the window.

 

     /WAIT  specifies that you do not want the window to close until the

            user clicks on the Close gadget or presses Ctrl-\ (End-of-File).

 

  For more information on CON: keywords, refer to The AmigaDOS

Manual, 3rd Edition (Commodore-Amiga, Inc. 1991).

  To change these keywords or add additional AmigaDOS 2.0 keywords,

include a line similar to the previous line in any C source file in your

project. Declare this variable external to any function, and be sure to

statically initialize the variable. (Any changes made to this external

variable after your program starts do not affect the window.) The

keywords you specify are appended to __stdiowin only if your

program is running under AmigaDOS 2.0. If your program is run under

earlier versions of the AmigaDOS operating system, you get a normal

console window.

  Note: You must declare _ _ stdiowin and _ _ stdiov37 as external

variables exactly as shown. Do not declare them as follows:

  char *__stdiowin = "specification"; /* WRONG! */


 

                                                                              139

 

 

 

 

 

     10 Using Startup Modules,

        Autoinitialization, and

        Autotermination Functions

 

 

        139 Introduction

        140 Understanding Startup Modules

        140 Modifying__main

        141 Linking with a Startup Module

                142 Creating Standard Programs

                142 Creating Detachable (Load and Stay Resident) Programs

                143 Creating Residentable Programs

                144 Creating Shared Libraries

        145 Writing Applications without a Startup Module

        145 Using Autoinitialization and Autotermination Functions

        147 Initializing System Library Bases

 

 

 

 

        Introduction

 

        This chapter describes how to use startup modules, autoinitialization

        functions, and autotermination functions. Specifically, it describes the

        following:

 

        [] the function of a startup module

        [] how to link your program with a startup module

        [] how to use the startup modules distributed with the SAS/C

           Development System

        [] how to write a program that does not use a startup module

        [] how to specify autoinitialization and autotermination functions.


 

140 Chapter 10

 

 

 

 

Understanding Startup Modules

 

A startup module initializes the environment in which your program runs

and performs certain cleanup tasks after your program has finished

running. The SAS/C Development System provides six startup modules:

 

         c.o  is for use with standard programs.

      cres.o  is for use with residentable programs.

     cback.o  is for use with detachable programs.

     catch.o  is for use when you are debugging standard programs.

  catchres.o  is for use when you are debugging residentable

              programs.

 

The specific things that the startup module does depends on the startup

module with which you link your program and on whether you run your

program from the Shell or the Workbench screen. However, all startup

modules perform some of the same tasks. For example, each startup

module does the following:

 

[] initializes the near BSS section.

[] gets startup information from the Workbench screen (if invoked from

   the Workbench screen).

[] initializes DOSBase and SysBase.

[] marks the bottom of the stack.

[] calls __fpinit, which looks for autoinitialization functions.

[] calls __main, which calls your program. If your program requires

   more than 30 command line arguments, you need to modify the default

   __main function as described under "Modifying __main."

   calls __fpterm, which also looks for autotermination functions.

 

 

 

Modifying __main

 

The default __main function must convert the incoming command line

to the (argc, argv) format required by the ANSI Standard. __main

performs this conversion by using a local array with 32 elements to

represent argv. One element is used for the program name, and the

ANSI Standard requires at least one NULL element at the end. Therefore,

you are limited to 30 arguments on the command line of your program.

If you need more arguments on the command line, you have two choices:

 

[] If you only want to raise the argument limit, copy

   sc: source/ _main.c to your project directory. Change the

   #define statement for the symbol MAXARG to the new maximum

   number of arguments. Then, recompile _main.c and link it into your

   program.


 

                                          Using Startup Modules 141

 

 

 

 

[] If you need an unlimited number of arguments, copy

   sc:source/_main.c to your project directory. Modify the source

   code to allocate an array of pointers to use for argv. Make sure you

   use the malloc or calloc function to allocate the memory. These

   functions will free the memory correctly when your program exits.

 

 

 

Linking with a Startup Module

 

To use a startup module, you must link your program with it. You can

link your program by using the link option on the sc command or by

entering the slink command.

You can specify the link and, if necessary, the startup option on

the sc command line. If you specify only the link option, sc tells the

linker to link your program with c.o. If you want to link with another

startup module, specify the module name with the startup option. If

the module name that you specify does not contain a colon (:), forward

slash (/), or period (.), sc adds the LIB: prefix and .o extension to the

filename that you specify. For example, to link with cres.o, you can

enter the sc command as follows:

 

sc startup=cres link   C-source-file

 

 

  To specify a startup module with the slink command, enter the

slink command in the following format:

 

 

slink startup-module+obj-module to executable

lib library-files

 

 

  To use some startup modules, you need to declare certain variables in

your program. The following sections describe how to use startup

modules for the type of program you want to run.

  Programs linked with any startup module except cback.o run under

the process in which they were invoked. When you enter the name of an

executable module at the Shell prompt, that program runs in that Shell's

process and uses the Shell's process number and stack (unless you specify

a value for __stack and the Shell's stack is smaller than the specified

value). Therefore, you cannot enter commands into or close the Shell

from which the program was invoked until the program finishes running.

Note: Even if you use the run command to run the program, you

cannot close the window from which the program is run unless you

redirect the input and output as in the following example:

run >nil: <nil: program-name


 

142 Chapter 10

 

 

 

 

         Creating  For most of your programs, you can use the default startup module, c . o.

         Standard  If you are debugging a standard program, you can use the catch . o

         Programs  startup module to capture information if your program terminates

                   abnormally. If you link with catch . o and your program terminates

                   abnormally, catch . o asks you if you want to create a snapshot file. A

                   snapshot file contains traceback information for your program such as

                   register values, symbol cross references, and stack information.

 

 

          >> Caution  Creating this snapshot file may corrupt your hard drive.

                     Do not ship commercial products linked with catch.o.

 

 

                        You can use the tb utility to process this snapshot file and display the

                      traceback information. For more information about processing snapshot

                      files, refer to the description of the tb utility in SAS/C Development

                      System User's Guide, Volume 2: Debugger, Utilities, Assembler,

                      Version 6.0.

 

 

        Creating   A detachable program is a program that runs in the background. It does

Detachable (Load   not run as part of the originating Shell's process. You can continue to

        and Stay   enter commands into, or even close, the Shell from which the program

       Resident)   was started without affecting the program.

       Programs      You can use the startup module cback.o to create detachable

                   programs. When you link with cback.o, your program allocates a new

                   stack and launches itself as a new process. For an example of a program

                   that links with cback.o, see the directory sc:examples/cback.

                     You should use cback.o for any program that:

 

                      [] does not send output to the Shell from which it was invoked (except an

                         initial banner)

                      [] needs to be memory resident.

 

                        To use cback.o, you add the following external definitions to your

                      main program if your program requires values other than the defaults:

 

                      long __stack = amount;

                         allocates stack space for the created task. Many detachable programs

                         only need a stack size of 4000 bytes (the default). However, you can

                         change this figure to suit your application.

 

                      char *__procname ="program-name";

                         specifies the name of the process to be created. The default value is

                         Background_Process.

 

                      long __priority = priority;

                         sets the priority of the process to be created. For most programs, you

                         should set the task priority to 0, which is the default. However, you

                         can change this figure to suit your application.


 

                                                            Using Startup Modules 143

 

 

 

 

                 long __BackGroundIO = value;

                    indicates whether output will be sent to the Shell from which the

                    program was invoked. The default value is 0, which tells cback.o

                    that no output is sent to the originating Shell. Setting this value to 1

                    tells cback.o to set _ Backstdout to point to the Shell.

 

                 extern BPTR _Backstdout;

                    contains the file handle of the originating Shell (if __ BackGroundIO

                    was set to 1).

 

                   _ Backstdout is an AmigaDOS file handle and, therefore, you must

                 use the AmigaDOS function Write instead of the SAS/C functions such

                 as write or fprintf to write to this file.

                 You must close this file with the AmigaDOS Close function when you

                 have finished writing to the Shell window. If you do not close

                 _ Backstdout, the originating Shell cannot close.

                   If your program creates a resident task that needs to print messages in

                 the Shell, your program should pass _ Backstdout to this task.

                   If the _ Backstdout file handle is NULL, your program cannot send

                 output to the window. The handle may be NULL if the program was

                 invoked from the Workbench screen or from another program that did

                 not have a Shell open.

                   If you want to make sure that only one copy of your program is

                 running in the background, have your program create a global message

                 port with an unique name. Subsequent invocations of your program

                 should use the exec function FindPort to see if the port exists and, if

                 the port exists, pass any commands to the running program through the

                 message port and exit immediately. See the directory

                 sc:examples/cback for sample code.

                 Programs linked with cback.o cannot be made resident with the

                 AmigaDOS resident command.

 

 

    Creating     A resident program is a program that remains loaded in RAM. You do not

Residentable     have to reload a resident program each time you want to run it.

    Programs     To create a resident program, follow these rules:

 

                 [] Compile with the data=near option (the default).

                 [] Make sure that all external data declared with the __far or __chip

                    keywords are read-only.

                 [] Use #pragma statements instead of the linker stubs in amiga . lib

                    when possible because amiga.lib uses absolute addressing. If

                    required, you can link with amiga . lib if the linker does not generate

                    any warnings about references to absolute data.

                 [] Link your program with cres.o instead of c.o.

                 [] Use the AmigaDOS resident command to add the program to the

                    resident list maintained by the Shell.


 

144 Chapter 10

 

 

 

 

 

                        A resident program must be re entrant and re-executable, and it cannot

                      write to far data. For each invocation of a resident program, cres.o

                      copies the near data section, so the program can read and write to near

                      data. If you link your program with cres.o and your program refers to

                      f ar or chip data, the linker issues warnings. If your program reads this

                      data only, you can ignore the warnings.

                        You cannot use the __saveds keyword or compile with the saveds

                      option if you link with cres.o.

                        Each time the program is run, a new near data segment is created,

                      initialized data are copied into the new segment, and relocations are

                      performed inside the segment. When the program finishes, the segment is

                      released.

                        slink creates the following symbols when you link your program:

 

                        _LinkerDB  points to the near data section.

 

                          RESBASE  specifies the offset of _ LinkerDB in the near data

                                   section (0 or 0x8000).

 

                           RESLEN  specifies the total number of bytes of initialized and BSS

                                   data.

 

                         NEWDATAL  specifies the number of longwords of initialized data.

 

                        For more information about resident programs, refer to the description

                      of the AmigaDOS resident command in Using the System Software

                      (Commodore-Amiga, Inc. 1990) or see the example in

                      sc:examples/cres.

                        If you are debugging a residentable program, you can use the

                      catchres.o startup module to capture information if your program

                      terminates abnormally. If you link with catchres.o and your program

                      terminates abnormally, catchres.o asks you if you want to create a

                      snapshot file. A snapshot file contains traceback information for your

                      program such as register values, symbol cross references, and stack

                      information.

 

 

           >> Caution Creating this snapshot file may corrupt your hard drive.

                     Do not ship commercial products linked with catchres.o.

 

 

                        You can use the tb utility to process this snapshot file and display the

                      traceback information. For more information about processing snapshot

                      files, refer to the description of the tb utility in SAS/C Development

                      System User's Guide, Volume 2.

 

   Creating Shared   You can use the modules libent.o, libinit.o, and libinitr.o to

         Libraries   create shared libraries. For information on creating shared libraries,

                     refer to SAS/C Development System Library Reference, Version 6.0.


 

                                          Using Startup Modules 145

 

 

 

 

Writing Applications without a Startup

Module

 

If you do not want to link your program with a startup module, follow

these guidelines when writing and compiling your program:

 

[] Your program must initialize DOSBase and SysBase, if your

   program makes any calls to dos.library and exec.library,

   respectively. For additional information, see "Initializing System

   Library Bases," later in this chapter.

[] Do not use any SAS/C I/O functions such as fopen, read, printf,

   and so on.

[] Add the _ _ saveds keyword to the first function in the first object

   module in your program.

[] Compile your program with the nostackcheck option.

[] Be aware that the uninitialized near data are not initialized to 0.

[] Register A0 points to the command line entered by the user. You can

   parse the arguments from A0 or, under AmigaDOS 2.0, call

   ReadArgs to get the arguments.

[] Your program will start executing at the first function in the first

   module specified on your slink or sc command line. This function

   should be declared with the _ _ saveds keyword.

[] Unless you write code to reply to the Workbench startup message, your

   program will not run from the Workbench screen without crashing the

   machine.

 

   For an example, see sc:examples/nostartup.

 

 

 

Using Autoinitialization and Autotermination

Functions

 

If you link with one of the startup modules provided by the SAS/C

Development System, you can designate functions to be called before your

program starts (autoinitialization functions) and after it terminates

(autotermination functions).

To designate an autoinitialization function, begin the function name

with _ STI. To designate an autotermination function, begin the function

name with _ STD. The linker searches the functions defined in your

program for functions whose names start with the _ STI or _ STD. All

functions starting with _ STI are assumed to be autoinitialization

functions and are called from the startup code before _ _ main is called.

All functions starting with _ STD are assumed to be autotermination

functions and are called after your program exits.


 

146 Chapter 10

 

 

 

 

  Autoinitialization and autotermination functions take no parameters and

return no values, as shown in the following example:

     void _STImyinit(void)

 

     {

       .

       /* your code here */

       .

     }

 

     void _STDmyterm(void)

     {

        .

        /* your code here */

        .

     }

 

 

  If the linker finds at least one autoinitialization function, it creates an

array of function pointers containing one pointer for each

autoinitialization function. The array is named _ _ ctors (for

"constructors"), and its last entry is always NULL. The __ fpinit

function looks through this array and calls each autoinitialization function

before calling _ _ main.

  Similarly, if the linker finds at least one autotermination function, it

creates an array of function pointers called__ dtors (for "destructors")

containing one pointer for each autotermination function. The array's last

entry is always NULL. The _ _ fpterm function looks through this array

and calls each autotermination function after your program exits.

  The following figure shows the order in which modules are called when

you run your program.


 

                                                            Using Startup Modules 147

 

 

 

       Figure 10.1      Startup module

  Startup Modules,   ____________________

Autoinitialization  |                    |    __________________________________________

    Functions, and  |  Call __fpinit ----|-->| Set up for floating-point operations     |

   Autotermination  |                    |   | Call the funtion in __ctors        |

         Functions  |                    |   |__________________________________________|

                    |                    |    __________________________________________

                    |  Call __main ------|-->| Initialize file I/O                |

                    |                    |   | Call main (your program)                 |

                    |                    |   | Cleanup file I/O                   |

                    |                    |   |__________________________________________|

                    |                    |    __________________________________________

                    |  Call __fpterm ----|-->| Cleanup from floating point operations   |

                    |                    |   | Call the functions in __dtors      |

                    |                    |   |__________________________________________|

                    |                    |    __________________________________________

                    | Call _MemCleanup --|-->| Free heap memory                   |

                    |____________________|   |__________________________________________|

 

 

 

 

                   If slink does not find any autoinitialization or autotermination

                 functions, it substitutes a longword zero for any references to __ctors

                 or __dtors. If you write your own startup module, check that

                 __ctors and __dtors are not NULL before accessing the array.

                   Do not use level 1 or 2 I/O functions (such as fopen and open) in

                 your autoinitialization functions because they have not yet been

                 initialized. However, you can use AmigaDOS I/O functions (such as

                 Open). Similarly, you cannot use level 1 and 2 I/O functions in your

                 autotermination functions because all level 1 and 2 files have already

                 been closed.

                   You can use the ANSI standard memory allocation routines (such as

                 malloc, free, and calloc) in autoinitialization and autotermination

                 functions. All memory allocated with these routines and not yet freed in

                 your program is still valid in your autotermination functions.

 

 

 

                 Initializing System Library Bases

 

                 If you declare but do not define a system library base in your own code,

                 the library base is automatically initialized. The autoinitialization code

                 calls OpenLibrary to initialize the library base, and the


 

148 Chapter 10

 

 

 

 

                   autotermination code calls CloseLibrary to close the library. In the

                   following example, IntuitionBase is automatically initialized.

                  

                     #include <proto/intuition.h>

 

 

 

 

                            /* The following line declares Intuition8ase but does  */

                            /* not define it.  This line is not required, because  */

                            /* proto/intuition.h also declares IntuitionBase. In   */

                            /* this program, IntuitionBase is automatically        */

                            /* initialized.                                        */

 

 

                      extern struct IntuitionBase *IntuitionBase;

 

 

                      int main(void)

 

                      {

                            struct Window *w;

 

 

                            w = OpenWindow(...);

                             ...

                       }

 

 

                     The following table lists the system libraries whose bases are

                   automatically initialized by the autoinitialization code.

 

 

 

       Table 10.1

Library Bases for   Name                                   Base

   .library Files   asl.library (2.0)                      AslBase

                    commodities.library (2.0)              CxBase

                    diskfont.library                       DiskfontBase

                    expansion.library                      ExpansionBase

                    gadtools.library (2.0)                 GadToolsBase

                    graphics.library                       GfxBase

                    icon.library                           IconBase

                    iffparse.library                       IFFParseBase

                    intuition.library                      IntuitionBase

 

                                                                                ( continued)


 

                                                      Using Startup Modules 149

 

 

 

Table 10.1

(continued)    Name                          Base

               keymap.library                KeymapBase

               layers.library                LayersBase

               mathffp.library               MathBase

               mathieeedoubbas.library       MathIeeeDoubBasBase

               mathieeedoubtrans.library     MathIeeeDoubTransBase

               mathieeesingbas.library       MathIeeeSingBasBase

               mathieeesingtrans.library     MathIeeeSingTransBase

               mathtrans.library             MathTransBase

               translator.library            TranslatorBase

               utility.library               UtilityBase

               workbench.library             WorkbenchBase

 

                                                                               .

 

 

 

              Note: DOSBase and SysBase are initialized by the startup code

            even if you define them.

              As stated before, a system library base is not initialized if you define

            the library base in your code (except DOSBase and SysBase). For

            example, the following code defines the library base and, therefore, the

            base is not automatically initialized.

 

 

              #include <proto/intuition.h>

 

 

              /* The following line defines IntuitionBase, so */

              /* it is not automatically initialized.         */

 

 

              struct IntuitionBase *Intuition8ase;


 

150 Chapter 10

 

 

 

 

   int main(void)

   {

      struct Window *w;

      w = OpenWindow( . . . ); /* Crash! IntuitionBase in NULL */

       ...

   }

 

 

 

  For more information on defining library bases, refer to SAS/C

Development System Library Reference.

  The autoinitialization functions pass the value of the external long

integer _ _ OSlibversion to OpenLibrary. If your program runs

only under a specific version of the operating system, declare this

variable in your code and initialize it as necessary. For example, if your

program requires the AmigaDOS operating system, Version 2.0 (which is

library revision 37), you can enter the following line in your program

external to any function:

 

 

                 long_ _ OSlibversion = 37;

 

 

The following table lists the library revision numbers for each version of

the operating system.

 

 

 

                       OS      Library

                       Version Revision

                       1.2   33

                       1.3      34

                       2.0      36 (Preliminary 2.0)

                       2.04     37

 

 

 

 

  If the autoinitialized libraries cannot be opened, the library function

__autoopenfail is called. The version of __autoopenfail in the

libraries prints a message indicating which library could not be opened

and then terminates your program. You can replace this function by

declaring it in your code as follows:

 

 

            void __autoopenfail(char *lib)

            {


 

                                         Using Startup Modules 151

 

 

 

 

      /* your code here */

   }

 

 

The lib parameter is the name of the library that failed to open. If you

want your program to terminate after the call to __autoopenfail, the

last action of __autoopenfail should be to call _XCEXIT. If

__autoopenfail returns without calling _XCEXIT, the startup

proceeds normally.

  The source code to the default __autoopenfail function is in

sc:source/autoopenfail.c. As an additional example,

sc:source/intuitlib.c contains the autoinitialization and

autotermination code for intuition. library.


 

152


                                                                              153

 

 

           11 Using Amiga Specific

              Features of the SAS/C

              Language

 

 

              153 Introduction

              154 Using Special Keywords

                      155 Using__aligned

                      156 Using__chip, __far, and__near

                      157 Using __interrupt

                      157 Using __asm, __regargs, And __stdargs

                      158 Using__saveds

                      159 Using__inline

              160 Managing Stack Space

              161 Using #pragma Statements

              163 Using Unnamed Unions

              164 Using Implicit Structure References

              164 Using Equivalent Structures

              166 Using Zero-Length Arrays

              167 Specifying the Size of Enumerated Types

              168 Using the sizeof and Comma Operators in Preprocessor Directives

              168 Using C++ Style and Nested Comments

              168 Using National Characters in Variable Names

              168 Using Common Model External Data

 

 

 

 

  Introduction

 

  This chapter describes features of the SAS/C Compiler that are not

  defined by the ANSI Standard. Specifically, the compiler allows you to do

  the following:

 

  [] use special keywords such as __ aligned and __ saveds

  [] use #pragma statements

  [] declare and refer to structure members in special ways

  [] change the size of enumerated types

  [] use the sizeof and comma (,) operators in #if directives

  [] use C+ + style and nested comments

  [] use national characters in variable names

  [] use the common model or the strict reference-definition model for

     external data.


 

154 Chapter 11

 

 

 

 

Using Special Keywords

The SAS/C Compiler allows the following keywords:

 

__aligned

  forces an item to be aligned on a four-byte (longword) boundary or

  forces the declared function to align its stack in the prolog.

 

__chip

  places the declared static or extern data into chip memory.

 

__far

  places the declared static or extern data into the far data section

  or forces calls to the declared function to be made with 32-bit

  references.

 

__near

  places the declared static or extern data into the near data

  section or forces calls to the declared function to be made with 16-bit

  references.

 

__interrupt

  indicates that a function may be called as an interrupt routine.

 

__asm

  allows you to specify which registers a function uses to receive

  parameters.

 

__regargs

  forces a function to receive parameters in registers.

 

__stdargs

  forces a function to receive parameters on the stack.

 

__saveds

  loads the global data register at the entry to the function. The method

  used depends on the compiler options you specify.

 

__inline

  indicates a function that can be inlined by the global optimizer.

 

__stackext

  indicates a function that should allocate a new stack if the old one is

  too small.

 

The following sections describe each of these keywords. The

__stackext keyword is described under "Managing Stack Space."

  When used on functions, these keywords must be specified in the

correct places, depending on whether the keyword affects the calling

function (the caller) or the function being called (the callee). The following

list summarizes these points.


 

                                    Using Amiga Specific Features of the SAS/C Language 155

 

 

 

 

                    [] Keywords that affect the function's definition (the callee) only may

                       appear on prototypes, but they are optional. These keywords generate

                       warnings if placed on function pointers or data items because they are

                       unnecessary, but the compiler still generates correct code. Keywords in

                       this category are __aligned, __interrupt, __saveds, and

                       __stackext.

                    [] Keywords that affect both the caller and the callee must appear both on

                       the function definition and its prototype. You are required to have a

                       prototype for the function and to add the keywords to the declaration

                       of any function pointers. If you do not do this, incorrect code is

                       generated to pass parameters. For example, if you assign a

                       __regargs function to a function pointer and compile with the

                       parms=stack option, parameters are passed to the __regargs

                       function on the stack instead of in registers. Keywords in this category

                       are __asm, __stdargs, and __regargs.

                    [] Keywords that affect only the calling function are required on function

                       prototypes only. The keywords are ignored if they appear on function

                       definitions or function pointers. Keywords in this category are

                       __near and __far.

 

                       Be careful when specifying a keyword on a function pointer. The

                     indirection operator (*) in a function definition resets all special

                     keywords. To declare a pointer to a function that, for example, takes its

                     arguments in registers, declare the pointer as follows:

 

 

                        void (* __regargs func)(int x, char *p);

 

 

                    If you declare the pointer as in the following example, the __ regargs

                    keyword is attached to the function pointer itself rather than the function

                    to which the pointer points:

 

 

                        void __regargs (*func)(int x, char *p);

 

 

Using __aligned     The __aligned keyword on a declaration forces the variable being

                    declared to be aligned on a four-byte data boundary relative to the start

                    of the data area in which it is being declared. For structure members, the

                    data area is the start of the structure. For automatic variables, the data

                    area is the beginning of the stack frame for the function in which they

                    are declared. For static and extern variables, the data area is the

                    base of the chip, near, or far data section, depending on the section in

                    which the variable is being allocated.


 

156 Chapter 11

 

 

 

 

                      The __aligned keyword is valid on both functions and data items.

                    For example, the following code declares the structure f ib and the

                    function func:

 

 

                         __aligned struct

                            FileInfoBlock fib;

 

                         int __aligned func(int x)

                         {

                            /* your code here */

                         }

 

 

                      The SAS/C Compiler normally makes sure that the stack is aligned at

                    the beginning of your program and remains aligned for the duration of

                    the program. However, if your code is called from code not compiled

                    with the SAS/C Compiler, you cannot be sure that the stack is correctly

                    aligned at the start of your program. In that case, the __aligned

                    keyword may not work for automatic variables. For example, your code

                    may be:

 

                    [] called from assembly-language code

                    [] an interrupt routine

                    [] a callback function

                    [] in a shared library.

 

                      To make sure that the stack is aligned at the beginning of a function,

                    declare the function itself with the __aligned keyword. This action

                    forces the code generated for the function to align the stack on entry.

                    However, the compiler devotes an address register to pointing to the old

                    stack, thereby reducing the number of address registers available for

                    register variables.

 

Using __chip,       The __near, __far, and __chip keywords on data items allow you

   __far, and       to specify the section in which you want the compiler to place the item.

       __near       On functions, the __near and __far keywords are required on the

                    function prototype only.

                      By default, the compiler puts all declared static or external data into

                    the near data section. Register A4 points to the start of this section. The

                    compiler generates 16-bit references relative to A4 for external or static

                    items in the near data section. These references generate less code than

                    full 32-bit references.

                      For all items in the far data section, the compiler generates 32-bit

                    references. When the system loader loads your program, it changes these

                    32-bit references to the actual address of the data item.


 

                                     Using Amiga Specific Features of the SAS/C Language 157

 

 

 

 

                     The compiler also generates 32-bit references to items placed in chip

                   memory. Chip memory is the lowest 512K to 2M of system memory,

                   depending on the version of the hardware that you are running. This

                   memory is the memory on your machine that is usable by the custom

                   graphics and sound chips to store bitmaps, sound samples, and so on.

                     You can use the data compiler option to change the default data

                   section for external and static data. You can also override the default for

                   individual data items by declaring the item with the __near, __far, or

                   __chip keyword, as in the following example:

 

 

                    __near char a[10];   /* Allocate a 10-byte array in the near sec*/

                    __far  char b[10];   /* Allocate a 10-byte array in the far sec */

                    __chip char c[10l;   /* Allocate a 10-byte array in the chip sec*/

 

 

                     For compatibility with previous releases, the compiler accepts the

                   near, far, and chip keywords without the leading underscores.

                   However, these forms of the keywords violate the ANSI Standard and are

                   not allowed if you specify the ansi compiler option.

                     On function declarations, the __chip keyword is meaningless.

                   However, functions declared with the __near keyword are always

                   called with a 16-bit relative branch even if you compile with the

                   code= far option. Functions declared with the __far keyword are

                   always called with a 32-bit branch even if you compile with the

                   code=near option. For example, the following function is called with a

                   32-bit branch:

 

 

                       __far int func(int x);

 

 

           Using  You can declare a function with the __interrupt keyword to indicate

    __ interrupt  that the function is called from an interrupt routine. Defining a function

                  with the __ interrupt keyword turns off the stack checking and

                  extension code for that function and sets condition codes on return. The

                  __interrupt keyword is required on function definitions and tolerated

                  on function prototypes. This keyword is meaningless on function pointers

                  and other data items.

 

 

  Using __asm,    Normally, C functions pass and receive parameters by placing them on

__regargs, And    the stack. To force a function to receive some or all parameters in

     __stdargs    registers, you can declare the function with the __asm or __regargs

                  keyword or compile the function with the parameters=register

                  option.

                    If you declare a function with the __asm keyword, you can specify the

                  registers in which the function receives each parameter. For more


 

158 Chapter 11

 

 

 

 

                information about the __asm keyword, refer to Chapter 11, "Using

                Assembly Language with the SAS/C Language," in SAS/C Development

                System User's Guide, Volume 2: Debugger, Utilities, Assembler,

                Version 6.0.

                  If you declare a function with the __regargs keyword or if you

                compile the function with parameters=register, the function

                receives some of its arguments in registers instead of on the stack.

                Specifically, the first two pointer arguments are in registers A0 and A1,

                and the first two integral arguments are in D0 and D1. If you compiled

                with the math=68881 option, the first two doubles are in registers

                FPO and FP1. All other arguments are passed on the stack.

                  The compiler identifies functions that expect arguments in registers to

                the linker by placing an at sign (@) in front of the function name. The at

                sign replaces the underscore that the compiler normally places at the

                beginning of function names.

                  If you compile your application using parameters=register but

                you want one or more functions to receive parameters on the stack,

                declare those functions with the __stdargs keyword. The __stdargs

                keyword forces a function to receive parameters on the stack.

                  If you write a function that has the same name as a library function,

                you need to add the __regargs keyword to your function or compile

                with the parms=both or parms=register option. For example, you

                may want to replace the SAS/C library function malloc with your own

                version of malloc. If you compile with the parms=stack option or

                define your version of malloc with the __stdargs keyword, then two

                versions of malloc are linked into your executable. If you use other

                SAS/C library functions that call malloc, these functions use the version

                of malloc in the SAS/C libraries. However, your functions that call

                malloc use your version of malloc. To make sure that all calls to

                malloc are using your version of malloc, define your version with

                __regargs or compile with the parms=both or parms=register

                option.

                  The __asm, __regargs, and __stdargs keywords are important

                on function definitions and prototypes, and function pointers.

 

 

Using __saveds  If you define a function with the __saveds keyword, the compiler

                generates extra code at the beginning of the function that loads the

                address of the near data section into register A4. Defining a function with

                the __saveds keyword is equivalent to compiling that function with the

                saveds compiler option.

                  Loading A4 with the address of the near data section is useful if the

                function in question is called from outside your program. For example,

                your function may be a callback function or may be a function in a

                shared library.


 

                                  Using Amiga Specific Features of the SAS/C Language 159

 

 

 

 

                   If you do not compile your function with the libcode option, register

                 A4 is initialized with the contents of the absolute symbol _LinkerDB, as

                 follows:

 

 

                     LEA   _LinkerDB,A4

 

 

                   If you compile your program with the libcode option, the linker

                 treats _LinkerDB as an offset relative to register A6 (the library base)

                 instead of an absolute symbol. Register A6 points to the library base at

                 all entry points to the library. In this case, the instruction generated to

                 load A4 is as follows:

 

 

                     LEA   _LinkerDB(A6),A4

 

 

                   _LinkerDB is initialized by the linker to point to the near data

                 section.

                   Programs that are residentable cannot refer to absolute symbols.

                 Therefore, you cannot use the __saveds keyword or saveds compiler

                 option if you intend to link your program with the cres.o or

                 catchres.o startup modules.

                   Defining your function with the __saveds keyword is equivalent to

                 calling the function geta4 as the first executable statement of your

                 function. geta4 is provided for compatibility with previous versions of

                 the SAS/C Compiler and with other Amiga compilers.

                   The __saveds keyword is important in function definitions and is

                 tolerated but not required in function prototypes. If you include the

                 __saveds keyword on the prototype for a function, an error message is

                 issued if the keyword is missing from the function definition. This

                 keyword is meaningless on function pointers and other data items.

             

Using __inline   If you define a function with the __inline keyword, the global

                 optimizer generates code for the specified function at the point the

                 function is called, instead of generating an actual call to the function.

                 Using the __inline keyword can increase code size, but it can make

                 your code run faster. It also allows the global optimizer to perform more

                 optimizations. If you do not compile with the optimize option, the

                 __inline keyword is ignored, and code is generated to call the

                 function normally.

                   The __inline keyword is required on both function prototypes and

                 function definitions. This keyword is meaningless on function pointers.


 

160 Chapter 11

 

 

 

 

Managing Stack Space

 

The stack is a writeable memory area whose size is set by the AmigaDOS

stack command or by the external long integer __stack . The default

stack size is four kilobytes. This stack is used during function calls for

saving registers and passing arguments. Within a function, automatic

variables are allocated from the stack. For many C programs, a four-

kilobyte stack is adequate.

  If you compile your program with the stackcheck option (the

default) and your program overflows its assigned stack area, the stack

overflow routine __CXOVF is called. The __CXOVF routine provided

with the SAS/C libraries displays a requester and aborts the program.

However, you can replace the version of __CXOVF supplied by the

SAS/C libraries with your own version.

  If you do not want your program to abort because of a lack of stack

space, you can allocate additional stack space in one of four ways:

 

[] Increase the value of the external long integer __stack. __stack

   specifies the minimum stack size needed for your program to run. If

   the default stack is smaller than __stack, the startup code allocates a

   new stack of __stack bytes. If you do not compile with stackext,

   the stack space is allocated once by the startup code, so your program

   does not take longer to run. Changes made to __stack after your

   program starts take effect only if new stack extents are allocated

   because of code compiled with the __stackext keyword or the

   stackext compiler option.

[] Declare functions that require a large amount of stack space with the

   __stackext keyword. This keyword generates extra code at the start

   of the function. This extra code compares the amount of stack available

   with the amount specified in the external long integer __STKNEED.

   __STKNEED specifies the minimum amount of stack needed by each

   function in your program. If enough stack is not available, the function

   allocates a new stack extent whose size is specified in the external long

   integer __stack. If there is not enough memory to allocate the new

   stack, the stack overflow routine __CXOVF is called, just as if normal

   stack-checking code was active instead of the stack extension code.

   When the function returns, the old stack is restored and the extra

   stack is freed. Declaring a function with the __stackext keyword is

   equivalent to compiling the funcvion with the stackext compiler

   option.

[] Compile your program with the stackext option. Compiling with the

   stackext option is equivalent to defining all functions in your

   program with the __stackext keyword. If you have specific

   functions that use a lot of stack space or are recursive, you may want


 

               Using Amiga Specific Features of the SAS/C Language 161

 

 

 

 

   to define those functions with the __stackext keyword instead of

   compiling your entire program with the stackext option.

[] Increase the value of the external long integer __STKNEED and

   compile your program with the stackext option. You should never

   set __STKNEED to less than 400 bytes (which is the default value).

 

  Note: __stack specifies the total number of bytes needed during the

entire duration of your program. __STKNEED gives the minimum free

stack required by each function.

  Note: Using the stack extension feature adds overhead to each

function entry point and requires the use of an additional address

register. Therefore, your program will run slower.

  The __stackext keyword is important only on function definitions.

This keyword is meaningless on function pointers and tolerated on

function prototypes, but not required. If you include the __stackext

keyword on the prototype for a function, an error message is issued if the

keyword is missing from the function definition.

  Even if you compile your program with stackext, your program may

still run out of stack space if it calls a function not compiled with

stackext. If you call shared libraries or code compiled with other

languages, your program may run out of stack space. Also, the SAS/C

library routines are not compiled with stackext, but they use little

stack space. The stack extension code allows some extra space for the

library routines.

  In the same application, you can use functions compiled with

stackcheck, functions compiled with stackext, functions compiled

with neither option, and functions defined with the __stackext

keyword. If you compile a function with both stackext and

stackcheck, the compiler ignores the stackcheck option.

  For more information on the __ stack integer, refer to SAS/C

Development System Library Reference, Version 6.0.

 

 

Using #pragma Statements

The SAS/C Development System supports five types of #pragma

statements:

 

[] flibcall

[] libcall

[] syscall

[] tagcall

[] msg.

 

The libcall, syscall, and tagcall #pragma statements allow you

to call various library routines directly. These #pragma statements are


 

162 Chapter 11

 

 

 

 

described in SAS/C Development System Library Reference. The

flibcall #pragma statement also allows you to call various library

routines directly. The flibcall statement is similar to libcall,

except that each byte instead of each nibble is interpreted as a register.

#pragma flibcall allows you to use floating-point registers.

However, you can only pass 6 parameters instead of fourteen. Currently,

the AmigaDOS system libraries do not accept parameters in floating-point

registers. However, if you create your own libraries that accept

parameters in floating-point registers, you should use #pragma

flibcall.

  The SAS/C Compiler also supports #pragma msg statements.

#pragma msg statements allow you to specify whether a message should

be ignored, treated as an error, or treated as a warning message. For

example, if you know that your code produces a specified warning on a

certain line, you can use a #pragma msg statement to suppress the

warning on that line.

  Note: You cannot turn a message that is by default an error into a

warning.

  How a specific message is treated is referred to as its state. Using

#pragma msg statements, you can save the state of a message, change

its state, or restore a message's previous state.

  The msg statement can take one of the following forms:

 

#pragma msg num [error | warn | ignore] [push]

 

 

#pragma msg num pop

  where

     num   identifies the number of the message.

 

   error   indicates that the message should be treated as an error. You

           can abbreviate this keyword as err.

 

    warn   indicates that the message should be treated as a warning, if

           possible. You can abbreviate this keyword as wrn.

 

  ignore   indicates that the message should be ignored, if possible. You

           can abbreviate this keyword as ign.

 

    push   saves the message's state (before changing it). If you specify

           push, this keyword must appear after the error, warn, or

           ignore keyword.

 

     pop   restores the message's previous state.

 

With the push and pop keywords, you can turn a message on or off for

a specific line, series of lines, or header file, then restore the message to

the value the user specified on the command line.


 

               Using Amiga Specific Features of the SAS/C Language 163

 

 

 

 

  For example, the following code produces message number 85 because

it returns an int but no return value is specified. However, the code is

correct because the exit function never returns. The first #pragma

statement tells the compiler not to produce a warning on that line. The

second #pragma tells the compiler to generate a message for the

remaining functions in the file, if necessary.

 

  int func(void)

 

  {

    .

    .

    .

 

    exit(O);  /* Never returns */

  #pragma msg 85 ignore   /* Turn off warning 85 */

  }

  #pragma msg 85 warning  /* Turn on warning 85  */

 

  int func2(void)

  {

    .

    .

    .

  }  /* A warning here is VALID and is produced due to the */

     /* second #pragma statement above.                    */

 

 

 

Using Unnamed Unions

The SAS/C Compiler supports unnamed unions as structure members.

For example, you could define the following structure:

 

 

   struct FOO

   {

 

      union

      {

 

         int x;

         double d;

      };

 

      long l;

 

   } foo;

 

 

The union in this structure does not have a name. The union members

are treated as if they are members of the structure, except that the union


 

164 Chapter 11

 

 

 

 

members start at the same offset relative to the base of the structure. In

this example, you can refer to member x as foo.x.

 

 

 

Using Implicit Structure References

 

If you declare a substructure in your program, and the names of the

members in the substructure are unique, you can refer to the members

using only the structure name and member name. You do not need to

include the substructure name in the reference. For example, you could

declare the structure BAR and the substructure FOO as follows:

 

 

     struct FOO

     {

 

       int x;

       double d;

     };

 

 

     struct BAR

     {

 

       struct FOO foo;

       int l;

     } bar;

 

 

   You can refer to members x and d in the substructure as follows:

 

      bar.x = 10;

      bar.d = 10.0;

 

 

Referring to substructure members as shown generates warning message

193. If your program refers to substructure members in this way,

suppress warning 193 by compiling your program with the ignore 193

compiler option.

  If two or more substructures contain a member with the same name

and you do not specify the substructure name when you refer to the

member, the compiler generates error message 123. The compiler cannot

determine which substructure member you are trying to reference.

 

 

 

Using Equivalent Structures

 

If you compile your program with the StructureEquivalence

option, the compiler does not issue messages if a pointer to one structure

type is passed to a function when the function expects a pointer to a

different type, if the type passed is equivalent to the type expected.


 

               Using Amiga Specific Features of the SAS/C Language 165

 

 

 

 

  A structure is defined to be equivalent if it maps the same base data

types in the same order as the desired structure type. If one structure is

longer than another, but it is identical through the length of the shorter

one, then the longer structure is an acceptable substitute for the shorter,

but the shorter structure is not an acceptable substitute for the longer

structure. The function receiving the pointer may try to write to one of

the fields that does not exist in the shorter structure. Therefore, you can

pass an IntuiMessage structure to the exec function PutMsg without

getting a warning, but the compiler issues a warning if you assign the

result of a call to GetMsg to an IntuiMessage pointer.

  For example, you could define the following structures:

 

 

  struct FOO

  {

 

    int x;

    int y;

  };

 

  struct 8AR

  {

     int x, y, z;

  };

 

 

 

The structure BAR is equivalent to the structure FOO. If you specify

structureequivalence, the compiler does not issue a warning for

passing a pointer of type BAR to a function whose prototype specifies a

structure of type FOO. However, the structure FOO is not equivalent to

BAR because FOO is not long enough. If you tried to pass a pointer to a

structure of type FOO to a function whose prototype specified a pointer to

a structure of type BAR, you would get a compiler warning.

  BAR is also equivalent to FOO if you define them as follows:

 

 

      struct FOO

      {

        int x, y;

      };

 

      struct BAR

      {

        struct FOO foo;

        int z;

      };


 

166 Chapter 11

 

 

 

 

  Similarly, you can pass a struct IntuiMessage * to a function

that requires a struct Message *, since a struct Message is the

first element of a struct IntuiMessage. (struct IntuiMessage

is defined in the system header file intuition/intuition.h.) This

option also allows you to pass a pointer to an IOExtSer structure to a

routine that wants a pointer to an IoRequest structure, such as the

routine DoIO. IOExtSer is identical to IoRequest for the length of

the IoRequest structure.

  The following example is more complicated, but BAR is still equivalent

to FOO:

 

 

                     struct FOO

                     {

 

                       int x, y, z;

                     };

                     struct BAR

                     {

                       struct

                       {

                         int a;

                       } x;

                       struct

                       {

                         int b, c;

                       } y;

                       int z;

                     };

 

 

 

The structure type FOO defines memory as three consecutive integers.

BAR also defines memory as three consecutive integers, although it does

so through the use of two different substructures. The substructures are

not considered when determining equivalence.

 

 

 

Using Zero-Length Arrays

You can use zero-length arrays as the last element of a structure. For

example, you can declare structure FOO as follows:

 

 

                     struct FOO

                     {

                       long maxalloc;

                       long curalloc;


 

               Using Amiga Specific Features of the SAS/C Language 167

 

 

 

 

      long mem[0];

    };

 

 

This structure is 8 bytes in length as reported by sizeof. Using zero-

length arrays is most useful when you need to allocate variable-sized data

items. For example, if you need 100 elements in the above array at run-

time, you can do the following:

 

 

   struct FOO *foo;

   foo = malloc(sizeof(struct FOO) + lOO*sizeof(long));

   foo->mem[50] = 10;

   foo->mem[56] = .....

 

 

 

Specifying the Size of Enumerated Types

By default, enumerated types are integers and integers are 4 bytes long.

For example, each of the identifiers of type cats is 4 bytes long.

 

 

   enum cats [bombay, ocicat, somali];

 

 

If you compile this line with the shortintegers option, the identifiers

are 2 bytes long.

  The SAS/C Compiler also allows you to control the size of enumerated

types by declaring them with the char, short, or long keywords, as in

the following examples:

 

 

   char enum flintstones (Fred, Barney, Wilma];

   short enum colors (red, green, blue, black, white);

   long enum seasons (spring, summer, fall, winter);

 

 

The identifiers of type flintstones are 1 byte long; the colors are 2

bytes long, and the seasons are 4 bytes long. When you declare a

variable of a specific enum type, you must include the extra keyword on

the variable's declaration:

 

 

   char enum flintstones var1;


 

168 Chapter 11

 

 

 

 

Using the sizeof and Comma Operators in

Preprocessor Directives

 

The SAS/C Compiler allows you to use the sizeof and comma (,)

operators in preprocessor #if directives, as in the following example:

 

 

    #if (sizeof(int) == 2)

      #error short integers

    #endif

 

 

However, the ANSI Standard does not allow these operators in

preprocessor directives. Therefore, the compiler produces a warning

message if you compile with your program with the ansi or strict

option.

 

 

 

Using C++ Style and Nested Comments

 

In C++ programs, two consecutive slashes (//) define a comment block

that extends to the end of the current line. You can use two slashes to

designate comments in your SAS/C programs. However, if you compile

with the ansi or strict options, the compiler generates a warning

message for these comments.

  The ANSI Standard states that a C program cannot have nested

comments. Therefore, if you enter the comment start sequence (/*) inside

of a comment, the sequence is not recognized as the beginning of a

second, or nested, comment. The first comment end sequence (*/)

terminates comment mode. However, if you specify the commentnest

compiler option, as described in Chapter 8, "Compiling and Linking Your

Program," the compiler allows nested comments.

 

 

 

Using National Characters in Variable

Names

 

If you do not compile your program with the ansi option, you can use

accented characters in variable names.

 

 

 

Using Common Model External Data

 

The ANSI Standard does not define how external data should be handled.

Typical UNIX compilers allow you to declare external variables in

multiple places, as long as you do not initialize the variable in more


 

               Using Amiga Specific Features of the SAS/C Language 169

 

 

 

 

than one of those declarations. For example, you could define the

following variable in a header file:

    int i;

 

 

If this header file is included by all files in a project, each file defines a

variable i. The linker merges all these independent definitions into one,

creating a common model for external data.

  Most microcomputer compilers use what is called the strict reference-

definition model (or strict ref-def) for external data. This model requires

that one and only one source file in a project define the external variable.

The remaining files in a project can only declare the external variable. To

change the definition of variable i to a declaration, use the extern

keyword as follows:

   extern int i;

 

 

  The SAS/C Compiler supports both the common model and the strict

reference definition model. The default model is strict reference-definition.

If you want to use the common model, compile your program with the

common compiler option.

 

                                                                              171

 

 

 


 

170


 

     12  How Does the Compiler

         Work?

 

         171 Introduction

         171 Compiling Your Program

         173 Linking Your Program

         174 Running Your Program

                174 Stack Area

                175 Heap Area

         175 Changing Hunk Names

         176 Addressing Data

         177 Understanding Data Types and Sizes

         179 Storing Data

 

 

 

 

Introduction

 

Programming with the SAS/C Compiler is not much different than

programming in C on other compilers. Most of the books about the C

language that are at your local bookstore are applicable to the SAS/C

Compiler. If you confine your programming to the features that these

books describe, you do not need much specific information about how the

SAS/C Compiler works. However, if you want to perform special tasks

such as linking with assembly language functions, writing I/O drivers in

C, or using overlays, you may need to know how your C program is

translated into executable code.

  This chapter describes how your program is translated into executable

code. This chapter assumes a basic knowledge of object file format as

described in The AmigaDOS Manual, 3rd Edition (Commodore-Amiga, Inc.

1991).

 

 

 

Compiling Your Program

 

The compiler produces an object module (a .o file) for each assembler or

C source file. Each object module is organized into hunks. In general, a

hunk contains the following information:

 

[] program code or data. The program code is written into the code hunk.

   The data for your program are written into one of several hunks,

   depending on how the data are declared. For example, data declared

   with the __chip keyword are placed in the chip hunk.


 

172 Chapter 12

 

 

 

 

[] external symbol information, including subroutine entry points and

   global data. This information is also referred to as global symbols or

   XDEFs.

[] relocation records. The linker uses these records to produce a load file.

   A load file is also called an executable module.

 

   Your program code and data are organized into the following hunks:

 

Code hunk

  contains the machine instructions for your program, any string

  constants (if you compile with stringmerge), and anything else that

  the compiler decides is definitely read-only. By default, this hunk is

  named text, but you change this name with the codename option.

  See the section "Changing Hunk Names," later in this chapter, for

  more information.

 

Near data hunk

  contains all initialized near data, including constants and string

  constants (if you do not compile with the stringmerge option). Near

  data are data that are declared with the __ near keyword or are

  defined in modules compiled with the data=near option.

  data=near is the default setting, so unless you specify otherwise, all

  of your initialized data are placed in the near data hunk. Near data

  can be accessed by resident programs and libraries. This hunk is

  named __MERGED.

 

Near BSS hunk

  specifies the amount of memory to allocate for all uninitialized near

  data. The startup code initializes the near BSS hunk to 0. This hunk is

  also named __MERGED.

 

Chip hunk

  contains all data that are declared with the __chip keyword or

  compiled with the datamem=chip option. This hunk is named chip.

 

Far data hunk

  contains all initialized far data. Far data are data that are declared

  with the __far keyword or are defined in modules compiled with the

  data=far or data=faronly options. By default, this hunk is

  named data, but you can change the name with the dataname

  option. See the section "Changing Hunk Names," later in this chapter,

  for more information.

 

Far BSS hunk

  specifies the amount of memory to allocate for all uninitialized far

  data. The system loader allocates this memory and sets it to zero. By

  default, this hunk is named udata, but you can change the name with


 

                                   How Does the Compiler Work? 173

 

 

 

 

  the bssname option. See the section "Changing Hunk Names," later

  in this chapter, for more information.

 

  When you compile your program with the verbose option, the

compiler produces a message in the following format:

 

 

  Module size P=00000000 D=00000000 U=00000000 C=00000000

  F=00000000 UF=00000000

 

 

The letters indicate which hunks were produced for your program:

 

    P code hunk (your program)

 

    D near data hunk

 

    U near BSS (uninitialized data) hunk

 

    C chip hunk

 

    F far data hunk

 

  UF far BSS (uninitialized data) hunk

 

The numbers give the size in bytes, using hexadecimal notation, of each

hunk. If the compiler does not create certain hunks, then the compiler

either displays zeroes or does not display any numbers for these hunks.

If you compile your program using a debug option, the compiler

generates debugging information and writes this information into two

types of hunks that hold debugging information:

 

       H_DEBUG  contains line numbers, and information about

                variables, typedefs, and structures. H_DEBUG

                hunks are generated by the compiler or the

                assembler.

 

       H_SYMBOL contains absolute addresses of global symbols.

                H_SYMBOL hunks are generated by the compiler or

                the linker.

 

 

 

Linking Your Program

 

The linker combines the object modules to produce a single executable

module or shared library. To produce an executable module, the linker

does the following:

 

[] reads each of the object modules.

[] reads each of the link libraries, if necessary.

[] writes the contents of the object modules to the executable module. In

   the process, the linker resolves all intra-hunk and near data relocations


 

174 Chapter 12

 

 

 

 

                       and generates relocation records for relocations that span hunks. The

                       linker also combines any hunks in the object module that have the

                       same name. For example, the linker merges all near BSS hunks and

                       appends them to the __MERGED data hunk.

                    [] generates overlay nodes, if required.

                    [] copies segments of the library files that are referenced by the program

                       to the executable module. If those segments reference any symbols,

                       then the library segments that define those symbols are also copied to

                       the executable module. This process is repeated until all symbols are

                       resolved.

                    [] produces data for the overlay supervisor, if required.

                    [] produces a map file and cross-reference tables, if requested.

 

                       If you are not using overlays, all of the hunks in the executable module

                     are contained in one primary node (also called the root node). If you are

                     using overlays, the executable module also contains a node for each

                     overlay.

 

 

 

                     Running Your Program

 

                     When you run your program, the AmigaDOS system loader copies the

                     executable module into memory. As it copies the executable module, the

                     loader:

 

                     [] resolves the remaining relocations.

                     [] allocates and zeroes the memory required for uninitialized far data (the

                        far BSS hunks).

 

                       There are two other program components, the stack and the heap, that

                     are not part of the executable file but that form an important part of the

                     final executing program.

 

 

      Stack Area     The stack is a writeable memory area whose size is set by the AmigaDOS

                     stack command or by the external long integer __stack. The default

                     stack size is four kilobytes. This stack is used during function calls for

                     saving registers and passing arguments. Within a function, automatic

                     variables are allocated from the stack.

                       For many C programs, a four-kilobyte stack is adequate. If your

                     program requires more stack space, see Chapter 11, "Using Amiga

                     Specific Features of the SAS/C Language," for information on allocating

                     additional stack space.


 

                                                 How Does the Compiler Work? 175

 

 

 

 

Heap Area  The heap is a writeable memory area whose size is determined by the

           following:

 

           [] the dynamic memory needs of the program

           [] the amount of memory installed on the system

           [] the amount of memory that is currently being used.

 

              All memory allocation routines such as malloc return memory from

            the heap. If the heap is not large enough to handle a request, the library

            function calls on the AmigaDOS system to provide more memory.

 

 

 

           Changing Hunk Names

 

           If you change the names of any of the hunks produced by the compiler,

           keep in mind the following:

 

           [] All hunks with the same name are merged by the linker.

           [] Hunks with different names are loaded separately by the system loader.

           [] The system loader may have trouble finding enough contiguous

              memory to load very large hunks.

 

              The following hunk section names are reserved:

 

           NTRYHUNK

              Your load file may contain only one NTRYHUNK hunk. The linker

              places this hunk first in the executable module. Usually, this name is

              used only as the name of overlay manager's code hunk.

 

           __MERGED

              This name is used for the near data section. All hunks with this name

              are merged and moved into the root node. The startup code initializes

              register A4 to point to this hunk.

 

           _NOMERGE

              Hunks with this name are never merged with other hunks, including

              other hunks named _ NOMERGE. They occupy a single, separate hunk

              in the load file.


 

176 Chapter 12

 

 

 

 

Addressing Data

 

If you compile with the default options, your program code and data are

referenced with one of three different types of addresses:

 

[] 16-bit address relative to the program counter.

     Items in the code section are referenced with 16-bit PC-relative

   addresses.

     The 16-bit offset is a signed value that is added to the current 32-bit

   address in the program counter. Therefore, if a function is more than

   32 kilobytes above or below the point at which it was called, the linker

   constructs an absolute branch instruction within the 32-kilobyte range

   and routes the call through that branch.

[] 16-bit address relative to register A4.

      When you link your program, all data in the near data and near BSS

   hunks are merged into one near data section. When you run your

   program, the startup module loads the address of the near data section

   into register A4, and this section is referenced with 16-bit A4-relative

   addresses.

     Using 16-bit addresses produces code that is smaller and faster

   because each load or store instruction requires only four bytes.

   However, because near data are referenced with 16-bit addresses, you

   are limited to 64 kilobytes of near data. If you have a very large data

   structure or array, consider placing it into the far section.

[] 32-bit absolute address.

      Items referenced with 32-bit addresses can be located anywhere in

    memory. Items in the far data and far BSS sections are referenced with

    32-bit absolute addresses.

      Using 32-bit addresses produces code that requires more space and

    takes longer to run because each load or store instruction requires six

    bytes. However, because far data are referenced with 32-bit addresses,

    there is no limit on the amount of far data that you can declare in your

    program.

 

  chip data are always referenced with a 32-bit pointer and are

therefore considered non-reentrant. However, most chip items are picture

image structures that are referenced in a read-only mode. If your

program uses chip data as read-only, your program is still re-entrant.

Chip data can be accessed by the Amiga custom chips such as graphics

chips and sound chips. Chip data are loaded into chip memory, which is

the lowest 512K to 2M of system memory, depending on the version of

the hardware that you are running.

  You can modify how your program code and data are accessed by:

 

[] declaring individual data items with the appropriate keyword:

   __chip,__near, or__far


 

                                   How Does the Compiler Work? 177

 

 

 

 

[] compiling with the stringmerge option

[] compiling with the abs funcpointer option

[] compiling or linking with the smallcode and/or smalldata options

[] compiling with the code and/or data options

[] compiling with the datamem, codemem, and/or bssmem options

[] linking with the chip or fast option.

 

For more information on the __chip, __near, or __far keywords,

see Chapter 11, "Using Amiga Specific Features of the SAS/C Language."

For more information on the compiler and linker options, see Chapter 8,

"Compiling and Linking Your Program."

 

 

 

Understanding Data Types and Sizes

 

The following sections describe how various data types are represented

on Amiga hardware.

  By default, all arithmetic objects are signed, and therefore, they can

take on values less than zero. However, if you specify the

unsignedchar option, the compiler treats all char objects as

unsigned.

  You can specify that an integral object (char, int, short or long)

be signed or unsigned by declaring the object with the signed or

unsigned keyword, as in the following example:

 

 

  unsigned long x;

 

 

  The following table lists the sizes, minimum values, and maximum

values of each of the signed and unsigned data types.

 

 

 

Type                    Bytes    Minimum            Maximum

signed char             1        -128               +127

unsigned char           1        0                  255

signed short            2        -32,768            +32,767

unsigned short          2        0                  65,535

signed int              4        -2,147,483,648     +2,147,483,647

unsigned int            4        0                  4,294,967,295

 

                                                          (continued)


 

178 Chapter 12

 

 

 

 

Type                    Bytes    Minimum            Maximum

signed long             4        -2,147,483,648     +2,147,483,647

unsigned long           4        0                  4,294,967,295

float (IEEE)            4        3.402E-37          3.402E+38

double (IEEE)           8        2.222E-308         1.797E+308

float (FFP)             4        5.421E-20          9.223E+18

double (FFP)            4        5.421E-20          9.223E+18

 

 

 

 

  Note: In the AmigaDOS environment, pointers are always 4 bytes in

length. Also, the values for signed int and unsigned int in this

table are the values if you do not specify the shortint option.

  The default size of an int on Amiga hardware is four bytes. However,

you can set the size of an int to two bytes by compiling your program

with the shortint option.

When the compiler is calculating the value of an expression using

variables of different data types, the compiler performs some automatic

type promotions and then does the calculation using the data type of the

widest operand. The widest operand is the operand that can contain the

largest positive number. For example, suppose you may have a

calculation involving a variable of type char and a variable of type

unsigned long. The char is automatically promoted to int, so the

calculation now involves an int and an unsigned long. The int is

then promoted to unsigned long under the wider type rule.

  These rules can dramatically affect your code. In the example

calculation, the char is signed. If it holds a -1, for example, the -1 is

promoted to int, yielding -1. The int is then promoted to unsigned

long, yielding a very large positive number.

These implicit conversions follow the conversions described in the

ANSI Standard in Section 3.2.1.5, "Usual Arithmetic Conversions." The

following table lists the type to which the various data types are

converted.


 

                                   How Does the Compiler Work? 179

 

 

 

 

Operand Type                   Conversion Type

char                           int

unsigned char                  int

short                          int

unsigned short                 int

int                            int

unsigned int                   unsigned int

long                           long

unsigned long                  unsigned long

float                          float

double                         double

 

 

 

 

  Note: As previously stated, if you compile your program with the

shortint option, integers are two bytes long. Then, if you cast the

result of an expression involving two integers to another type, you do not

get the results you might expect. For example, you could have the

following code in your program:

 

 

   long l;

   int i=32000;

   int j=32000;

 

 

   l = (long)(i * j);

 

 

If you compile this code with shortint, i and j are not promoted to

long before the expression is evaluated. The result of the expression is

too long to fit into a short integer. The overflow is cast to a long, which

gives the wrong result. To correct the problem, explicitly cast i or j to a

long, as in the following example:

 

 

   l = (long)i * j;

 

 

 

Storing Data

In the C Language, each data object is associated with a storage class that

is either declared with a keyword (auto, extern, static, or


 

180 Chapter 12

 

 

 

 

register) or determined by the context in which the declaration

occurs.

  An object's storage class determines the location where the object is

stored and the scope of the object. Therefore, the storage class of the

objects in your program can affect your program's size and performance.

  The following list describes where objects are stored, based on their

storage class:

 

External

  External objects are stored in a global data area (one of the near, near

  BSS, far, far BSS, or chip sections).

 

Static

  Static objects are stored in a global data area (one of the near, near

  BSS, far, far BSS, or chip sections) unless you specify the

  stringmerge option. If you specify stringmerge, data declared

  static const are placed in the code section.

 

Automatic

  Storage for automatic objects is allocated on the stack during the

  execution of the function in which the object is defined.

 

Formal

  An object has the storage class formal if it is a parameter (or

  argument) to a function. Storage for formal objects is allocated on the

  stack during the execution of the function in which the object is

  defined.

 

Register

  Register variables may be stored in registers, or they may be stored on

  the stack. If you run the global optimizer, the optimizer allocates all

  register variables and ignores the register keyword. If you do not

  run the optimizer and you specify the noautoreg option, only those

  variables you declare with the register keyword are stored in

  registers. If you compile with autoreg, the code generator decides

  which additional variables are stored in registers.

 

                                                                               181

 

 

 

 


 

            13 Writing Portable Code

 

               181 Introduction

               181 Compiling Your Program

               182 Writing Your Program

                   183 Dealing with Data Type Sizes

                   183 Determining Structure Size and Padding

                   184 Writing Structures to a Disk File

                   187 Using Narrow Types in Pre-ANSI Function Declarations

                   188 Using Incomplete Structure Tags

 

 

 

 

Introduction

 

The C language has many characteristics of a portable language, but some

features of the C language are dependent on the type of machine on

which the program is running. However, you can write programs that

run on many different machines if you follow some guidelines when

compiling and writing your program.

  The following sections describe actions you can take to improve the

portability of your programs.

 

 

 

Compiling Your Program

 

You can compile your program with the strict and/or ansi options.

These options enable many warnings that identify possible problems in

your code that may cause errors if you port your code to systems other

than the Amiga system. For example, the following code generates

message number 120:

               void func1(long);

               void func2(void)

 

               {

                    short s=0;

                    func1(s);

               }


 

182 Chapter 13

 

 

 

 

If you compile this code with the strict option, the compiler displays

the following message:

 

 

Warning 120: Integral type mismatch: possible portability problem

             Expecting "long", found "short"

 

 

 

Writing Your Program

 

If you use only library functions and language features that are defined in

the ANSI Standard (American National Standard for Information

Systems--Programming Language C), your program should compile

without modification on any system that has an ANSI-compliant C

compiler. However, there are many features of the C language that are

implementation-defined. Even if your program compiles without

generating errors, it may not run as you expect. See Appendix 3,

"Implementation-Defined Behavior," for more information.

  To help you identify non-portable functions and macros in your

program, you can define the _STRICT_ANSI preprocessor symbol. You

can define this symbol by entering define _STRICT_ANSI= 1 in the

sc command or by entering the following statement in your C source file

before any header files are included:

 

 

      #define _STRICT_ANSI 1

 

 

If you define _STRICT_ANSI, the header files that are defined by the

ANSI Standard (such as errno.h and stdio.h) do not define any

prototypes or macros for functions not permitted by the ANSI Standard.

If your program calls a non-ANSI function, the compiler issues a warning

message because the function has no prototype. For more information on

the _STRICT_ANSI symbol, refer to SAS/C Development System Library

Reference, Version 6.0.

  In addition, if you follow a few additional guidelines, you can avoid

most portability problems. The following list contains some guidelines

that can help improve the portability of your program.

 

[] Do not assume data type sizes are standard.

[] Do not assume structure padding or size is standard.

[] Be careful when writing structures to disk.

[] Do not use narrow types in old-style definitions.

[] Be careful about using incomplete structure tags.

[] Do not write pointers to files. Pointers are useless outside of the

   invocation of the program that generates them.


 

                                                                Writing Portable Code 183

 

 

 

 

                 [] Do not assume that you know whether char variables are signed.

                 [] Do not assume that you know the placement of bitfields within

                    structures.

 

                     The following sections discuss these guidelines in more detail.

 

 

   Dealing with  Do not assume that the int data type is always a particular length. The

Data Type Sizes  ANSI Standard specifies that the int type must be at least as long as the

                 short type and that the short data type must be able to hold numbers

                 in the range 32767 to -32768. Therefore, portable code should never

                 store numbers larger than 32767 or smaller than -32768 in an int. Use

                 long for larger numbers.

                   The default size of an int on the Amiga system is four bytes. On other

                 systems (such as the IBM PC), the size of an int is two bytes. The

                 SAS/C Compiler treats the data types int and long as the same data

                 type. However, you can set the size of an int to two bytes by compiling

                 your program with the shortint option. If you compile with

                 shortint, the compiler treats the data types int and short as the

                 same data type.

                   If you port your program to a system that uses two-byte integers and

                 you do not compile with the shortint option, you may receive

                 unexpected results. For example, when passing parameters on the Amiga

                 system, short and char variables are silently promoted to ints.

                 Therefore, any function declared as receiving a long does not produce a

                 warning if you pass a short or char to the function. To receive an

                 appropriate warning message, you can enable warning 120 by compiling

                 with the warn= 120 or strict compiler options.

                   Declaring an object as signed is usually redundant, because integral

                 objects are signed by default. However, judicious use of the signed

                 keyword can enhance your program's portability, because some compilers

                 may make char declarations and bitfields unsigned by default.

 

 

   Determining   Even though the Motorola 68000 processor uses byte addresses, it

Structure Size   requires that 16-bit and 32-bit data items be aligned on even addresses.

   and Padding   That is, the lowest bit of the address must be zero. Because of this

                 requirement, the SAS/C Compiler inserts dummy bytes (called padding) as

                 necessary to align integers, floats, doubles, and pointers.

                   For example, in the following structure, the SAS/C Compiler adds one

                 byte between the structure members a and 1.

 

 

                    struct misc

                    {

                      char a[3];


 

184 Chapter 13

 

 

 

 

                            long l;

                          };

 

 

                 If the dummy byte was not added, the long structure member would

                 end up on an odd boundary and an addressing exception would result.

                   On other systems, an ANSI compliant C compiler may add more or less

                 padding as required. Many computers require that long integers fall on

                 four-byte boundaries, so the compiler would add three bytes of padding

                 instead of one.

                   Because of these alignment requirements, data structures may be

                 different sizes on different machines. Do not assume that you know the

                 size of a structure based on the fields declared in it. Use the s i z eo f

                 operator to determine the size, and do not depend on sizeof to return

                 the same result on different machines. Using the previous example, the

                 expression sizeof ( struct misc ) has a value of 8, and the following

                 expression has a value of 7:

 

 

                              sizeof(misc.a) + sizeof(misc.l)

 

 

        Writing  If you try to write structures to a disk file on one system and read the file

Structures to a  on another system, you may get different values. This problem may be

      Disk File  caused by differences in structure padding (as described under

                 "Determining Structure Size and Padding") or by differences in the

                 representations for characters, floating-point numbers, or integers. For

                 example, the following program writes a structure to a file:

 

 

                         linclude <stdio.h>

                         main()

                         {

 

                         FILE *fp;

                         struct

                           {

                           char x;

                           short y;

                           } record;

 

 

                         fp = fopen("testfile","wb");

                         record.x = 3;

                         record.y = 4;

                         fwrite(&record,sizeof(record),1,fp);

                         fclose(fp);

                         }


 

                                           Writing Portable Code 185

 

 

 

 

If you compile and run this program using the default compiler options,

the file testfile contains four bytes in the following order: 03 00 00

04. However, if you compile and run this program under MS-DOS,

which uses the Intel 8086 processor, the file contains 03 04 00. The

reasons for the different values are as follows:

 

[] The SAS/C Compiler inserts a padding byte so that integer y is

   correctly aligned. The Intel processor does not require this padding.

[] The Motorola processor writes integers from the high byte to the low

   byte, and the Intel processor writes integers from the low byte to the

   high byte.

 

  The following paragraphs describe some simple rules that you can use

to make your structures more portable between the Amiga computer and

most other computers. These guidelines help you produce a structure that

your program can write to disk and then read in a single operation.

These guidelines are not guaranteed to work in all cases, but they do gain

you limited ability to interchange files between various computers.

The computer to which you are porting your program must do the

following:

 

[] Use the same floating-point format for doubles that you are using on

   the Amiga system (FFP if the math= ffp option is specified, IEEE for

   all other formats).

[] Use the ASCII character set.

[] Use the same sizes for data types:

   char     1

   short    2

   long     4

[] Store integers using the same bit pattern that the Amiga system does.

 

  The structure to be written must follow these rules:

 

[] The structure can contain only the following data types:

     Type          Length

     char          1

     short         2

     float         4

     long          4

     double        8 (or 4 if you compile with math=ffp)

  Do not use ints or any pointer types in the structure.

[] Structures or unions may contain other structures or unions that

   follow these rules.

[] Each field must be placed at an offset relative to the start of the

   structure that is an exact multiple of the field's size.


 

186 Chapter 13

 

 

 

 

[] A nested structure or union must be placed at an offset that is an exact

   multiple of the largest simple arithmetic type occurring in any of its

   fields, including the fields of any substructures or subunions.

[] If the structure or any of its substructures contains a double, the

   structure must contain extra fields as needed to ensure that its total

   size is an exact multiple of the size of a double. If it does not contain

   a double, it must contain extra fields to ensure that its total size is an

   exact multiple of four.

 

   For example, you cannot port the following structure between systems:

 

 

     struct NOTDISKABLE  /* Non-diskable structure */

     {

       char a;

       double d;

       short s;

       long l;

       char name[27];

       struct XXX

       {

         char a, b;

       } foo[11];

 

     };

To make the previous structure portable between systems, you must

declare the structure as follows:

 

 

    struct DISKABLE     /* Diskable version of same structure */

    {

      char a;

      char dummyl[7];  /* following double needs 8-byte offset */

      double d;

      short s;

      short dummy2;    /* following long needs 4-byte offset */

      long l;

      char name[27];

      char dummy2[5];  /* following structure needs 4-byte offset */

      struct XXX

      {

 

        char a, b;

        char dummy3[2];  /* Pad to multiple of 4 bytes */

      } foo[11];

      char dummy4[4];     /* Pad to multiple of 8 bytes */

    };


 

                                                             Writing Portable Code 187

 

 

 

 

Using Narrow  The ANSI Standard states that function definitions should specify the data

    Types in  type of each parameter, as in the following example:

    Pre-ANSI

    Function        /* ANSI Standard prototype-style definition */

Declarations       void newfunc(short s, float f)

                   {

                    .

                    .

                    .

                   }

 

 

 

 

 

              Pre-ANSI C accepted function definitions in the following form:

 

 

                        /* Pre-ANSI old-style definition */

                     void oldfunc(s, f)

                     short s;

                     float f;

                     {

                      .

                      .

                      .

                     }

 

 

                The ANSI Standard default argument promotion rules (described in

              Section 3.3.2.2 of the ANSI Standard) differ for functions defined with

              prototype style definitions and functions defined with old-style definitions.

              You may get incorrect results on ANSI conforming compilers if you use

              ANSI standard prototypes and old-style function definitions for the same

              function. You can avoid this problem by not using narrow data types

              (char, short, and f loat) in function prototypes and definitions.

                The ANSI Standard says that functions defined with old-style definitions

              and no prototypes must receive all char and short parameters as if

              they were type int and receive all float parameters as type double.

              The incoming parameters are then converted to the appropriate shorter

              type. Functions defined with new-style definitions are free to receive

              narrow types as declared. Unfortunately, the caller of the function does

              not know whether the function is defined with a prototype-style definition

              or with an old-style definition.

                The ANSI Standard does not define what happens if you declare a

              function using an old-style definition but also include an ANSI standard

              prototype for the function. To make more programs work as expected, the

              SAS/C Compiler treats such definitions as if they were new-style

              definitions.


 

188 Chapter 13

 

 

 

 

                    If you do not port your program to a system other than the Amiga

                  system, you should not encounter any problems with narrow types unless

                  the following situation occurs:

                    The caller has a prototype for a function that says float. The

                    called function does not include the prototype and has an old-

                    style definition that says f loat.

 

                  The data types char and short do not cause problems on the Amiga

                  system because they are passed as if they were type int for both old-

                  style and prototype-style function definitions.

                    To help identify problem situations, you can enable the following

                 warnings:

 

 

 

                       Warning       Description

 

                       165           This message identifies narrow types that have been used

                                     in function prototypes. You can enable this warning with

                                     the warn=165 option.

 

                       176           This message identifies arguments that have been

                                     promoted using the default argument promotion rules

                                     and, as a result, conflict with the prototype given for the

                                     function. You can enable this warning with the strict,

                                     ansi, or warn=176 option.

 

                       179           This message identifies narrow types that have been used

                                     in an old-style function definition. You can enable this

                                     warning with the strict or warn=179 option.

 

 

 

 

Using Incomplete  An incomplete structure tag is a structure tag (or name) that has not yet

  Structure Tags  been defined. The ANSI Standard allows you to refer to structures by

                  name before they have been defined, as long as you only declare pointers

                  to the structure and do not attempt to dereference these pointers.

                    Incomplete structure tags can cause problems if they occur in a

                  function prototype. The ANSI Standard allows incomplete structure tags

                  in function prototypes but states that the incomplete tag goes out of scope

                  at the closing parenthesis of the prototype. Any declaration of the

                  structure later in the program is not associated with the incomplete tag

                  used in the prototype and is considered to be a completely different

                  structure.

                    If you define the function later in the program, an ANSI-conforming

                  compiler may issue an error message, and your program may not

                  compile.


 

                                           Writing Portable Code 189

 

 

 

 

  For example, many ANSI-compliant compilers generate an error

message for the following code, claiming that the type of the parameter

does not match the type declared in the prototype.

 

 

   void func(struct FOO *);  /* Incomplete tag FOO */

   struct FOO

   {

      int x, y, z;

   };

 

 

   void func(struct FOO *parm)  /* Error here! */

   {

   }

 

 

 

If you move the definition of struct FOO before the prototype, this

code compiles without problems.

  To help you identify incomplete tags, you can enable the following

warnings:

 

 

 

Warning       Options

 

148           This warning identifies any use of incomplete tags. You

              can enable this warning with the warn= 148 option.

 

149           This warning identifies incomplete tags that are used in

              function prototypes. You can enable this warning with

              the strict or warn=149 option.

 

                                                                                191


 

190 Chapter 13


 

 

              [] Part 4

                 Appendices

 

 

 

 

 

Appendices       1 Solving Common Problems

                 2 Error and Warning Messages

                 3 Implementation-Defined Behavior

                 4 Converting From Aztec C Options to SAS/C Options

                 5 Converting from Version 5 to Version 6


 

192


 

                                                                 193

 

 

 

 

Appendix 1

Solving Common Problems

 

 

193 Introduction

193 Resolving Undefined Symbols

195 Fixing Compilation Errors

197 Using CodeProbe

197 Using Formatted Print Functions

198 Using getchar

199 Getting Incorrect Results from Function Calls

200 Crashing the Machine

200 Using The asctime Function

201 Managing the Standard I/O Window

201 Linking Resident Programs or Creating Resident Libraries

202 Writing Replacement Functions for SAS/C Library Functions

202 Eliminating Informational Messages

 

 

 

 

Introduction

 

This appendix describes the solutions to some of the most common

problems for which users call the Technical Support Division. This

appendix also includes questions that the Technical Support Division

anticipates will be generated by the conversion to Version 6.

  Before calling the Technical Support Division, read the read.me file

on disk 1 carefully. (The read.me file is also copied to the directory into

which you install the product if you installed the SAS/C Development

System on a hard drive.) This file contains errata for the documentation

and information about any feature that may have been added after the

documentation went to press.

 

 

 

Resolving Undefined Symbols

 

When I compile and link, I get messages reporting Undef ined

Symbol: _CXnnn and saying that the proper math library has not

been included.

   In your program, you have accessed floating-point math routines, but

   you have not linked with the appropriate math library. Specify the

   appropriate math option for the library with which you want to link,

   such as math=standard. If you are using the link option to link

   your program, the compiler links with the correct math library. If you


 

194 Appendix 1

 

 

 

 

   call the linker separately from the compiler, you must specify the

   correct math library in the slink command after the libs keyword.

   Refer to SAS/C Development System Library Reference, Version 6.0 for

   more information about math libraries.

 

I am getting BLTN and/or CXERR errors, and I am using math libraries

and header files.

   You may be including the math header files for one type of floating-

   point format and linking with libraries for another type of floating-

   point format. For example, you may be including m68881.h and

   linking with scmffp.lib. Different floating-point formats are

   incompatible and should not be mixed. Make sure that your included

   header files match the math library with which you are linking.

     If you find no problem with the compatibility between your header

   files and your math library, contact the Technical Support Division.

 

When I link my project, I get undefined symbols. This code worked in

Release 5.10.

   Some of the library symbol names have been changed to comply with

   the ANSI Standard for symbol names. The ANSI Standard states that

   any symbols that are not mandated by the Standard must begin with

   an underscore and a capital letter or two underscores.

     When you compile your program, the compiler adds an additional

   underscore to the beginning of any symbols defined in C code.

   Therefore, a C symbol with two underscores has three underscores

   when the linker finally sees the symbol.

     If your code refers to a symbol that has changed names from

   Version 5 to Version 6, the linker may produce an undef ined

   symbol message when you link your program. If you receive this

   message, first check the SAS/C Development System Library Reference

   for different versions of the symbols with different numbers of

   underscores. Remember, the linker reports one more underscore on

   the symbol than the SAS/C Development System Library Reference

   shows.

     Change your C code to refer to the new name for the symbol as

   described in the SAS/C Development System Library Reference. If this

   solution is not practical because of the number of references to the

   symbol, you can solve this problem in one of two other ways:

 

   [] Use the define option on the sc command or a #define

      statement in a header file to define the old name to the new name.

   [] Use the define option on the slink command to force all

      references to one of the names to refer to the other. If you define

      the item in your code (in other words, you declare it without the

      extern keyword), you should use the def ine option to defife the


 

                                       Solving Common Problems 195

 

 

 

 

     new name (used by the library) to the old name (used by your

     code). If you declare the item with the extern keyword and,

     therefore, use the library definition for the item, use the define

     option to define the old name (used by your code) to the new name

     (used by the library).

 

     One very common technique used in Version 5 was to declare the

   main routine of your program as _main instead of main to bypass

   the overhead required to set up stdio and argument parsing. You

   should change this name to __main and add the keyword

   __stdargs to be compatible with Version 6. If you do not change

   this name, the linker issues a message saying that the symbol _ main

   is undefined. (Remember, the linker puts in an extra underscore, so

   the symbol it is really looking for is main).

 

 

Fixing Compilation Errors

 

I have installed my compiler correctly, but I keep getting the message

se not found or sc not found whenever I try to do anything.

   Your s:user-startup may not be set up correctly. The installation

   program places three assign statements and the path statement at

   the end of your s:user-startup file. If you are invoking any

   programs that create a new Shell (such as PopCLI) in your

   s: user-startup file before the path sc: c add statement, sc: c

   may not be in new shells created by the program. To correct the

   problem, move the three assign statements and the path statement

   above any calls to programs that create a new Shell.

     If you are running under AmigaDOS Version 1.3, you may have a

   different problem. The installation program places the necessary

   assigns in a file named s :user-startup, which is called from

   s: startup-sequence. You may have to edit

   s: startup-sequence and make some changes. See Chapter 1,

   "Installing Your SAS/C Development System," for information on

   modifying your startup file.

 

After switching to Version 6, my old programs will not compile, or

they compile with a lot of warning messages. Why is this happening

and how can I fix it?

   There are two solutions:

 

   [] In Version 6, the compiler assumes that your code will provide

      prototypes for all functions. (In Version 5, you had to specify the

      -cf option for the compiler to identify missing prototypes.) If your

      code does not define prototypes for all functions, the compiler may

      produce several warning 100, 154, and 161 messages. Specify


 

196 Appendix 1

 

 

 

 

      ignore= 100+154+161 to suppress these warnings, or use the

      genprotos option to generate prototypes for your functions and

      #include the resulting header file.

   [] Unlike previous versions, the header files and libraries for

      Version 6 of the SAS/C Compiler are ANSI-compliant. The ANSI

      specifications affect both ANSI and non-ANSI functions and data

      names, so some non-ANSI functions and data names have also

      changed.

        Convert your program to use the new ANSI-compliant libraries

      and headers. For any functions mentioned in error messages, read

      the description of the function in the SAS/C Development System

      Library Reference. This reference manual describes the parameter

      list, return value, and necessary header files required by each

      function. Make sure that you are including the correct header for

      each of the SAS/C or AmigaDOS functions that you are calling.

 

When I compile, the options I requested do not act as expected.

   When you compile your program, whether you compile from the Shell

   or the Workbench screen, the compiler looks for an scoptions file

   in your current directory. If it does not find one, it looks for the file

   ENV: sc/scoptions. If it finds either of these files, it uses any

   additional options specified in the file. You can run the scopts utility

   or edit the scoptions file to review the options specified in these

   files. If you want to prevent the compiler from reading the options

   specified in any scoptions file, specify the resetoptions option

   as the first option in the sc command. If your program then runs as

   expected, you have a problem with the options that you have specified.

   If you specify the verbose option, the compiler tells you the location

   of the scoptions file used.

 

During compilation, I get the message semi-colon expected in a

header file.

   Check for extra characters at the beginning of your file in front of

   your #include statements or in one of your header files. You may

   have accidentally pressed a key while starting the editor.

 

I keep getting the message Error 25: Modifiable lvalue

required, but I am declaring all my variables for a function just like

it says in the library reference manual.

   Do not include the const keyword in your declarations. The SAS/C

   Development System Library Reference contains many variables defined

   with the const keyword, especially pointers to strings. This keyword

   is required by the ANSI Standard and indicates that these variables

   will not be modified in the library function to which they are passed.

   The const keyword is present in the parameter list of the prototype


 

                                       Solving Common Problems 197

 

 

 

 

   that is found in the associated header file. This prototype, not the

   declaration you should include in your program, is what is described

   in the synopsis for each function in the SAS/C Development System

   Library Reference. Use the synopsis as a guideline for your

   declarations, but do not include the const keyword.

 

 

 

Using CodeProbe

 

I do not get all of the information I expect out of CodeProbe, or

CodeProbe does not know about variables and functions it should

know about.

   You may not be compiling with the correct debug option. If you are

   compiling with nodebug or debug=line, try compiling with

   debug=sf. For a complete description of each debug option, see

   Chapter 8, "Compiling and Linking Your Program."

 

CodeProbe does not work if I double-click on the Debug icon from the

WorkBench screen.

   To invoke CodeProbe from the WorkBench screen, click on the Debug

   icon. Then, hold down the Shift key and double-click on the icon for

   your program's executable module.

 

 

 

Using Formatted Print Functions

 

printf (or sprintf, fprintf, and so on) does not print the correct

values.

   This problem can happen for the following reasons:

 

   [] You are asking printf to print a variable, but the variable

      conversion characters are incorrect. For example, you are trying to

      print a long integer using %d as the conversion character. A

      long variable requires a %ld if the shortint compiler option is

      active. Often, if you have one conversion character wrong, the rest

      of the line you are printing is also incorrect. Check your entire

      printf (or fprintf, etc.) format string carefully.

   [] You are trying to print a float or a double, but you have not

      linked with the proper math library. You must link with a floating

      point math library to perform any floating point operations. If you

      are linking with a floating point library, make sure that it is

      positioned in your slink command line before sc . lib so that the

      linker can find the correct version of printf. If you specify the

      link option in the sc command, the compiler links the libraries in

      the correct order.


 

198 Appendix 1

 

 

 

 

   [] You are linking with amiga.lib before the math library and

      sc.lib. You should specify amiga.lib as the last library in the

      slink command.

 

 

 

Using getchar

 

getchar does not work as expected.

   Input and output on the Amiga system are buffered. On most other

   systems, getchar immediately gets a character from stdin (usually

   the keyboard). However, the CON: device on the Amiga system buffers

   its input, so your program does not actually read any characters until

   you do one of the following:

 

   [] fill up the console input buffer

   [] press Return

   [] enter the Amiga End-of-File character, Ctrl-\.

 

   The SAS/C Development System libraries include two functions that

   you can use to deal with this problem:

 

   getch  gets a character from the console in RAW mode. The

          character is returned as soon as the user types it.

 

   rawcon turns RAW mode on and off. rawcon(1) sets the console

          into RAW mode. rawcon (0) restores the console to non-

          RAW mode.

 

   When the console is in RAW mode, any characters typed by the user

   are passed immediately to the application.

   getch returns a single character from stdin just like getchar,

   but getch gets the character in RAW mode. If your console is not in

   RAW mode, using getch is equivalent to the following sequence:

 

 

       rawcon(1);

       c = getchar();

       rawcon(0);

 

 

   If your console is in RAW mode, getch is equivalent to getchar.

     For more information about getchar, refer to SAS/C Development

   System Library Reference.

 

                                       Solving Common Problems 199

 

 

 

 

Getting Incorrect Results from Function

Calls

 

My program compiles and links without errors, but I am getting the

wrong results from some of my SAS/C function calls.

   You can get incorrect results from a function if you do not include the

   correct header files for the function you are calling. The header files

   contain prototypes for each of the SAS/C functions, as well as

   definitions for many common data structures required by these

   functions. By including the correct header file, you are providing the

   compiler with a prototype for the SAS/C functions you call.

     The ANSI Standard requires that the compiler assume that functions

   that are called without the previous inclusion of a prototype return an

   int. For example, this means that if you call atof, which returns a

   double, without including math . h, the compiler assumes that atof

   returns an int and allocates only 4 bytes for the return value. When

   atof is called and the correct 8-byte double value is returned in the

   4-byte space allocated for it, the value appears to be incorrect.

     You may be including the incorrect header file for one of these

   reasons:

 

   [] In Version 6, the prototype is contained in a different header file

      than in Version 5. For example, in Release 5.10, the function atof

      was included in math.h. In Version 6, the atof prototype was

      moved to stdlib.h as required by the ANSI Standard. Check the

      SAS/C Development System Library Reference for the correct header

      file for the functions that you are using.

   [] You may be including the right header file from the wrong

      directory. For example, the include:dos directory contains many

      header files with the same names as those in the root level

      include: directory. However, these header files are AmigaDOS

      header files and not ANSI header files. The AmigaDOS header files

      do not contain the necessary prototypes and data declarations. For

      example, you may be including dos /stdio.h instead of

      stdio.h. Do not substitute header files from the include:dos

      directory for standard headers.

   [] You may be including header files from the proto directory instead

      of those in the root level include: directory. Although the files in

      the proto directory do contain prototypes for many of the SAS/C

      functions, these files are intended to be included in addition to the

      standard header files, not in place of them. Do not use header files

      in include: subdirectories as substitutes for the root level header

      files.


 

200 Appendix 1

 

 

 

 

Crashing the Machine

 

My program compiled and linked without any errors, but when I run

it, my machine crashes. What am I doing wrong?

   The following list contains some of the more common errors that

   crash programs. Most of these errors are caused when your program

   accesses memory that it is not supposed to access.

 

   [] You have declared a pointer to an array or structure for which you

      have not allocated memory. This mistake is especially easy to make

      when calling functions that fill the array or structure with

      information, such as the fstat, lstat, and stat functions.

        To correct this problem, call malloc or calloc to allocate the

      appropriate amount of memory for the array or structure.

   [] You have assigned an inappropriate value to a pointer, so the

      pointer no longer points to a valid memory space. This type of error

      can be quite difficult to track down. You may want to run the

      CodeProbe, the Enforcer, or the Mungwall program if you think

      these types of errors may occur. Enforcer and Mungwall are

      programs that detect memory errors. They are available from

      Commodore Applications and Technical Support (CATS) and are

      shipped with Version 6.

   [] You have specified the nostackcheck option and are overwriting

      your stack. Do not specify nostackcheck until your program is

      completely debugged. The stackcheck option is the default unless

      you are creating a shared library using the libcode option.

 

 

 

Using The asctime Function

 

I am using the asctime function to convert the time to Greenwich

Mean Time (GMT) correctly, but the result is exactly an hour (or two

or three...) off.

   Your machine is probably in the default time zone, Central Standard

   Time (CST), and has not been reset to your actual time zone. To

   correct the problem, reset your machine's time zone environment

   variable to your actual time zone with the following AmigaDOS

   command:

 

 

     setenv TZ=your-time-zone


 

                                       Solving Common Problems 201

 

 

 

 

   For your-time-zone, enter your zone's standard three letter

   abbreviation followed by the number of hours difference between your

   time zone and Greenwich Mean Time. For example, for Eastern

   Standard Time, the command would be as follows:

 

 

      setenv TZ=EST5

 

 

   You can also initialize the _ TZ variable as described in the SAS/C

   Development System Libra~y Reference. Initialize the _ TZ variable with

   the same time zone data as you would enter with the AmigaDOS

   command described above (for example, EST5).

     Note: The AmigaDOS environment variable does not have a

   leading underscore that the SAS/C data name has.

 

 

 

Managing the Standard 1/0 Window

 

An annoying window opens when I run my program from the

Workbench screen. How do I get rid of this window?

   The SAS/C startup code opens the window to allow programs that are

   run from the Workbench screen to access stdin, stdout, and

   stderr. You can eliminate this window or change its attributes. For

   information on managing this window, see Chapter 9, "Running Your

   Program from the Workbench Screen."

 

 

 

Linking Resident Programs or Creating

Resident Libraries

 

I get the message absolute reference to name from the linker.

   You are linking a resident program with the cres . o startup module,

   or you are creating a resident library, but the linker detected a

   reference to an absolute symbol. Make sure that the symbol being

   referenced is not being modified. If the item is not being modified,

   then you can ignore the warning message.


 

202 Appendix 1

 

 

 

 

Writing Replacement Functions for SAS/C

Library Functions

 

I wrote a replacement function for one of the SAS/C library routines,

but the library routines don't seem to be using my replacement

function.

   If you write a function that has the same name as a library function,

   you need to add the __regargs keyword to your function or

   compile with the parms=both or parms=register option. For

   example, you may want to replace the SAS/C library function malloc

   with your own version of malloc. If you compile with the

   parms=stack option or define your version of malloc with the

   __stdargs keyword, then two versions of malloc are linked into

   your executable. If you use other SAS/C library functions that call

   malloc, these functions use the version of malloc in the SAS/C

   libraries. However, your functions that call malloc use your version

   of malloc. To make sure that all calls to malloc are using your

   version of malloc, define your version with __regargs or compile

   with the parms=both or parms=register option.

 

 

 

Eliminating Informational Messages

 

How can I turn off all of the informational messages the compiler and

linker produce every time I compile and link?

   You can specify the following options on the sc command line:

  

                    sc nover link filename.c


 

                                                                203

 

 

 

 

Appendix 2

Error and Warning

Messages

 

 

203 Introduction

203 Using Error and Warning Messages

204 Explanations of Unnumbered Compiler Messages

206 Explanations of Numbered Compiler Messages

258 Explanations of Linker Messages

265 Enabling Suppressed Messages

 

 

 

 

Introduction

This appendix explains each of the error and warning messages that may

be produced by the compiler and linker.

 

 

 

Using Error and Warning Messages

 

You should treat warnings as seriously as errors. If you do not know why

a given warning is being produced, find out why. If you can safely ignore

the warning in the future, use the ignore option on the compiler or the

#pragma msg statement to suppress the warning.

  In general, the compiler attempts to prevent long cascades of error and

warning messages that result from a single mistake, but this action is not

always possible. As a result, you may see several messages generated by

the same error, especially if the error is in a control statement such as an

if, for, do, or switch statement. If you receive some messages that

seem to be incorrect or confusing, fix as many errors or warnings as

possible, and then recompile your program. The confusing messages may

disappear.

  Sometimes the compiler may generate an error message for code that

you believe is correct. In many cases, such errors are the result of

incorrectly using the preprocessor. A typographical error in a

preprocessor macro or accidental collision of a #def ined macro name

with another name in your program can cause very confusing problems.

If you think you are having problems with preprocessor macros, compile

your program with the pponly option to generate preprocessed output,

and check that to see exactly what the compiler is receiving.

Alternatively, compile with the list option to generate a listing file. The


 

204 Appendix 2

 

 

 

 

listing file allows you to see exactly what symbols are being defined by

the header files included by your program.

  Some error or warning messages are produced at the first non-

preprocessor statement after the actual condition that caused the error or

warning. For example, if your program is missing a semicolon, you do

not get a message at the end of the line that is missing the semicolon; you

get a message at the beginning of the next line of code. If you cannot find

an error exactly where the message occurred, look at several previous

lines in your source code . Remember, the compiler treats #include

files as if they are part of your source file. For example, a missing close

curly brace at the end of your last #include file may result in an error

message at the first line of your C source file. You can compile with the

pponly option to help diagnose this type of error.

  By default, many warning messages are suppressed but can be enabled

with the strict, ansi, or warn options. The descriptions of each

message indicate whether the message is suppressed and, if so, which

options enable the message. You can enable any suppressed warning with

the warn or error options. You can disable any warning with the

ignore option. You cannot use the ignore option to disable error

messages. See Chapter 8, "Compiling and Linking Your Program," for

more information about the strict, ansi, error, warn, and ignore

options. See also "Enabling Suppressed Messages" later in this appendix

for a complete list of the suppressed messages and the options you can

use to enable them.

  Some messages listed as warnings can also be produced as errors in

some cases. If a message is produced as an error instead of a warning, it

cannot be ignored (just as errors cannot be ignored).

  You can display help information on a specific message from the

message browser utility (scmsg) by clicking on the message and pressing

the Help key or by invoking the AmigaGuide utility on the file

sc:help/scmsg.guide.

 

 

 

Explanations of Unnumbered Compiler

Messages

 

Freeing Resources

   If you compile your program and your machine runs low on memory,

   the compiler displays this message and frees memory to enable it to

   continue the compilation. You can force the compiler to free memory

   at any time by pressing Control-F in the window to which the

   compiler is sending output.


 

                                     Error and Warning Messages 205

 

 

 

 

Floating point overflow optimizing constants

   The global optimizer was attempting to perform compile-time constant

   calculations, but the calculations caused a floating-point error. Your

   code is causing floating-point numbers to overflow.

 

Can't open type file "name" for mode

   The compiler could not open the specified file. The mode is either

   read or write.

 

Combined output filename too long

   The filename produced by the compiler, with the path, overflowed the

   compiler's internal buffer (255 bytes).

 

Can't open sc:libs/lib-name.library

   The specified shared library could not be found. Make sure the library

   is available in sc:libs.

 

CXWRN: text

   An internal error occurred. With CXWRN errors, the compiler attempts

   to continue the compilation, but may not be able to do so. Please

   contact the Technical Support Division.

 

CXERR: num

   An internal error prevented the compiler from continuing. Please

   contact the Technical Support Division.

 

Can't delete old GST: object is in use

Continuing with no GST file

   You specified the makegst option, but an existing copy of the same

   GST was in use by another program. Check for other compilations that

   are using the GST. You may also be browsing the GST with the

   hypergst utility.

 

Can't open GST file: gst-filename

   The specified GST file could not be loaded. Either the file is an invalid

   GST file, or the file does not exist.

 

Invalid symbol definition: symbol-name

   You attempted to define the specified symbol on the command line

   with the define compiler option, but the symbol did not adhere to

   the normal rules for C preprocessor symbol syntax.

 

Seek error on object file

   The compiler attempted to perform a seek operation on the output

   object file but encountered an I/O error.

 

I/O error code on file "name"

   The compiler received the specified I/O error code from the operating

   system while attempting to read the named file. Refer to The

   AmigaDOS Manual, 3rd Edition (Commodore-Amiga, Inc. 1991) or see

   the header file dos/dos.h for details on the numeric error codes.


 

206 Appendix 2

 

 

 

 

 

             Explanations of Numbered Compiler

             Messages

 

Warning 1:  invalid preprocessor command

 

            This warning is generated by invalid use of preprocessor commands.

            For example, you could specify an unrecognized command, fail to

            include a space between command elements, or use an illegal

            preprocessor symbol. The command is ignored and compilation

            continues.

 

  Error 2:  unexpected end of file

 

            This error is generated when the compiler expects more data, but it

            encounters the end of an input file. This error may occur in a

            #include file or in the original source file. A missing #endif or

            unbalanced curly brace or parentheses in the source file or in one of

            the previously included files may produce this message. In many cases,

            correcting a previous error eliminates this error.

 

  Error 3:  file not found "filename"

 

            The filename specified in a #include command was not found or

            could not be opened.

 

  Error 4:  invalid lexical token

 

            A character was found in the file that is not a standard character in the

            C character set or is in an inappropriate place. For example, entering a

            pound sign (#) in the middle of non-preprocessor C code or entering

            nonprintable control characters anywhere except in a comment

            produces this error.

 

  Error 5:  invalid macro usage

 

            Your code invoked a macro incorrectly. Check for unbalanced

            parentheses and other syntax errors. The problem may be in a macro

            used by the macro that you invoked in your program.

 

  Error 6:  line buffer overflow

 

            A line of preprocessed input was longer than the line buffer size. The

            size of the line buffer is controlled by the ppbuf and memsize

            options. If you do not specify ppbuf or memsize, the size of the line

            buffer is 8192 bytes.


 

                                                  Error and Warning Messages 207

 

 

 

 

 Error 8:  invalid conversion

 

             You attempted to cast a type to an incompatible type. This error usually

             occurs when you attempt to convert something into an array, a

             structure, or a function. Check for missing indirection (*) and/or

             address (&) operators. For example, the following program tries to

             assign a whole structure to a pointer.

 

 

                void main ( void )

                {

                  struct FOO

                  {

                     int a, b;

                  } f;

                  struct FOO *p;

                  p = f;  /* Error 8 */

                  p = &f; /* Correct */

                }

 

 

 

 Error 9: undefined identifier "name"

 

             The specified identifier has not been declared. You may not have

             included the proper header files to declare an extern, or you may

             have misspelled the name of a variable. This message is produced only

             once for each undeclared identifier. Subsequent uses of the identifier do

             not produce a message. Subsequent declarations of the identifier may

             produce messages about redeclaring the variable. Fix the error that is

             causing the first error 9 message and recompile your program before

             trying to fix additional messages involving the same variable.

 

Error 10:  invalid subscript expression

 

             An error was detected in an expression used inside square brackets ([]).

             This error may occur if:

 

             [] the expression is missing

             [] the expression is a preprocessor macro that evaluates to nothing

             [] the result of the expression is void

             [] the result of the expression is a pointer, a structure, or a union.

 

 

 

Error 11: string not terminated

 

             The closing double quote (") was not provided when defining a string.


 

208 Appendix 2

 

 

 

 

Error 12: invalid structure reference

 

          The operand preceding the structure member ( . ) or structure pointer

          (->) operator is not a structure or a pointer to a structure, respectively.

          Make sure you are not trying to reference a structure member with the

          structure pointer operator or a structure pointer with the structure

          member operator. In many cases, correcting a previous error eliminates

          this message.

 

Error 13: member name missing

 

          The name of the desired structure or union member did not follow the

          structure member operator ( . ) or the structure pointer operator (->).

          Check for preprocessor macros that may be defined to the same name

          as the member.

 

Error 14: undefined member "name"

 

          The indicated identifier is not a member of the structure or union to

          which the structure member operator ( . ) or the structure pointer

          operator (->) referred.

         

Error 15: invalid function call

 

          An identifier or constant is used where a function or function pointer

          identifier is required. This message can occur if you attempt to use a

          variable not declared as a function or function pointer but give the

          variable a parameter list. The compiler sees the parenthesized

          expression and thinks you are calling a function. Check for

          typographical errors such as leaving out an operator in an expression,

          which produces a variable and a parenthesized expression. Such

          typographical errors may also occur in preprocessor macros. For

          example:

 

 

                         /* The incorrect expression below generates an */

                         /* "invalid function call" error.              */

 

 

                         int i, j;

                         void function(void)

                         {

 

                            i = i + (j*2); /* Intended expression */

                            i = i   (j*2); /* INCORRECT - deleted "+" operator */


 

                                                     Error and Warning Messages 209

 

 

 

 

  Error 16:  invalid function argument

 

                A function argument expression following the left parenthesis of a

                function call is invalid. You may see this message if you omit:

 

                [] an argument expression

                [] a right parenthesis from a function call

                [] a comma separator between two function arguments.

 

 

                For example:

 

 

               func(.);

               func(;

               func(,1);

 

 

  Error 17: too many operands

 

                During expression evaluation, the end of an expression was

                encountered, but more than one operand was still awaiting evaluation.

                This message may occur if an expression contained an incorrectly

                specified operation.

 

Warning 18: non-ANSI use of operator in preprocessor condition

 

                This message is suppressed by default, but you can enable it with the

                strict, ansi, or warn=18 options. The ANSI Standard states that

                the sizeof and comma (, ) operators should not be used in

                preprocessor conditions. The SAS/C Compiler supports their use in

                preprocessor conditions, but programs that require strict adherence to

                the ANSI Standard should not use them.

 

  Error 19: unbalanced parentheses

 

                The number of opening parentheses in an expression did not equal the

                number of closing parentheses. If the expression appears correct in the

                C source file, check any preprocessor macros to make sure they

                generate balanced parentheses.

 

  Error 20:  invalid constant expression

 

                An expression that did not evaluate to a constant was encountered in a

                context that required a constant result. The compiler must be able to

                evaluate any constant expression (for example, expressions used to

                initialize static or external data) when the program is compiled.

                The expression in question did not meet this criterion. You may have

                used an illegal operator for a constant expression (such as ++, +=,

                function calls, and so on), or you may have used a variable whose value

                is available only at run time.


 

210 Appendix 2

 

 

 

 

  Error 21: illegal use of struct, union, or array type

 

            An identifier declared as a structure, union, or array was encountered

            in an expression where such types are not permitted. For example, you

            cannot use the ++ postincrement operator with a structure:

           

                          struct FOO

                          {

                            int a, b, c;

                          } f;

                          f++;      /* Error 21 */

Warning 22: structure used as function argument

 

            This message is suppressed by default, but you can enable it with the

            warn=22 option. A structure or union was passed as an argument to a

            function. Although passing structures and unions is legal according to

            the ANSI Standard, some compilers do not allow you to pass structures

            or unions. Other compilers pass a pointer to the structure instead of the

            entire structure. Turn on this warning if your code comes from or must

            be ported to such a compiler.

 

  Error 23: invalid use of conditional operator

 

            The conditional expression operator (?: ) was used incorrectly. You may

            have included the question mark (?) but left out the colon (:). Also,

            check for an invalid expression after the operator.

           

  Error 24: pointer operand required

 

            An expression required a pointer at a specific place, but a non-pointer

            operand was provided. The compiler may generate this message if an

            expression after the indirection operator (*) was not a pointer or array

            expression or if the expression before the array indexing operators ( [ l )

            was not a pointer or array expression.

 

  Error 25: modifiable lvalue required

 

            You have attempted to assign a value to an expression that cannot be

            modified. An Ivalue is any expression that can appear on the left side of

            an assignment operation. For example, the ANSI Standard states that

            the result of a cast is not an lvalue; therefore, the following statement is

            invalid:

 

 

                          long x;

                          (short)x = 2;  /* Error 25 */


 

                                                  Error and Warning Messages 211

 

 

 

 

             The following examples also generate this error message:

 

 

               #define ADDONE(x) (x)++

               ADDONE(12);     /* Error 25: Cannot increment a constant */

               ADDONE(&g);     /* Error 25: Cannot assign to an address */

               if(func(10)=j-2);  /* Error 25: "==" was intended, not "=" */

               &x = &y;        /* Error 25: Cannot assign to an address */

 

 

               You may have defined a variable with the const keyword and then

             tried to modify the value of that variable. The SAS/C Development

             System Library Reference, Version 6.0 contains many variables defined

             with the const keyword, especially pointers to strings. This keyword is

             required by the ANSI Standard and indicates that these variables will

             not be modified in the library function to which they are passed. The

             const keyword is present in the parameter list of the prototype that is

             found in the associated header file. This prototype, not the declaration

             you should include in your program, is what is described in the

             synopsis for each function in the SAS/C Development System Library

             Reference. Use the synopsis as a guideline for your declarations, but do

             not include the const keyword.

 

Error 26: arithmetic operand required

 

             An expression required an arithmetic operand but the provided operand

             was not arithmetic. An operand is arithmetic if it declared as char,

             short, int, long, float, or double or the signed and unsigned

             variants of these types.

 

             Pointers, structures, unions, and functions are not arithmetic operands.

 

Error 27: arithmetic or pointer operand required

 

             An expression required an arithmetic or pointer operand, but a

             structure or union was provided. An operand is arithmetic if it declared

             as char, short, int, long, float, or double or the signed and

             unsigned variants of these types.

 

             A pointer operand can be a pointer to any other data type, or it can be

             the address of a variable or function.


 

212 Appendix 2

 

 

 

 

  Error 28: missing operand

 

            During expression evaluation, the end of an expression was encountered

            but not enough operands were available for evaluation. The compiler

            may generate this message if you specified a binary operator (such as

            the addition, subtraction, multiplication, or division operator) with only

            one operand. Also, check for invalid preprocessor macro expansions.

            For example:

 

 

                         int i;

                         int ary[10];

 

 

                         i = i + ;     /* Error 28 */

                         i = ary[i*]4; /* Error 28 (Among others) */

 

  Error 29: operation cannot be performed on a pointer

 

            An operation was specified that was invalid for pointer operands, such

            as one of the arithmetic operations other than addition or subtraction.

 

Warning 30: pointers do not point to same type of object

 

            In an assignment statement defining a value for a pointer variable, the

            expression on the right side of the assignment (=) operator did not

            evaluate to NULL or to a pointer of the same type as the pointer

            variable on the left side of the assignment operator. The warning is also

            produced when a pointer of any type is assigned to an arithmetic object.

 

  Error 31: integral operand required

 

            An expression required a given operand to be an integral type, but the

            actual operand was not an integral type. An operand is integral if it is

            declared as char, short, int, or long or the signed and unsigned

            variants of these types.

 

            For example, the following code generates error 31:

 

 

                         double d;

                         int ary[10];

 

                         ary[d] = 10;  /* Error 31 */


 

                                                     Error and Warning Messages 213

 

 

 

 

  Error 32: cannot convert to required type

 

            The compiler was unable to convert a data item from its base type to

            the type required by the operation. The compiler may generate this

            message if you attempt to cast any data type to a structure, instead of

            casting the type to a pointer to a structure, or if you attempt to cast a

            structure to any other type. This message can also be produced for

            implied conversions, such as passing a structure as a parameter to a

            function expecting some other type. For example, the following code

            generates error 32:

 

 

                  struct FOO f;

                  int j;

                  j = (int)f;  /* Error 32 */

 

Warning 33: non-portable operation on structure or union

 

            Your code has attempted to use an operator on a structure or union

            that is illegal for that type. For example, you may have used the

            equality == operator on two structures. The ANSI Standard does not

            permit the use of relational operators on structures or unions.

 

              The SAS/C Compiler generates the equivalent of a memcmp call for

            this construct, but it may not perform as expected. Because structures

            may contain padding bytes, two structures of the same type with all

            identical members may compare false. If you intend to use direct

            structure comparison, make sure you declare the structure static or

            extern, or initialize the structure to zeroes using a call to memset.

 

            For example, the following code generates warning 33:

 

 

                  #include <proto/dos.h>

                  struct FileInfoBlock fib1, fib2;

 

                  if(fib1 == fib2)  /* Warning 33 */

 

 

  Error 34:  invalid initializer expression

 

             The expression used to initialize an object was invalid. The compiler

             may generate this message if you fail to separate elements in an

             initializer list with commas or if you attempt to initialize an array to a

             single object, as shown in the following examples:

 

 

                  int a[3] = 0;          /* Error 34 */

                  int b[3] = { 1 2 3 };  /* Error 34 */


 

214 Appendix 2

 

 

 

 

  Error 35: closing brace expected

 

            The compiler expected a closing brace (}) to terminate the definition of

            a function, structure, or nested block scope, but the brace is missing.

            The compiler may generate this message if:

 

            [] too many elements occur in an initializer expression list

            [] a structure member was improperly declared

            [] the end of the source file is reached before a definition is complete

            [] a previous error occurred in a control statement.

 

 

Warning 36: control cannot reach this statement

 

            A statement with no label followed a goto, return, break, or

            continue statement. The statement is therefore unreachable. This

            warning can sometimes be produced incorrectly if the compiler reported

            a previous error while in a control flow statement. Fix all previous

            errors and recompile your program before trying to fix the error that is

            generating this message.

 

  Error 37: duplicate statement label "name"

            See line number in file "filename"

 

            The specified statement label has already been defined in the current

            function. You cannot define the same label more than once in the same

            function.

 

  Error 38: unbalanced braces

 

            In a set of compound statements, the number of opening left braces ({)

            did not equal the number of closing right braces (}). This warning may

            be produced incorrectly if the compiler reported a previous error in a

            control flow statement. Fix any previous errors and recompile your

            program before trying to fix the error that is generating this message.

 

  Error 39: invalid use of keyword "keyword"

 

            One of the C language reserved words appeared in an invalid context

            (for example, as a variable name).

 

  Error 40: break not inside loop or switch

 

            A break statement was detected that was not within the scope of a

            while, do, for, or switch statement. This error may be produced

            incorrectly because of errors in previous statements.

 

  Error 41: case not inside switch

 

            A case prefix was encountered outside the scope of a switch

            statement. This error may be produced incorrectly because of errors in

            previous statements.


 

                                                     Error and Warning Messages 215

 

 

 

 

Warning 42: case expression not integral

 

              The expression defining a case value did not evaluate to an integral

              constant. This message is generated as an error message if the

              expression could not be converted into an integral constant and as a

              warning if the expression could be converted into an integral constant.

              For example, if you use a variable as a case value, the compiler

              generates an error message. If you use a floating-point constant as a

              case value, the compiler converts the constant to an integer

              (thereby truncating its value) and generates a warning message. For

              example, in the following code, the case value 1.6 is truncated to 1,

              and the value -1.6 is truncated to -1.

 

              switch(i)

              {

                case 1.6:  /* Warning 42 */

                        break;

 

                case -1.6:  /* Warning 42 */

                        break;

              }

 

 

 

  Error 43: duplicate of case value See line number in file

            "filename"

 

              You have used the same case value more than once within the same

              switch statement. Check for possible preprocessor macro definitions

              that expand to the same value. For example, both of the following case

              statements evaluate to zero:

 

 

                 #define FOO 0

                 #define BAR 2

 

 

                 switch(i)

                 {

                   case FOO:

                        break;

                   case (FOO*BAR):  /* Error 43 */

                        break;

                  }


 

216 Appendix 2

 

 

 

 

Error 44: continue not inside loop

 

          A continue statement was detected that was not within the scope of a

          while, do, or for loop. This error may be produced incorrectly

          because of errors in previous statements.

 

Error 45: default not inside switch

 

          A default label was encountered outside the scope of a switch

          statement. This message may be produced incorrectly because of errors

          in previous statements.

 

Error 46: duplicate default See line number in file

          "filename"

 

          A default label was encountered within the scope of a switch

          statement in which a default label had already been encountered.

 

Error 47: while missing from do statement

 

          A while clause did not follow the body of a do statement. This

          message may be produced incorrectly because of errors in previous

          statements.

 

Error 48: invalid while expression

 

          The expression defining the looping condition in a while or do loop

          was void or was missing. If you intend for a loop to be infinite, you

          must supply a constant (such as 1) for the while condition. The error

          may be produced because of a preprocessor macro that expands to

          invalid code. In many cases, fixing a previous error eliminates this

          message.

 

Error 49: else not associated with if

 

          An else keyword was detected that was not in the scope of a

          preceding if statement. This message may be caused by an error in a

          preceding statement, especially if the previous error occurred while

          processing the if statement with which the else statement is

          associated.

 

Error 50: label missing from goto

 

          The compiler expected a statement label to follow the goto keyword

          but the label was missing. This message may be produced incorrectly

          because of errors in previous statements.


 

                                                   Error and Warning Messages 217

 

 

 

 

Warning 51: C++ comment detected

 

            This message is suppressed by default, but you can enable it with the

            strict, ansi, or warn=51 options. In C++, comments begin with

            two slashes (//) and terminate at the end of the line on which they

            begin. The SAS/C Compiler accepts comments entered in this way for

            convenience and for compatibility with other implementations, but they

            are not part of the ANSI Standard for the C language.

 

  Error 52:  invalid if expression

 

            The expression following the if keyword on an if statement was

            void, invalid, or missing. This error may be caused by a preprocessor

            macro expanding to inappropriate values or may be the result of an

            expression with an invalid return type (such as a structure type). In

            many cases, fixing a previous error eliminates this message.

 

  Error 53: invalid return expression

 

            The expression following the return keyword was void, invalid, or

            missing. The compiler may generate this message if a preprocessor

            macro expands to inappropriate values. In many cases, fixing a previous

            error eliminates this message.

 

Warning 54: switch expression not integral

 

            The expression defining the test value for a switch statement did not

            define an integral value as required by the ANSI Standard. The value

            supplied is converted to int before any attempt is made to use it. If the

            switch value is a floating-point value, this conversion may truncate

            the value. This warning can also be generated as an error if the value

            could not be converted to int.

 

Warning 55: no case values for switch statement

 

            The statement defining the body of a switch statement did not define

            any case statements. This warning may be produced incorrectly

            because of previous errors.

 

  Error 56: colon expected

 

            The compiler expected but did not find a colon (:). This message may be

            generated if a case expression was improperly specified or if the colon

            was omitted following a label to a statement. Because the compiler scans

            through newlines, blanks, and comments looking for the colon, this

            message is usually produced at the beginning of the line following the

            actual error.


 

218 Appendix 2

 

 

 

 

  Error 57:  semi-colon expected

 

             The compiler expected but did not find a semi-colon (;). This error can

             be generated if you use too many right parentheses or right curly braces

             (}). Because the compiler scans through spaces and tabs looking for the

             semicolon, this message is usually produced at the beginning of the line

             following the actual error.

 

  Error 58:  missing parenthesis

 

             A required parenthesis is missing. This error is often caused by

             previous errors.

            

  Error 59:  invalid storage class

 

             Possible storage classes are denoted by the keywords __near, __far,

             __chip, register, auto, extern, and static. Some of these

             keywords are invalid for certain types of data. For example, you cannot

             declare an external variable with the register keyword, and you

             cannot declare an automatic (local) variable with the __chip,

             __near, or __far keywords. Your code attempted to use a storage

             class keyword incorrectly. This error often occurs because of previous

             errors.

 

  Error 60:  incompatible struct, union or array types

 

             Incompatible structure, union, or array types were used in an

             expression.

 

 

             struct A {int x;}   a;

             struct B {double d;} b;

             a = b;  /* Error 60 */

 

 

  Error 61: undefined struct/union tag "tag-name"

 

            Your code has used a structure or union tag that has not been declared.

            Check for misspelled structure names. You may want to compile your

            program with the pponly option or the list option and look at the

            output produced.

 

Warning 62: constant number out of range for type "type"

            Valid range is low to high


 

                                                    Error and Warning Messages 219

 

 

 

 

              The constant value indicated is not in the range of possible values for

              the type to which the value is being assigned. This message may occur if

              you are assigning a hexadecimal constant with the uppermost bit set to

              a signed variable. By definition, a hexadecimal constant is a positive

              value; therefore, the assignment to the variable reinterprets the constant

              as a negative number. For example, the following lines generate

              warning 62:

 

 

                  signed char c = 0x80;    /* Warning 62 */

                  short s = 100000;        /* Warning 62 */

                  unsigned short uc = -1   /* Warning 62 */

 

 

              Unless you use the unschar compiler option, variables of type char

              are signed and produce this warning if you assign any constant to them

              with the high bit set (that is, any value between 128 and 255.) You can

              suppress this warning for a specific case by casting the constant to the

              appropriate type.

 

                Out-of-range constants can cause problems in your code that are hard

              to debug. For example, the following code does not behave as intended:

 

 

                  int i = 1xff;

                  signed char c = 1xff;  /* Warning 62 */

                  if(i == c)

                  {

                     /* Not executed */

                  }

 

 

              The constant initializer Oxf f is the decimal number 255. When

              assigned to the integer variable i, this value is preserved, and i gets

              the value 255. When assigned to the signed character variable c, the

              value of c becomes -1 because a signed character cannot represent

              numbers higher than 127, and the constant Oxf f overflows. Therefore,

              the comparison in the if statement results in the value false.

 

Warning 63:  item "name" already declared

            See line number file "filename"

 

              The named item was previously declared at the cited location. This

              warning is produced when two different members of the same

              structure, union, or enum are given the same name.


 

220 Appendix 2

 

 

 

 

  Error 64: structure contains no members

 

            A structure declaration did not contain any members. This error can be

            produced by errors encountered during the structure's declaration.

            Fixing a previous error may eliminate this message.

 

  Error 65: invalid function definition

 

            Your code tried to define a function body inside another function body,

            inside a structure declaration, or inside a list of static initializers. This

            message may be produced incorrectly because of errors in previous

            statements.

 

Warning 66: invalid array limit expression

 

            The expression defining the size of the subscript in an array declaration

            did not evaluate to a positive integral constant. For example:

 

 

                         int x[10.7];

 

 

  Error 67: illegal object

 

            Your code attempted to define an illegal item. For example, you may be

            declaring an array of functions (instead of an array of function pointers)

            or a function that returns an array (instead of a function that returns a

            pointer). This message can also be produced if you attempt to define a

            variable with the same name as a keyword. For example, the following

            code generates error 67:

 

 

                         int break;  /* Error 67 */

                         long while; /* Error 67 */

  Error 68: illegal object for structure

 

            A structure (or union) included a function as a member. You cannot

            include a function as a member of a structure or union, although you

            can include a function pointer.

 

  Error 69: struct name includes instance of self

 

            The named structure or union contains an instance of itself. Although it

            is legal for a structure or union to include a pointer to its own type, the

            structure or union cannot contain an instance of itself. If the structure


           

                                               Error and Warning Messages 221

 

 

 

 

                or union does not have a name, the name field is not printed in the

                message. For example, the following code generates error 69:

 

 

                   struct FOO

                   {

                     int a, b, c;

                     struct FOO x;  /* Error 69 */

                   };

 

Warning 70: unrecognized escape sequence

 

            By default, this message is suppressed, but you can enable it with the

            strict, ansi, or warn=70 options. Escape sequences in string and

            character constants begin with a backslash (\) and contain one or more

            characters after the backslash. The ANSI Standard defines some escape

            sequences and reserves others for future expansion and for

            implementation-defined extensions. The SAS/C Compiler ignores the

            backslash on any such undefined escape sequences. Other compilers

            may take different action. For example, the following line prints the

            character q followed by a newline (\n) to stdout:

 

                   printf("\q\n");  /* Warning 70 */

 

 

            Other ANSI-conforming compilers may substitute any other character for

            the \q escape sequence.

 

  Error 71: formal declaration error "name"

 

            A variable was declared before the left curly brace of in an old-style

            function definition, but the variable did not appear in the list of

            identifiers in parentheses following the function name. For example, the

            declaration of j in the following code generates error 71:

 

 

                   int func(i)

                   int i;

                   int j;  /* Error 71 */

                   {

                   }

 

 

 

            You may have misspelled one of your formal parameters or forgotten to

            add the parameter to the parameter list.


 

222 Appendix 2

 

 

 

 

  Error 72: conflict with previous declaration

            See line number file "filename"

 

            A variable or function was declared that conflicts with a previous

            declaration for the variable or function in the same scope. The message

            indicates the filename and line number of the original declaration. If no

            prototype exists for a function, the first use of that function implicitly

            declares the function as returning an int. If the actual definition of the

            function follows the first use of the function and declares a different

            return type, the compiler produces this message. This message may be

            produced incorrectly if you forget to declare a variable in an earlier

            location and, therefore, received a previous error message about an

            undefined identifier with the same name. Fixing the previous error may

            eliminate this message.

 

Warning 73: declaration expected

 

            The compiler expected to find the declaration of a data object or

            function but did not. This message can also occur if you enter too many

            or too few curly braces. This message may be produced incorrectly

            because of errors in previous statements. Fixing the previous errors

            may eliminate this message.

 

Warning 74: initializer data truncated

 

            A static initializer expression contained more elements than the data

            item being initialized, as in the following example:

 

 

                 char b[3] = "abcd"; /* Warning 74 */

 

 

            String constants always have an implied NULL byte at the end. This byte

            is not counted when producing this warning. If you have a character

            array with three elements, you may initialize it as follows:

 

 

                          char b[3] = "abc";


 

                                                  Error and Warning Messages 223

 

 

 

 

           The three elements receive the values a, b, and c. If there is room, the

           NULL terminator byte is also copied:

 

 

               char c[4] = "abc";

 

 

           The elements of the above array are assigned the values a, b, c, and \0.

 Error 75: invalid sizeof expression

 

           The expression passed to the sizeof operator was invalid. This

           message may be produced if an attempt is made to take the size of a

           function, bitfield, or incomplete type, or if the result of the expression

           used is of type void. For example, in the following code, a is an

           incomplete type because its size is not specified when it is declared:

 

 

               extern int a[];

               int i;

 

               i = sizeof(a);  /* Error 75 */

               Error 76: left brace expected

 

           The compiler expected but did not find an opening left brace. For

           example, you may have omitted the opening brace on a list of initializer

           expressions for an aggregate.

 

Error 77: identifier expected

 

           The compiler expected to find the name of an identifier to be declared.

           The compiler may generate this message if the prefixes to an identifier

           in a declaration (parentheses and asterisks) are incorrectly specified or

           if a sequence of declarations is listed incorrectly, as in the following

           example:

 

 

               int ;  /* Error 77 */

 

 

Error 78: undefined statement label "name"

 

           A goto statement referred to the named label, but the label does not

           exist in the function that referred to it. Check the spelling of your label

           and the goto reference. Make sure the label is in the same function as

           the goto statement.


 

224 Appendix 2

 

 

 

 

Warning 79: duplicate of enumeration value

            See line line file "file"

 

            When declaring an enumeration type, more than one enumeration

            constant was assigned the same value, as in the following example:

 

 

                enum COLORS

                (RED=1, BLUE=2, GREEN=1);  /* RED and GREEN are identical */

 

 

            Any enumeration constants that are not assigned an explicit value are

            assigned values one higher than the previous constant in that

            enumeration. If the constant is the first constant in that enumeration, it is

            assigned the value zero. Therefore, the following enum generates

            warning 79:

 

 

                enum COLORS (RED, BLUE, GREEN=1);  /* Warning 79 */

 

 

            RED is the first constant, so it is assigned a value of 0. BLUE is assigned

            a value of 1. GREEN is explicitly assigned a value of 1, which conflicts

            with BLUE.


 

                                                     Error and Warning Messages 225

 

 

 

 

Warning 80: invalid bit field or misplaced ':'

 

            This warning is commonly produced if you type a colon (:) when a

            semicolon (;) was expected. This warning can also be produced if you

            are actually declaring a bitfield and give an improper expression for the

            number of bits in the bitfield.

 

  Error 81: preprocessor symbol loop; macro expansion too long

            or circular

 

            When using the oldpp compiler option, a preprocessor symbol

            expanded to a value that contains a circular reference back to the

            symbol itself, thereby creating an infinite loop in the preprocessor.

            Check the definition of the macro being expanded on the line in

            question. This message cannot occur if the oldpp compiler option is

            not used because the ANSI Standard prohibits the expansion of

            preprocessor macros that occur as a result of expanding a previous

            instance of the same macro.

 

  Error 82: maximum object/storage size exceeded

 

            Your code attempted to declare a data item that exceeded the maximum

            size of objects in its storage class, or the last object declared caused the

            total size of declared objects in that storage class to exceed the

            maximum, as in the following example:

 

 

                char __near a[30000];

                char __near b[30000];

                char __near c[30000];

 

 

            Because there is a limit of 32767 bytes on the amount of near data

            allowed, the above request for 90000 bytes of near data will not work. If

            you are compiling with data=near (the default), the __near keyword

            is implied on all data items. Fix this warning by declaring some large

            data items with the __far keyword or by compiling with the data=far

            option.


 

226 Appendix 2

 

 

 

 

Warning 83: reference beyond object size

 

            Your code used an address beyond the size of the object used as the

            base for the address calculation. This warning usually occurs when you

            refer to an element beyond the end of an array, as follows:

 

 

              char c[10];

              void myfunc(void)

              {

                c[11] = 0;  /* Warning 83 ~/

              }

 

            This message can be produced only when the compiler can determine the

            value of the subscript at compile time, that is, the subscript is a constant.

                   

Warning 84: redefinition of pragma or preprocessor symbol

            "name"

            See line number file "filename"

 

            Your code is redefining the preprocessor symbol or #pragma originally

            defined at the indicated file and line number.

 

Warning 85: return value mismatch for function "name"

            Expecting "typel", found "type2"

 

            The expression specifying the value to be returned from a function was

            not the same type as the function itself. If possible, the value specified is

            converted to the appropriate type. You can suppress this warning by

            casting the return expression to the appropriate type.

 

              Some pre-ANSI C code produces many of these warnings when

            functions declared as int (either explicitly or implicitly) do not return

            a value. Before the ANSI committee approved the void keyword,

            declaring functions as returning an int was the correct way to handle

            functions that returned nothing. You can compile with the

            nowarnvoidreturn option to suppress these warnings when a

            function that is declared as returning an int actually returns nothing.

 

              For example, the following two functions generate warning 85:

 

 

                          functionl (x)

                          int x;

                          {

                          }  /~ Warning 85 ~/

 

 

                          int function2(x)

                          int x;


 

                                                     Error and Warning Messages 227

 

 

 

 

 

                   { 

                     char *p = NULL;

                     return(p);  /* Warning 85 */

                   }

 

 

             You can suppress the warning 85 for functionl by compiling with the

             nowvret option. The nowvret option does not affect function2,

             which is attempting to return a pointer from a function declared as

             returning int.

Warning 86: formal parameters conflict with prototype

            See line number file "filename"

 

             The types of the parameters to the function do not match the types

             given in the prototype for the function. Check the prototype at the file

             and line indicated against your definition.

 

Warning 87: argument count incorrect, expecting number

            arguments

            See line number file "filename"

 

             Your code invoked a function with an incorrect number of arguments,

             according to that function's prototype. Check the prototype at the

             indicated file and line number against your usage of the function and

             the actual function definition.

 

Warning 88: argument type incorrect

            Expecting "type 1", found "type2"

 

             Your code invoked a function with an argument whose type conflicts

             with the corresponding parameter as declared in the function's

             prototype. The type of the argument expected is given as type 1, and

             the type of the argument actually provided is type2. If possible, the

             argument is converted to the appropriate type as if it were cast to that

             type. If the argument cannot be converted, an error message is

             produced.


 

228 Appendix 2

 

 

 

 

Warning 89: constant converted from "type1" to "type2"

 

            Your code supplied a constant that conflicted with the expected type.

            The constant was converted, but the conversion may have caused a loss

            of precision or lost values. For example, in the following code, the

            prototype for the function f oo specifies an int, but the function is

            passed a double constant:

           

               void foo(int);

            

               void myfunc(void)

               {

                 foo(l0.67);  /* Warning 89 */

               }

 

            The double constant is converted to an integer, resulting in an integer

            argument of 10, and the compiler generates warning 89 to inform you of

            the conversion.

  Error 90: invalid argument type specifier

 

            An error was made in declaring an argument in a function or prototype

            declaration. For example, the following declaration does not specify a

            type for the parameter y. For example:

 

 

               void foo(int x, y)  /* Error 90 */

               {

               }

 

  Error 91: illegal void operand

 

            One of the operands in an expression was of type void. The void type

            represents no value and is, therefore, illegal in most expressions.

 

Warning 92: statement has no effect

 

            An expression statement did not produce an assignment, function call,

            or other action. Such a statement serves no useful purpose and can be

            eliminated. This warning is often generated when a typographical error

            has been made in coding the statement. For example, you might enter


 

                                                     Error and Warning Messages 229

 

 

 

 

            the equality (==) operator when you intended to enter the assignment (=)

            operator:

 

 

                  int i;

                  i == 5;  /* Warning 92 */

 

 

                  In this example, the user intended to assign the value 5 to the integer

                variable i, but because of the extra equals sign, the statement does

                nothing.

Warning 93: no reference to identifier "name"

 

                Your code declared an automatic (local) variable but never used the

                variable. However, the variable might be used by code that has been

                excluded from the object module with #if or #ifdef statements.

 

Warning 94: uninitialized auto variable "name"

 

                An automatic (local) variable was used in an expression before it was

                given a value. Automatic variables are not guaranteed to have any

                specific value when a function is entered, so an uninitialized automatic

                variable can create seemingly random bugs. It is possible for this

                warning to not be produced when appropriate or to be produced

                incorrectly because the compiler does not check all possible execution

                paths. In rare cases, the message is produced incorrectly if the variable

                is used in a loop construct and initialized later in the same loop

                construct, as shown:

 

 

                   void myfunc(void)

                   {

 

                     int i, j;

                     for(i=0; i<10; i++)

 

                     {

                         if(i > 0) printf("%d\n", j);  /* Warning 94 */

                         j = i;

                     }

                   }

 

                Without doing detailed loop analysis, the compiler cannot tell that j is

                not referenced by the call to printf until after it is initialized.


 

230 Appendix 2

 

 

 

 

              Some cases that use uninitialized variables may not produce the

            warning. For example, no warning is produced for the following code

            even though j is not initialized if x is greater than S:

 

 

                void myfUnc(int x)

                {

                  int j;

                  if(Y < 5) j = X;

                  if(j < 5)  /* j might be uninitialized */

                  {

                    ...

                  }

                }

 

warning 95: unrecognized #pragma operand

 

            The keyword following a #pragma statement was not recognized as a

            SAS/C pragma keyword. Version 6 of the SAS/C Compiler supports the

            libcall, flibcall, syscall, tagcall, andmsg #pragmas.

 

  Error 96: missing name for #pragma

 

            In a libcall, flibcall, syscall, or tagcall #pragma

            statement, the name of the routine to be called was omitted or

            incorrect.

 

  Error 97: bad library base for #pragma

 

            In a libcall, flibcall, or tagcall #pragma statement, the

            library base was omitted or incorrect.

 

  Error 98: invalid data for #pragma

 

            In a libcall, flibcall, syscall, or tagcall #pragma

            statement, the offset or magic number fields were invalid. In a #pragma

            msg statement, a syntax error was made specifying the message number

            or the action to be taken.

 

  Error 99: attempt to change a const lvalue

 

            Your code attempted to modify a variable declared with the const

            keyword. Variables declared with the const keyword are read-only and

            cannot be modified.


 

                                                      Error and Warning Messages 231

 

 

 

 

Warning 100: no prototype declared for function "name"

 

             Your code called the named function, but the compiler did not find a

             prototype for that function. Without a prototype, the compiler cannot

             perform parameter type checking. Remember, a function that takes no

             parameters still needs a prototype with void as its parameter list:

 

 

                   int func(void);  /* "func" returns "int" and takes no parms */

 

 

             If the function is a SAS/C function, the SAS/C Development System

             Librar,v Reference tells you which header file to #include to get the

             correct definition for the function. If the function is an AmigaDOS

             function, its prototype is in the include: clib directory in the file for

             its library. For more information, you can refer to the Amiga ROM Kernel

             Reference Manual: Libraries, 3rd Edition (Commodore-Amiga, Inc. 1992)

             or use the grep command to search the header file in the

             include: clib directory for the prototype.

  Error 101: redundant keywords in declaration

 

             The same storage class keyword was specified multiple times when

             declaring a variable, function, or prototype. For example, you may have

             specified the const or __chip keyword twice.

 

               However, you can specify a typedef with a storage class keyword.

             Any variables declared with this typedef are automatically assigned to

             that specified storage class. Therefore, you may get an error 101 for

             specifying the keyword explicitly on a variable declared with the

             typedef, as in the following example:

 

 

                   typedef int __far farint;

                   farint x;  /* Declares a far integer called "x" */

                   farint __far y;  /* Error 101 */

  Error 102: conflicting keywords in declaration

 

             You have specified two mutually incompatible storage class keywords

             when declaring a variable, function, or prototype. For example, you

             may have specified the __near and __far keywords on a variable

             definition.

 

               However, you can specify a typedef with a storage class keyword.

             Any variables declared with this typedef are automatically assigned to

             that specified storage class. Therefore, you may get an error 102 for


 

232 Appendix 2

 

 

 

 

             specifying a keyword explicitly on a variable which conflicts with the

             keyword declared with the typedef, as in the following example:

 

 

                typedef int __far farint;

                farint x;  /* Declares a far integer called "x" */

                farint __near y;  /* Error 102 */

 

 

Warning 103: uninitialized constant "[name]"

 

             The named variable was declared const, indicating that the variable is

             read-only, but you have not initialized the variable. If the variable is

             declared static or extern, it is initialized to zero for you but is

             probably not useful unless explicitly initialized.

 

Warning 104: conversion from pointer to const/volatile to

             pointer to non-const/volatile

 

             A pointer to a const or volatile object is being converted to a

             pointer to a normal object. For example, you may be passing the

             address of a const variable to a function that takes a normal pointer.

             After the pointer has been converted, the const or volatile

             attribute is lost. Therefore, your const data might get modified, or

             your volatile data might be kept in a register.


 

                                     Error and Warning Messages 233

 

 

 

 

  In the following example, warning 104 is produced when the function

foo is called with the const array data as an argument.

 

void foo(char *);

 

void myfunc(void)

{

      const char data [] = "Hello, World!\n";

      foo(data);  /* Warning 104 */

      printf("%s\n", data);

 

}

 

void foo(char *p)

{

      P[1] = 'a';

}

 

 

The function foo actually modifies its data by writing to it. Therefore,

printf prints the value Hallo, World! instead of Hello, World !

because the constant array has been modified.

 

234 Appendix 2

 

 

 

 

Warning 105: module does not define any externally-known symbols

 

             The C source file and all of its included headers were compiled, but no

             externally-visible functions or data items were defined. In this case, a

             valid object file is produced, but it contains nothing that can be

             accessed, and the file can removed from your link step if you desire.

 

  Error 106: postfix expression not allowed on a constant

 

             Your code attempted to apply a postfix ++ or--operator to a constant.

             This message may be generated because of an incorrect macro

             expansion. You can use the pponly option to generate a preprocessed

             file and check the macro expansion.

 

  Error 107: too many initializers

 

             A data item was being initialized, but too many initializer elements were

             provided, as in the following example:

            

                     struct FOO

                     {

                        int i, j;

                     };

 

 

                     struct FOO foo = {10, 20, 30};  /* Error 107 */

 

Warning 108: zero-length arrays are not an ANSI feature

 

             This message is suppressed by default, but you can enable it with the

             strict, ansi, or warn= 108 options. You have declared an array of

             size zero, probably as a member of a structure to allow variable-sized

             structures. While using zero-length arrays is a common extension to the

             ANSI Standard and is supported by the SAS/C Compiler, the ANSI

             Standard does not allow the use of zero-length arrays.

 

  Error 109: invalid use of type name or keyword

 

             A type name (possibly a typedef) has been encountered where it was

             not expected. You may have attempted to declare a variable with the

             same name as a keyword.


 

                                                      Error and Warning Messages 235

 

 

 

 

Warning 110: enum constant expression is wrong type

             Expecting "type1", found "type2"

 

              An enumeration constant value was explicitly assigned that did not

              match the type of the enum being declared. For example, specifying a

              double constant when defining an enum or specifying a long constant

              when the shortint option is active will generate this message.

              Example:

 

 

                  enum COLORS { RED=1.0 }; /* Warning 110 */

 

 

Warning 111: non-portable enum type specified

 

              This message is suppressed by default, but you can enable it with the

              strict, ansi, or warn= 111 options. As an extension to the ANSI

              Standard, the SAS/C Compiler supports short, char, and long

              enum types with the syntax short enum, char enum, and long

              enum. To improve the portability of your code, enable this warning.

 

Warning 114: negative shift or shift too big for type

             shifts for type "type" must be between O and nUmber

             bits

 

              Your code attempted to shift an integral value by a constant number of

              bits, but the constant was either negative or higher than the number of

              bits in the value being shifted, as shown in the following examples:

 

 

                    int i = l;

                    i = i >> 33;  /* Warning 114 */

                    i = i << -l;  /* Warning 114 */

 

 

              In the first example, i is 32 bits (an int) but is being shifted 33 bits.

              Shifting a value by a number of bits higher than the number of bits in

              the value generates a zero for the result. In the second example, i is

              being shifted by a negative number of bits. Attempting to shift a value

              by a negative number of bits usually generates a zero for the result

              (although this result is undefined by the ANSI Standard).

 

   Error 115: enum constant value "number~ out of range for enum

              type

 

              Your code specified a value for an enum constant while defining an

              enumerated type which is out of range for the type of enum being

              declared. Remember that enum constants that are not explicitly assigned

              a numerical value are given the value of the previous constant defined


 

236 Appendix 2

 

 

 

 

              in the same enum incremented by one. This increment might place the

              constant's value out of the acceptable range, as in the following example:

 

 

                char enum COLORS

                {

                    RED=254,   /* Numeric value is 254         */

                    GREEN,     /* Numeric value is 255 (254+1) */

                    BLUE       /* Numeric value is 256 - too big for char */

                };             /* Error 115 is issued */

 

 

              The enum constant RED is assigned a value of 254. GREEN does not

              have an explicit value, so it is assigned 254+1, or 255. BLUE does not

              have an explicit value, so its value would normally be 255+1, or 256.

              However, the enum is declared as being a char enum, so 256 is too

              big and error 115 is issued.

 

Warning 116: undefined enum tag "name"

 

             A reference was made to an enum that has not yet been declared. The

             compiler may generate this message as a warning if only a pointer to

             the enum is used, but the compiler generates this message as an error if

             any other use is made of the enum.

 

  Error 117: enum contains no members

 

             An attempt was made to define an enumerated type, but no member

             names were specified. Use the pponly option to generate a

             preprocessed file if you have problems eliminating this message.

 

  Error 118: conflicting use of enum/struct/union tag "name"

 

             An attempt was made to define an enum, struct, or union that has

             the same name as a previously defined enum, struct, or union in

             the same scope. You cannot define an enum with the same name as a

             struct, union, or another enum.


 

                                                      Error and Warning Messages 237

 

 

 

 

  Error 119:  identifiers missing from definition of function

              "name"

 

              A prototype-style function definition was encountered, but the names of

              the parameters were missing. You can omit the parameter names from a

              prototype, but the names must be present in the actual function

              definition. For example the following code generates error 119:

 

 

                   void func(int, int, double);  /* Legal prototype */

 

 

                   void func(int, int, double)   /* Illegal function definition */

                   {                             /* Error 119 */

                   }

 

 

 

Warning 120: Integral type mismatch: possible portability

             problem

             Expecting "type1", found "type2"

 

              This message is suppressed by default, but you can enable it with the

              strict or warn=120 options. The wrong integral type was passed as

              a parameter. This error may be a problem on another compiler or

              another type of computer if the size of an int is different from the size

              of an int on the Amiga computer. This warning is not a problem if

              your code needs to run with the SAS/C Compiler only.

 

                In the following example, the SAS/C Compiler promotes the short

              integer to a long integer even if you compile with the shortint

              option:

 

 

                   #pragma msg 120 warn

                   void func(long);

                  

                   void main(void)

                   {

                      short s = 10;

                      func(s);      /* Warning 120 */

                   }

 

              However, pre-ANSI compilers on machines that define the int type to

              be the same as short may not perform the conversion or may perform

              the conversion and issue a warning message. In addition, if you remove

              the prototype, this code will not work on any machine where int is the

              same as short.


 

238 Appendix 2

 

 

 

 

Warning 121: hex/octal constant "constant" too large for char

             High bits may be lost

 

             Warning 121 is generated if a hexadecimal or octal constant specifies

             more digits than will fit into a single char.

 

               According to the ANSI Standard, hexadecimal bytes may be specified

             in a quoted string using the \xhh escape sequence. The ANSI Standard

             also states that the escape sequence consumes all valid hexadecimal

             characters in the string following the \x, even if all the characters

             consumed will not fit into a single byte, which may not be what you

             want. For example, in the case of \xabcdefgh, you may want the

             character 0xab first, followed by the string cdefgh. According to the

             ANSI Standard, this escape sequence evaluates to the character Oxef

             followed by the string gh, because the \x consumes all valid

             hexadecimal characters. A single byte cannot hold the hexadecimal

             number 0xabcdef, so the top bits are lost and 0xef is the result. The

             best way to get the character 0xab followed by the string cdefgh is to

             use ANSI string concatenation to terminate the escape sequence:

             \xab cdefgh. The two strings are concatenated to form the desired

             sequence.

 

Warning 122: missing ellipsis

 

             A function or function prototype was encountered that attempted to

             specify variable arguments with a trailing comma in the argument list.

             According to the ANSI Standard, variable arguments must be specified

             by a trailing comma followed by an ellipsis (...). The SAS/C Compiler

             accepts the form without the ellipsis as if the ellipsis had been specified,

             but other ANSI conforming compilers may require the ellipsis, as in the

             following example:

 

 

                      void foo(int x, ... );  /* Right */

                      void bar(int x, );      /* Wrong */

 

 

Warning 123: no tag defined for enumeration

             Cannot construct prototype

 

             The genproto option was active, but a prototype could not be

             generated for a function because an enum was used as a parameter to

             the function and that enum had no tag, as shown in the following

             example.

 

 

               void myfunc(colors)

               enum (RED, GREEN, BLUE) colors;

               {

               }


 

                                                      Error and Warning Messages 239

 

 

 

 

            The tag is the name normally appearing immediately after the keyword

            enum in the enum declaration. This message is produced only if the

            genproto compiler option is used to produce prototypes.

Error 125:  invalid number

 

            The numerical constant specified cannot be represented on the Amiga

            computer. The constant is probably an integer that is too large or too

            small (negative) to be represented in four bytes. This error can also be

            produced if a floating-point number is specified incorrectly or if invalid

            digits are provided to an octal constant.

 

            The following lines all produce error 125:

 

 

                   double d = 10.3.2;          /* Error 125 */

                   int i = 123456789123456789; /* Error 125 */

                   int j = 099;                /* Error 125 */

 

 

            In the first line, the value assigned to the floating-point variable has been

            incorrectly specified. In the second line, the value contains too many

            digits to fit into an int. In the third line, the value begins with a zero,

            which makes the value an octal constant, but it contains the digit 9,

            which is invalid for octal constants.

Warning 126:  #endif, #else, or #elif out of order

 

            A #endif, #else, or #elif was encountered but no #if or #ifdef

            was active.

 

  Error 127: operand to # operator must be a macro argument

 

            If a preprocessor macro parameter is preceded with the # operator, that

            parameter is replaced with the literal string consisting of the

            corresponding argument to the macro. For example, if you pass the

            argument FOO to a macro, and that argument in the macro definition is

            preceded by the # operator, that argument expands to the string

            "FOO". The # operator can be applied only to macro arguments.

 

  Error 128:  text-from-#error

 

            This message is the result of a #error preprocessor directive in the

            source code being compiled. The text of the message is taken from the

            #error line.

 

  Error 129: ambiguous struct or union member "name"

 

            Your code referred to a structure or union member that did not exist.

            In an attempt to resolve the name, the compiler examined the names of

            all members of substructures or subunions. Two or more members of

            subaggregates matched the name you provided, so the compiler was

            unable to determine which member you intended to specify.


 

240 Appendix 2

 

 

 

 

            Suppose you have the following code:

            

            void main(void)

            {

              struct FOO

              {

                int x, y, z;

              };

 

              struct BAR

            {

                int a, b, x;

              };

 

              struct COMBO

              {

                struct FOO foo;

                struct BAR bar;

              }

              combo.a = 10; /*Warning 193*/

              combo.x = 10; /*Error 129*/

            }

 

            The reference to combo.a succeeds, although it generates a warning

            193 (implicit reference to structure member), because the

            full reference should be combo.bar.a. The reference to combo.x

            generates error 129, because both substructures of combo contain a

            member called x. The compiler cannot tell whether you mean

            combo.foo.x or combo.bar.x, so it issues the error message 129.

 

              See Chapter 11, "Using Amiga Specific Features of the SAS/C

            Language," for more information on implicit structure references.

 

  Error l31: maximum temporary or formal storage exceeded

 

            The compiler must allocate stack storage to allow you to pass and

            receive structures or other parameters to and from functions.

            Parameters are copied onto the stack for each function call, so if you

            are passing large structures, your code will run very slowly. Consider

            passing a pointer to your structure instead of the entire structure.


 

                                                      Error and Warning Messages 241

 

 

 

 

Warning 132: extra tokens after valid preprocessor directive

 

               The ANSI Standard does not allow extra text on a preprocessor line,

               but this extra text may be allowed by some C compilers. For example,

               many programmers put a descriptive word after a #endif directive

               indicating the #if to which the #endif belongs. To make your code

               ANSI-compatible, you should place such descriptive words in comments,

               as shown in the following example:

 

 

                    #ifdef SOMETHING

                    #endif SOMETHING /* Warning 132 */

 

 

                    #ifdef SOMETHING

                    #endif /* SOMETHING */  /* No warning */

                   

  Error 133: cannot redefine macro "name"

 

             An attempt was made to redefine a built-in preprocessor macro, like

             __FILE__ or __LINE__ You cannot redefine built-in preprocessor

             macros.

 

Warning 134: too many arguments

 

             A macro definition was encountered with more than the allowable

             number of arguments. The current ANSI limit for macro arguments is

             31, and the SAS/C Compiler does not allow more than 31 arguments. If

             message 134 is issued, the macro is not successfully defined. Any use of

             the macro in your code produces a warning for a function with no

             prototype and possibly a linker error when the name of the macro

             cannot be resolved by the linker.

 

  Error 135: argument count incorrect for macro "name",

             expecting number arguments

             See line number file "filename"

 

             Your code invoked a macro with too few or too many arguments. The

             macro is defined at the specified file and line number.

 

  Error 136: invalid use of register keyword

 

             Your code used one of the register keywords inappropriately. The

             register keywords are register, __a0, __d0, __a1, __d1, and so

             on.


 

242 Appendix 2

 

 

 

 

Warning 137: ANSI limits #line numbers to between 1 and 32767

 

             This message is suppressed by default, but you can enable it with the

             strict, ansi, or warn=137 options. The ANSI Standard states that

             line numbers specified with a #line directive should be between 1 and

             32767. However, the SAS/C Compiler accepts any number that will fit

             into a signed four-byte integer.

 

  Error 138: operation invalid for pointer to void

 

             Your code attempted to perform an operation on a void * pointer that

             is not valid for void *. Such operations include addition, subtraction,

             array indexing, and dereferencing (unary * operator). For example, the

             following code attempts to perform addition on a void * pointer:

            

                    void *p = NULL;

                    p = p + 1;  /* Error 138 */

 

 

Warning 139: missing #endif

             See line number file "filename"

 

             The compiler encountered an #if, #ifdef, or #elif statement for

             which there is no matching #endif. The file and line number of the

             unmatched directive is specified in the message. This message occurs

             only at the end of the source file, so large portions of your program

             may have been ignored because of a stray #if or #ifndef with no

             matching #endif.

 

Warning 140: sizeof operator used on array that has been

             converted to pointer

 

             Use of the sizeof operator on an array name gives the size of the

             array. However, if the array name has been converted (cast) to a

             pointer, the resulting size is the size of the pointer (4 bytes), not the

             size of the array. Almost any use of an array name in an expression

             implicitly casts the array name to pointer. To determine the actual size

             of the array, pass only the array name to the sizeof operator.


 

                                                      Error and Warning Messages 243

 

 

 

 

               In the following example, in the first assignment statement, i gets the

             value 4 (the size of a pointer to a character). In the second assignment

             statement, i gets the value 10.

 

 

                   char ary[10];

                   int i;

 

 

                   i = sizeof(ary+1);  /* Warning 140 */

                   i = sizeof(ary);

  Error 142: array size never given for "name"

 

             You can declare an array as extern and not specify the first subscript.

             However, when you define the array, you must specify the subscript.

             Storage is allocated when you define an array, not when you declare an

             array as extern. For example:

 

                 extern char ary1[][10];  /* Legal */

                 char ary2[][10];         /* Error 142 */

 

  Error 143: object has no address

 

             An attempt was made to take the address of something that has no

             address. You may be attempting to take the address of a register

             variable or an expression.

 

Warning 146: case value out of range for switch type

 

             A case value was specified in a switch statement that can never be

             taken. For example, if you compile with the shortint option and a

             switch statement is switching on a short or int value, case values

             too big to be stored in 16 bits will generate this warning:

 

 

                      /* The SHORTINT compiler option is on. */

                   int i = 10;

                   switch(i)  /* i is a 16-bit integer */

                   {

                     case 0x08000000:   /* Warning 146 */

                         break;

 

                     case 65000:        /* Warning 146 */

                         break;

                   }


 

244 Appendix 2

 

 

 

 

Warning 147: conversion between function and data pointers

 

             Your code has cast or otherwise converted a pointer that points to a

             function to a pointer that points to data. The ANSI Standard states that

             this conversion is not legal. This conversion works with the SAS/C

             Compiler in most circumstances, but you should use the

             absfuncpointer compiler option if your code is larger than 32K.

 

Warning 148: use of incomplete struct/union/enum tag "name"

             See line number file filename

 

             This message is suppressed by default, but you can enable it with the

             warn= 148 option. An incomplete tag is one for which no definition has

             been seen. The ANSI Standard allows use of an incomplete tag (for

             declaring pointers, for example). If you want to know when an

             incomplete tag is being used, enable this warning. You may also want to

             enable warning 149.

 

Warning 149: incomplete struct/union/enum tag in prototype scope

             "name"

 

             This message is suppressed by default, but you can enable it with the

             strict or warn= 149 options. An incomplete tag was discovered in a

             prototype. An incomplete tag is one for which no definition has been

             seen. The ANSI Standard requires the incomplete tag's scope to end at

             the end of the prototype. Therefore, any definition of the function later,

             even if the tag in question has been defined, may generate an error

             message and terminate the compilation. You may want to turn on

             warning 148 for the most information about incomplete tags. If you do

             not want to see all the incomplete tag information, you identify most

             problem cases by enabling only warning 149.

 

               The following function definition produces an error on many ANSI-

             conforming compilers because the structure FOO referred to in the

             definition is considered to be a different structure FOO than the one

             referred to in the prototype.


 

                                                      Error and Warning Messages 245

 

 

 

 

                   void func(struct FOO *);  /* Warning 149 */

 

                   struct FOO

                   {

                     int x, y, z;

                   };

 

 

                      /* Many compilers issue an error here. */

                    void func(struct FOO *foo)

                    {

                    }

 

 

             This error could be fixed by moving the definition for the structure FOO

             before the prototype.

Warning 150: the keyword "name" is meaningless for itemtype

 

             When declaring a function or data item, you have used a keyword that

             is meaningless for that type of item. For example, you cannot specify

             the following:

 

 

                      void __chip foo(int);  /* Warning 150 */

 

 

             It is meaningless to say that a function is to be allocated in _ _ chip

             memory.

               The __near and __far storage class keywords are valid on both

             functions and data items, but have slightly different meanings. See the

             descriptions of the data=near and code=near options in Chapter 8,

             "Compiling and Linking Your Program," for more information.

 

               Some keywords that are valid on functions are also valid on data

             items because the data items may be pointers to functions of the

             designated type. For example, you may have a function that returns a

             pointer to a __regargs function. Keywords in this category include

             __stdargs, __regargs, __asm, and __interrupt.

 

               Other keywords need to be present only on the function definition.

             You do not need to add them to function pointers and function

             prototypes. Keywords in this category include __stackext and

             __saveds. If these keywords appear on a data item, warning 150 is

             generated and the extra keyword is ignored.

 

               For more information on specifying keywords, see Chapter 11, "Using

             Amiga Specific Features of the SAS/C Language."


 

246 Appendix 2

 

 

 

 

  Error 152: cannot define function via typedef name

 

             Your code attempted to define a function using a typedef, as shown

             below:

 

 

                         typedef int foo(int);

 

                         foo bar  /* Error 152 */

                         {

                         }

 

 

 

             According to the ANSI Standard, you cannot define a function using a

             typedef. The SAS/C Compiler does not accept such a definition.

Warning 154: no prototype declared for function pointer

 

             Function pointers require prototypes just like functions. To declare a

             prototype for a function pointer, enter the parameter list instead of the

             empty parentheses in the definition, as shown in the following example:

 

 

                     void (*func1)();  /* Warning 154 */

 

                     void (*func2)(int, double, long);  /* No warning */

 

 

             Remember that a pointer to a function that takes no parameters still

             requires a prototype:

 

                     void (*func3)(void);  /* Function pointer takes no parms */


 

                                                      Error and Warning Messages 247

 

 

 

 

Warning 155: no statement after label

 

              The C language does not allow a label immediately before the curly

              brace ending a block (}). If you enter a label in this position, the SAS/C

              Compiler generates this warning. Enter a semicolon (representing a

              NULL statement) after the label to suppress the warning, as shown in

              the following example:

 

              void funcl(void)

              {

                goto foobar;

                       /* more code */

                foobar:    /* Warning 155 */

              }

 

              void func2(void)

              {

                goto foobar;

                       /* more code */

                foobar: ;   /* No warning */

              }

 

 

 

Warning 156: operation/comparison of pointer to "int" and

             pointer to "type"

 

              This message is suppressed by default, but you can enable it with the

              warn= 156 options. If you compiled with the short int option, your

              program has used a pointer to int and a pointer to short in an

              operation. If you did not compile with the shortint option, your

              program has used a pointer to int and a pointer to long in an

              operation.


 

248 Appendix 2

 

 

 

 

               For example, the following code will work if int and long are the

             same length, but the same code will not compile if ints and longs are

             different lengths:

 

 

                             /* Assume SHORTINT is not active */

                          int *ip = NULL;

                          long *lp = NULL;

                          int diff;

                          diff = ip - lp;

 

  Error 158: invalid type name

 

             The compiler expected a type name for a cast or of f setof operation,

             but the provided name was not recognized as a valid type name. Check

             the preprocessed output to make sure you are providing the correct

             information.

 

Warning 159: use of unary minus on unsigned value

 

             This message is suppressed by default, but you can enable it with the

             strict or warn= 159 options. Your code has used the unary minus

             operator (-) on an unsigned variable. Using this operator on an

             unsigned variable may not produce the expected result because the

             result is still a non-negative number.

 

Warning 161: no prototype declared at definition for function

             "name"

 

             An old-style function definition was encountered, and no prototype was

             in scope. The prototype must appear in the C file or a header file before

             the definition of the function, or the function definition itself must be a

             prototype-style definition.

 

Warning 162: non-ANSI use of ellipsis punctuator

 

             This message is suppressed by default, but you can enable it with the

             strict, ansi, or warn=162 options. You have declared a function

             with the ellipsis punctuator (...) but the function has no arguments. The

             ANSI Standard requires functions that take a variable number of

             arguments to take at least one fixed argument.

 

Warning 163: initialization of auto struct, union, or array

 

             This message is suppressed by default, but you can enable it with the

             strict or warn=163 options. Your code has initialized an automatic

             structure, union, or array. The ANSI Standard allows you to initialize

             automatic structures, union, and arrays, but many pre-ANSI compilers

             do not.


 

                                                      Error and Warning Messages 249

 

 

 

 

Warning 164: & applied to array

 

              This message is suppressed by default, but you can enable it with the

              strict or warn= 164 options. Your code has used the address (&)

              operator on an array name. You should instead take the address of the

              first element in the array, or use the array name without the address

              operator. For example:

 

 

                   int ary[10];

                   int *iptr;

 

 

                   iptr = &ary;       /* warning 165 */

                   iptr = ary;        /* OK */

                   iptr = &ary[0];    /* OK */

 

Warning 165: use of narrow type in prototype

 

              This message is suppressed by default, but you can enable it with the

              warn = 165 option. This warning is provided for detecting situations

              that may cause problems on other compilers if your code mixes function

              prototypes and old-style function definitions. See Chapter 13, "Writing

              Portable Code," for information on using narrow types in function

              declarations. See also the descriptions of messages 176 and 179.

 

  Error 166: unrecoverable error or too many errors

             Terminating compilation

 

              Your program has exceeded the default or specified maxerr or

              maxwarn values, or an error has occurred that prevents the compiler

              from producing meaningful results.

 

                The default maximum number of errors is 50. By default, any

              number of warnings may be generated.

 

Warning 169: ineompatible operands of conditional operator (?:)

             "type1" conflicts with "type2"

 

              The operands of the ?: conditional operator must be of compatible

              types. Your code supplied types to the ?: operator that were not

              compatible. For example, the following code generates warning 169:

 

 

                    int func(void)

                    {

                      int i = 0;

                      struct FOO *foo = NULL;

                      return (int)(i > O ? foo : i);  /* Warning 169 */

                    }


 

250 Appendix 2

 

 

 

 

             The expression following the question mark (?) is of type

             struct FOO *. The expression following the colon (:) is of type int.

 

               This message can be an error if it is not possible to convert the types

             in question. This can occur if one of the types is a structure or union.

 

Warning 170: overflow during operation on constants

 

             A constant expression overflowed the limits of the type in which it was

             being calculated. Perhaps you have added or multiplied two large

             integers, thereby resulting in a number too large to represent in a four-

             byte integer.

 

Warning 176: implicitly promoted formal "name" conflicts with

             prototype

             See line number file "filename"

 

             This message is suppressed by default, but you can enable it with the

             strict, ansi, or warn= 176 options. You are defining a function

             using an old-style definition, which means that any narrow types (char,

             short, and float) in your definition are implicitly widened to their

             non-narrow equivalents (int, int, and double, respectively).

             However, a prototype is in scope that gives the narrow version of the

             type.

 

               Functions that call your function will not know that your function is

             using an old-style definition and, with some compilers, may pass an

             incorrect value. An incorrect value is never passed using the SAS/C

             Compiler on the Amiga hardware. See Chapter 13, "Writing Portable

             Code," for information on using narrow types in function declarations.

             See also the descriptions of messages 165 and 179.

 

Warning 178: indirect call without indirection operator

 

             This message is suppressed by default, but you can enable it with the

             strict or warn= 178 options. You called a function using a function

             pointer, but did not use the indirection (*) operator to dereference the

             pointer first. The SAS/C Compiler generated correct code, but on

             pre-ANSI compilers this code may not work. Example:

 

                     void (*funcptr)(int);

 

 

                     funcptr(10);  /* Warning 178 */

                     (*funcptr)(10);  /* No warning */


 

                                                      Error and Warning Messages 251

 

 

 

 

Warning 179: narrow type used in old-style definition

 

              This message is suppressed by default, but you can enable it with the

              strict or warn=179 options. Your code has used a narrow type

              (char, short, or float) in an old-style definition. See Chapter 13,

              "Writing Portable Code," for information on using narrow types in

              function declarations. See also the descriptions of messages 165 and

              176.

 

Warning 180: no space between macro name and its replacement

             list

 

              This message is suppressed by default, but you can enable it with the

              strict, ansi, or warn=180 options. Your code is defining a

              preprocessor macro that takes arguments but does not have at least one

              blank after the closing parentheses of the argument list. The ANSI

              Standard requires white space after the closing parentheses. For

              example:

 

 

                   #pragma msg 180 warn

                   #define ADD(a,b)(a+b)  /* Warning 180 */

 

 

Warning 181: "name" was declared both static and external

             See line number file "filename"

 

              Your code has declared a function as both static and external at

              different places. Both the function and its prototype must agree on

              whether the function is static.

 

Warning 182: static function "name" declared but not defined

             See line number file "filename"

 

              Your code had a prototype for a function declared static but never

              defined the function. The function definition may be hidden with # i f or

              #ifdef statements.

 

Warning 183: inline function declared but not defined

             See line number file "filename"

 

              Your code had a prototype for a function declared __inline but

              never defined the function. The function definition may be hidden with

              #if or #ifdef statements.

 

Warning 184: invalid multi-byte character constant

 

              Your code has specified a multibyte character constant (such as ~ ab ' ),

              and you did not compile your code with the mccons option; or, if you

              compiled your code with the mccons option, the multibyte character is

              larger than the permitted four bytes.


 

252 Appendix 2

 

 

 

 

  Error 185: comma expected

 

             The compiler expected a comma but did not find one. This error may be

             produced because of errors in previous statements. Fix all previous

             errors before fixing this one.

 

Warning 186:  implicit conversion between pointer and scalar

 

             Your code has converted a pointer to an integer while doing static

             initialization. You can suppress this warning by casting the pointer to

             the appropriate type.

 

Warning 187: negative value assigned to unsigned type

 

             This message is suppressed by default, but you can enable it with the

             strict or warn=187 options. Your code has assigned a negative

             constant to an unsigned variable. In doing so, your code is in effect

             assigning a very large positive number to the variable, which may or

             may not be the action you intended.

 

Warning 190:  #include ignored because header already included

             See line number file "filename"

 

             This message is suppressed by default, but you can enable it with the

             warn=190 option. The nomultipleincludes compiler option is

             active, and your code included the same header file more than once.

             The compiler ignores the additional #include statement. You can use

             this message to locate all such multiple includes if you want to modify

             your header files to not include the same file more than once.

 

               You can get even more information about which header files were

             included by using the listincludes compiler option.

 

Warning 192: wrong size for enum

 

             An enum variable was declared to be of a different type than the base

             enum was when it was defined. Suppose you have the following code:

 

 

                    char enum COLORS = (RED, GREEN, BLUE);

                    enum COLORS color;  /* Warning 192 */

                    char enum COLORS color2;      /* correct */

 

 

            The enum variable color should be declared the same size as the base

            enum type, which is char enum. The base enum type overrides the

            enum variable's type definition.


 

                                                      Error and Warning Messages 253

 

 

 

 

Warning 193: implicit reference to struct/union member

             Reference assumed to be "reference"

 

              Your code has referred to a struct or union member name that is

              actually a member of a substructure or subunion of the original. The

              compiler has searched all substructures and subunions and determined

              that exactly one member matches the name you specified, so it is using

              that member. The reference printed in the message text is the fully

              expanded name of the member that it is using. If you intend to take

              advantage of this feature of the SAS/C Compiler, you may disable this

              warning with the ignore= 193 option. If you choose to disable this

              warning, your code may not work on other compilers.

 

                 For more information on using implicit structure references, see

               Chapter 11, "Using Amiga Specific Features of the SAS/C Language."

 

Warning 194: too much local data for NEAR reference,

             some changed to FAR

 

              You have declared more than 32K of static data. The compiler can

              address up to this amount using 16-bit offsets. Amounts greater than

              32K must be addressed using 32-bit offsets. You may have compiled

              with the data=f aronly option and declared some data with the

              __near keyword. If your entire project is in one source file or is

              compiled with data=faronly, you can ignore this warning unless you

              get an error later in the compilation or link. Otherwise, you must

              eliminate some near data in one of three ways:

 

              [] Compile your program with the strmerge compiler option. This

                 option moves all string constants to the code section, thereby moving

                 them out of the near data section.

              [] Declare read-only data as static const. When you compile with

                the stringmerge option, this data will also be moved to the code

                 section.

              [] Add the __far keyword to some of your larger external or static data

                 items to move those items from the near section to the far section.

                 Specify the data=far compiler option to move all data items except

                 those declared with the _ _ near keyword to the far section.

 

                 Note: The second line of message 194 is not printed unless you

               compiled with the data=auto option, or you compiled with the

               data = faronly option and declared data with the __near keyword.


 

254 Appendix 2

 

 

 

 

Warning 195: nested comment detected

 

             This message is suppressed by default, but you can enable it with the

             warn= 195 option. The compiler found the start of a comment (/*)

             inside of a comment. Some compilers allow comment nesting and others

             ignore the start of the second comment. The ANSI Standard does not

             allow nested comments. If you choose to use nested comments, you

             should specify the comnest compiler option. However, using the

             comnest option prevents your code from running on most ANSI-

             compliant compilers.

 

Warning 196: specified include directory not found: "name"

 

             The named directory does not exist or could not be accessed.

 

Warning 198: __regargs invalid for a varargs function

 

             Functions that take variable numbers of parameters always pass their

             parameters on the stack. The __regargs keyword is invalid for these

             functions.

 

  Error 199: unbalanced comment

             See line number file filename

 

             Your code has a comment open (/*) with no corresponding comment

             close (*/). This condition is not detected until the end of the C source

             file.

 

Warning 204: macro invocation not terminated

 

             Your code invoked a macro but did not supply enough closing

             parentheses to terminate the invocation. Also, check any of the macros

             that are invoked by the macro that you invoked directly in your code.

 

Warning 209: macro invocction may have multiple side effects

 

             You have passed an expression with a side effect as an argument to a

             macro, and that macro has evaluated the argument more than once.

             Operators with side effects are ++,--, +=, /=, *=, -=, >>=, <<=, |=,

             &=, and =.

 

               For example, the max and min macros evaluate each argument twice.

             If you invoke the max macro as MAX ( i ++, j ), the first argument is

             evaluated twice, and two post-increments take place. You could define

             the max macro as follows:

 

 

                 #define MAX(x,y) ((x) > (y) ? x : y)

 

                 int i = 0;

                 i = MAX(i++, 0);   /* Warning 209 */


 

                                                      Error and Warning Messages 255

 

 

 

 

                The macro expands to:

 

 

                i = ((i++) > (0) ? i++ : 0);

 

 

                The expansion contains the expression i++ twice, so if that branch of

                the ?: operator is executed, the variable i is incremented twice.

 

                  This warning may sometimes be produced incorrectly, but you should

                examine each case to determine whether there is an error.

 

                  Function calls are also considered side effects, but function calls

                produce warning 217 instead of warning 209.

 

Warning 212:  item "name" already declared

              See line number file "filename"

 

                This message is suppressed by default, but you can enable it with the

                warn=212 option. You have declared an item twice. For example, you

                may have specified the prototype for a function twice, or you may have

                declared an extern twice. The declarations do not conflict, or the

                compiler would generate error 72, but code is harder to maintain if it

                defines the same item in more than one place. You may want to use the

                nomultipleincludes option to suppress multiple #includes of

                the same file if you enable warning 212.

 

Warning 213: empty argument to preprocessor macro

 

                This message is suppressed by default, but you can enable it with the

                strict, ansi, or warn=213 options. Your code calls a preprocessor

                macro with no argument text. This action is accepted by the SAS/C

                Compiler but is not permitted by the ANSI Standard. For example:

                #define FOO(a,b)  a

                FOO(lO,)

Warning 216: symbol "name" found

 

                You have compiled with the fsym compiler option, and the compiler

                has found a definition of one of the symbols that you specified as the

                parameter to the fsym option.

 

Warning 217: macro invocation may call function multiple times

 

                You have passed a function call as an argument to a macro that

                evaluates its arguments more than once. This action may cause

                incorrect results. See also the description of message 209.


 

256 Appendix 2

 

 

 

 

  Error 218: declaration found in statement block

 

             The compiler found a declaration where it expected a statement. You

             may have a statement in the middle of your declaration block, or vice-

             versa. Any declarations found after this error are added as external

             variables, which suppresses warnings about undefined variables but

             may create additional errors later if your code declares a variable of the

             same name. In the following example, the variable y is declared after

             the first statement of the function:

 

                    void func(void)

                    {

                      int x;

                      x = 10;

                      int y;   /* Error 218 */

                    }

 

Warning 220: old-fashioned assignment operator

             taken as "operators"

 

             This message is suppressed by default, but you can enable it with the

             strict or warn=220 options. Older compilers allowed the operators

             =-, =+, and so on. In ANSI C, these operators are specified as -=, +=,

             and so on. The older specification is ambiguous when assigning certain

             expressions (for example, x=-5; and x= - 5; ). To resolve this

             ambiguity, newer compilers use =-, and some pre-ANSI compilers use

             -=. Therefore, you should enter at least one space between the equals

             (=) sign and whatever operator follows it to ensure portability.

 

  Error 223: "filename" is not a valid GST file

 

             The specified filename was supplied using the gst compiler option as a

             Global Symbol Table file, but it is not a valid GST file. Delete the bad

             file and try re-creating it.

 

Warning 224: item "name" already defined

             See line number file "filename"

 

             This message indicates that a variable, function, or typedef is being

             defined for the second time in a given scope. This message is normally

             an error, but if the redefinition is harmless, the compiler allows it and

             issues the message as a warning instead. As shown in the following

             example, the compiler allows redefinition of typedef names in the

             same scope if the new type is identical to the old type. The compiler

             does not allow redefinition of functions or variables in the same scope.


 

                                                      Error and Warning Messages 257

 

 

 

 

                   typedef int foo;

                   typedef int foo;  /* Warning 224 */

 

 

                   void func(void)

                   {

                   }

 

                   void func(void)   /* Error 224  */

                   {

                   }

 

 

 

 

 

Warning 225: pointer type mismatch

             "type1" does not match "type2"

 

             Your code has performed an assignment or some other operation on

             two incompatible different pointer types or on a pointer type and an

             arithmetic type. For example:

 

 

               struct FOO

               {

                 int x, y, z;

               } foo;

               int *ip;

 

 

               ip = &foo;  /* Warning 225 */

 

 

  Error 226: cannot convert "type1" to "type2"

 

             The compiler was unable to perform a requested or implicit conversion.

             For example, if one of the types is an instance of a structure, the

             structure cannot be cast to another structure type or to an arithmetic

             type. For example:

 

 

                   struct FOO

                   {

                     int x, y, z;

                   } foo;

                   int i;

 

 

                   i = (int) foo;  /* Error 226 */


 

258 Appendix 2

 

 

 

 

            Explanations of Linker Messages

 

                                                                                                                                                                                                        Error 103: Out of memory!!

Error 103:  Out of memory!!

                                                                                                                                                                                slink has run out of memory. By default, slink attempts to cache

            slink has run out of memory. By default, slink attempts to cache

          the object modules in memory between pass 1 and pass 2. If slink

            runs out of memory, it attempts to free the cached object modules. In

          some cases, slink cannot find enough continuous memory. Try adding

            bufsize 4096 to the slink command. This option turns off object

            module caching.

 

Error 425:  Cannot find library library-name

 

            The linker cannot find the specified library. Usually, SAS/C libraries are

          located in the LIB: directory. You may have misspelled to library

            name in your slink command.

 

Error 426:  Cannot find object name

 

          The linker cannot find the specified object.

 

Error 443:  filename is an invalid file name

 

          The linker found an invalid character in a filename.

 

Error 444:  Hunk_Symbol has bad symbol-type symbol symbol-name

 

            The object module is corrupt. Try recompiling the object module.

 

Error 445:  Invalid HUNK_SYMBOL symbol-name

 

          The object module is corrupt. Try recompiling the object module.

 

Error 446:  Invalid symbol type symbol-type for symbol-name

 

          Either the object module is corrupt, or slink has found a symbol type

          that it does not recognize. Try recompiling the object module. For a list

          of valid symbol types, refer to the description of object file structure in

          The AmigaDOS Manual, 3rd Edition.

 

Error 447:  filename is a load file

 

            The file specified is an executable module instead of an object module.

 

Error 448:  filename is not a valid object file

 

            The file specified is not an object module. The file may be a C source

            file or a corrupt object module.

 

Error 449:  No hunk_end seen for filename

 

            The object module is corrupt. Try recompiling the object module.

 

Error 450:  Object file filename is an extended library

 

            A library file was specified as an object module. Add the library

            keyword in front of the library name.


 

                                                   Error and Warning Messages 2S9

 

 

 

 

Error 501: Invalid Reloc 8 or 16 reference

 

            An 8- or 16-bit relocation address cannot reach its destination. The

            SAS/C Compiler does not generate 8-bit relocation records, but third

            party products may use them. The object module is probably corrupt.

            Try recompiling your source file. If recompiling the file does not correct

            the error, contact the Technical Support Division.

 

Error 502: function-name symbol - Distance for Reloc16 greater

           than 32768

 

            The distance from the point where the function is called to the function

            itself is greater than 32767 bytes. The function cannot be referenced

            with a 16-bit address field. Normally, slink tries to insert an ALV

            (Automatic Link Vector) at the end of the calling module, but if the

            module has more than 32K of code, the relocation may not reach the

            ALV. An ALV is the instruction used to reach functions that would

            otherwise be too far away. Compile the file with -code=far, or

            declare the function with the __far keyword.

 

Error 503: function-name symbol - Distance for Reloc8 greater

           than 128

 

            The distance from the point where the function is called to the function

            itself is more than 128 and so the function cannot be referenced with

            an 8-bit address field. The SAS/C Compiler does not generate 8-bit

            relocation records, but third party products may use them.

 

Error 504:  variable-name symbol - Distance for Data Reloc 16

           greater than 32768

 

            The distance for the 16-bit relocation is too far. You may see this

            message if a data item (such as a structure or an array) is larger than

            64K or if the total amount of data in your program is greater than 64K.

            To correct the problem, you can either break the data item down and

            make it smaller than 64K, or you can place the __far keyword on the

            definitions of one or more data items to force all references to those

            items to be 32-bits. Using the __far keyword reduces the amount of

            data in the near data section to less than 64K. You can also compile

            your program with the data = far option. However, using data=far

            increases code size and execution time.

 

Error 505:  variable-name symbol - Distance for Data Reloc8

           greater than 128

 

            The distance for the 8-bit relocation is too far. The SAS/C Compiler

            does not generate 8-bit relocation, but third party products may use

            them.


 

260 Appendix 2

 

 

 

 

Error 506: Can't locate resolved symbol symbol-name

 

           If this message appears, please contact the Technical Support Division.

           See Chapter 3, "Getting Help," for a complete list of items that you

           need to provide to the Technical Support staff.

 

Error 507: Unknown Symbol type symbol-type , for symbol

           symbol-name

 

           Either the object module is corrupt, or a slink has found a symbol

           type that it does not recognize. Try recompiling your source file. For a

           list of valid symbol types, see the description of object file structure in

           The AmigaDOS Manual, 3rd Edition.

 

Error 508: Symbol type symbol-type unimplemented

 

           Either the object module is corrupt, or a slink has found a symbol

           type that it does not recognize. Try recompiling your source file. For a

           list of valid symbol types, see the description of object file structure in

           The AmigaDOS Manual, 3rd Edition.

 

Error 509: Unknown hunk type symbol-type in Pass2

 

           If this message appears, please contact the Technical Support Division.

           See Chapter 3, "Getting Help," for a complete list of items that you

           need to provide to the Technical Support staff.

 

Error 510: symbol-name symbol - Near reference to a data item

           not in near data section

 

           The linker expected the specified symbol to be in the near data section,

           but the symbol is located in either the far data section, chip memory, or

           the code section.

 

             You may have defined a variable as __far with the __far

           keyword in one module and externally declared the same variable in

           another module without the __far keyword. If so, the module with

           the external declaration attempted to reference the data as near. To

           correct the problem, the definition and all declarations of the data item

           must be specified with the same keywords.

 

             If you compiled your file with the data=auto option, the compiler

           can place variables into the far data section if necessary. The compiler

           may have placed a variable in one module in the far section and a

           variable in another module in the near section. To correct this situation,

           either stop using the data=auto option, and use the __far keyword

           (if necessary) on the definition and all declarations of the variable that

           causes the error.


 

                                                   Error and Warning Messages 261

 

 

 

 

Error 512: Invalid branch to function-name in overlay node

           module-name

 

            The linker detected a branch in an overlay node that calls another

            overlay node at the same level. This type of branch is not supported by

            the overlay manager.

 

Error 513: Multiple NTRYHUNK segments not permitted

 

            The NTRYHUNK is the root overlay node. No other hunks should have

            this name.

 

Error 514: Overlay manager _ovlyMgr is undefined

 

            This _ovlyMgr function is located in SAS/C libraries. To use the

            SAS/C overlay manager, link with sc.lib or scs.lib. You can also

            write your own overlay manager. See Chapter 8, "Compiling and

            Linking Your Program," for information on creating your own overlay

            manager.

 

Error 515: An ALV was generated pointing to data variable-name

           symbol

 

            A 16-bit relocation could not reach its destination, so slink inserted

            an ALV (Automatic Link Vector) instruction, and then determined that

            the destination is not in a code hunk. To correct the problem, make the

            reference a 32-bit reference. This error may be generated for object

            code produced by third-party assemblers and compilers

 

Error 516: Attempt to merge BSS with CODE or CODE/DATA

 

            Either you have attempted to merge the far BSS section with the far

            data section, or you have attempted to merge the near or far BSS

            section with the code section. You can merge a BSS section with the

            __MERGED section only. You will see this message if you have assigned

            the same name to either the far BSS section and the far data section or

            the far BSS section and the code section.

 

              If you get this error in another situation, please call the Technical

            Support Division.

 

              Note: Do not name the code section __MERGED.

 

Error 600: Invalid command command

 

            The option listed is not a valid slink option.

 

Error 601: option option specified more than once

 

           The option has been specified twice.


 

262 Appendix 2

 

 

 

 

Error 602: Unable to open output file filename

 

           slink cannot open the output file for write access. Another program

           such as CodeProbe may have left a lock on the file. Alternatively, the

           protection bits may prohibit write access to the file, or that the name

           specified may be a directory.

 

Error 603: string is not a valid number

     

           The linker found a non-numerical character in a field where it expected

           to find a number.

 

Error 604: with file is not readable

 

           The with file may contain binary characters or may be locked.

 

Error 605: Cannot open with file filename

 

           The with file does not exist or may be locked.

 

Error 607: No FROM/ROOT files specified

 

           You did not specify an object module, or if you are using overlays, the

           root node did not contain any objects.

 

Error 608: Premature EOF encountered

 

           The object module is corrupt. Try recompiling the source file.

 

Error 609: Error seeking in file filename

 

           The object module is corrupt. Try recompiling the source file.

 

Error 610: module-name has no parent in overlay tree

 

           The with file specifies an overlay with no parent node.

 

Error 611: Reloc found with odd address for symbol symbol-

           name, file filename

 

           The linker has found a relocation record with an odd address. This

           message can only be generated if your program is written in assembler

           and is usually caused by placing an odd length character string in the

           code section.

 

Error 612: MERGED Data relocation to non-code section in

           Overlay Node

           Reference at offset hex-address in module-name, To

           Unit module-name

 

           The linker found a relocation from the near data section, which is

           placed in the root node, to the data section of an overlay node. This

           type of relocation is illegal.


 

                                                   Error and Warning Messages 263

 

 

 

 

Error 613: MERGED Data relocation to static function is not

           resolvable by Overlay Manager.

           Reference at offset hex-address in filename , To

           Unit filename

 

            The overlay manager cannot resolve an indirect function call from the

            root node to a static function in a overlay node. To correct the problem,

            remove the static keyword from the function declaration.

 

Error 614: More than one MERGED data section found

 

            Only one near data section is allowed. This error occurs only when

            using slink to strip debug information from an executable generated

            by a third party linker. If you get this message, do not use slink to

            strip debug information from this executable.

 

Error 615: Code hunk named __MERGED

 

            slink merges all hunks with the name __MERGED and performs

            relocations to this hunk relative to register A4. Do not name the code

            hunk __MERGED .

 

Error 616: ALVs were generated

 

            You have linked with the noalvs linker option, but the linker could

            not resolve all relocations without generating ALV instructions. Either

            the total code size is greater than 32K, or there are multiple code

            hunks. The executable will run, but the code section is not totally PC-

            relative.

 

Error 617: MERGED data greater than 64K

 

            If your program does not generate any additional messages, then the

            program will still run. However, a 16-bit data relocation record may

            not be able to reach its target, and if this happens, slink will generate

            an error.

 

Error 618: Multiple OVERLAY usage-previous occurrences were

           ignored

 

            You can only specify one overlay manager.

 

Error 619: Ignoring null OVERLAY list

 

            You did not specify any files in the overlay list.


 

264 Appendix 2

 

 

 

 

Error 620: Missing '#' at end of OVERLAY list

 

           Enter a pound sign (#) at the end of the overlay tree. For more

           information on creating overlay trees, see Chapter 8, "Compiling and

           Linking Your Program."

 

Error 621: Conflicting integer sizes found

 

           Some modules were compiled using short integers and some were

           compiled using long integers. You cannot mix integer sizes in an

           executable. Alternatively, you may have linked in the wrong version of

           the library.

 

Error 622: Conflicting math types found

 

           You may have compiled the various object modules with conflicting

           math options. All object modules must be compiled with the same math

           library. Alternatively, you may have linked in the wrong math library.

 

Error 623: Regargs function function called through overlay

           manager. Parameters passed in registers to this

           function will be destroyed.

 

           The regargs function passes parameters in scratch registers, but the

           overlay manager does not preserve scratch registers. You cannot call a

           regargs function across an overlay node.

 

Error 624: Absolute reference to symbol module: file filename

 

           If you reference far data in a module linked with cres.o or when you

           are generating a shared library, your program may function improperly

           unless the data are read-only. slink cannot determine if the reference

           is read-only, so it generates this warning.

 

Error 625: Proper math library has not been included

 

           You have not linked in the math library that is needed for the current

           math options.

 

Error 626: Libcode used on module module

 

           You have compiled the module with the libcode compiler option that

           was used on the module, but the module is being linked into an

           executable. Use the libcode option for generating shared libraries

           only.

 

Error 627: Near references found in executable that has a

           module compiled with FARONLY option

 

           You cannot mix modules compiled with data= faronly and modules

           that refer to near data.


 

                                                            Error and Warning Messages 265

 

 

 

 

Enabling Suppressed Messages

Many messages are suppressed by default. The strict and ansi

compiler options turn on some of these messages, but you must use the

warn option to enable the remaining messages. The ansi option enables

the following messages:

 

18   51   70   108  111  137  162  176  180  213

 

The strict option enables the following messages:

 

18   70   111  137  159  163  176  179  187  220

51   108  120  149  162  164  178  180  213

 

The following messages can be enabled only with the warn option:

 

22   148  156  165  190  195  212

 

The following table lists each message that is suppressed by default and

indicates which compiler options enable the message.

 

 

 

Number    Message Text                                               ansi strict warn

 

18        sizeof operator used in preprocessor                       X     X     X

          condition

 

22        structure used as function argument                                    X

 

51        C++ comment detected                                       X     X     X

 

70        unrecognized escape sequence                               X     X     X

 

108       zero-length arrays are not an ansi feature                 X     X     X

 

111       non-portable enum type specified                           X     X     X

 

120       Integral type mismatch: possible portability                     X     X

          problem

          Expecting "type1", found "type2"

 

137       ansi limits #line numbers to between 1 and                 X     X     X

          32767

 

 

                                                                               (cont~nued)


 

266 Appendix 2

 

 

 

 

Number    Message Text                                               ansi strict warn

 

148       use of incomplete struct/union/enum tag                                 X

          "name"

          See line number file filename

 

149       incomplete struct/union/enum tag in prototype                    X      X

          scope "name"

 

156       operation/comparison of pointer to "int" and                            X

          pointer to "type"

 

159       use of unary minus on unsigned value                             X      X

 

162       non-ansi use of ellipsis punctuator                        X     X      X

 

163       initialization of auto struct, union, or                         X      X

          array

 

164       & applied to array                                               X      X

 

165       use of narrow type in prototype                                         X

 

176       implicitly promoted formal "name" conflicts                X     X      X

          with prototype

          See line number file "filename"

 

178       indirect call without indirection operator                       X      X

 

179       narrow type used in old-style definition                         X      X

 

180       no space between macro name and its                        X     X      X

          replacement list

 

187       negative value assigned to unsigned type                         X      X

 

190       #include ignored because header already                                 X

          included

          See line number file "filename "

 

195       nested comment detected                                                 X

 

212       item "name" already declared                                            X

          See line number file "filename"

 

213       empty argument to preprocessor macro                       X     X      X

 

220       old-fashioned assignment operator                                X      X


 

                                                                267

 

 

 

 

Appendix 3

Implementation-Defined

Behavior

 

 

267 Introduction

268 F.3.1 Translation

268 F.3.2 Environment

268 F.3.3 Identifiers

269 F.3.4 Characters

269 F.3.5 Integers

270 F.3.6 Floating-Point

270 F.3.7 Arrays and Pointers

271 F.3.8 Registers

271 F.3.9 Structures, Unions, Enumerations, and Bit-Fields

272 F.3.10 Qualifiers

272 F.3.11 Declarators

272 F.3.12 Statements

272 F.3.13 Preprocessing Directives

273 F.3.14 Library Functions

278 F.3.15 Locale-Specific Behavior

 

 

 

 

Introduction

 

The American National Standard for Information Systems--Programming

Language-C (ANSI Standard X3J11/90-013) allows an implementation

to define its own behavior in certain areas. Implementation-defined

behavior is defined by the ANSI Standard as "behavior, for a correct

program construct and correct data, that depends on the characteristics of

the implementation. . ." (p.3). This appendix describes the SAS/C

Compiler behavior for those areas listed in Section F.3,

"Implementation-Defined Behavior," of the ANSI Standard.

This appendix is organized like Section F.3.


 

268 Appendix 3

 

 

 

 

F.3.1 Translation

[] Diagnostics consist of a line printed to the standard output stream

   containing the following elements:

  

   filename line class number: text

 

   where:

   filename is the name of the file that caused the diagnostic

       line is the number of the line that caused the diagnostic

      class is either Error or Warning

     number is an integer identifying the diagnostic

       text is the diagnostic text.

      

   Some diagnostics contain additional information in a second line. If

   present, this second line is indented to the same position as the text

   portion of the first line.

 

 

 

F.3.2 Environment

 

[] The compiler conforms to the ANSI Standard for a hosted environment

   as documented in Section 2.1.2.2 of the ANSI Standard, plus the

   extension of accepting a WBStartup structure as described under

   main in the SAS/C Development System Library Reference, Version 6.0.

[] The compiler recognizes the streams stdin, stdout, and stderr as

   interactive devices.

 

 

 

F.3.3 Identifiers

 

[] By default, the number of significant characters for identifiers without

   external linkage is 31. However, this number can be changed to any

   value up to 255 with the idlen compiler option.

[] The number of significant characters for identifiers with external

   linkage is the same as the number for identifiers without external

   linkage.

[] Case distinctions are significant in identifiers with and without external

   linkage.


 

                                 Implementation Defined Behavior 269

 

 

 

 

F.3.4 Characters

 

[] The source and execution character sets consist of the characters

   required by the ANSI Standard. In addition, national characters

   (characters with accents) are accepted as valid alphabetic characters

   unless the ansi compiler option is used. See The AmigaDOS Manual,

   3rd Edition (Commodore-Amiga, Inc. 1991) for a complete definition of

   the Amiga character set.

[] No shift states are used for encoding multibyte characters.

[] Each character in the execution character set consists of 8 bits.

[] The source character set maps 1-to-1 to the execution character set.

[] All wide character constants map directly into the execution character

   set. Thus, all wide character constants have the same value as their

   corresponding character in the execution character set.

[] The C locale is used as the current locale.

[] A plain char item is by default signed, but this default can be

   changed to unsigned with the unschar compiler option.

 

 

F.3.5 Integers

 

[] Integers are represented by two's-complement numbers. The range of

   possible values are specified in the header file limits .h and in

   Chapter 12, "How Does the Compiler Work?" The most-significant bit

   in the representation of signed integers is the sign bit and determines

   whether the number is positive or negative.

[] When an integer is converted to a shorter signed integer, the high-

   order bytes are discarded. The bit pattern of the remaining bytes is

   unchanged. The bit pattern of an unsigned number is not changed

   when it is converted to a signed integer of equal length.

[] The following list covers the results of bitwise operations on signed

   integers:

 

   ~  (bitwise NOT)

       The bits are inverted; that is, 1 bits are set to 0, 0 bits are

       set to 1.

 

    >> (shift right)

        The bits are shifted to the right. The sign bit (uppermost bit) is

        used to fill the vacated bit positions on the left.

 

    << (shift left)

        The bits are shifted to the left. The vacated bit positions on the

        right are filled with zeroes.

 

    &  (bitwise AND)

       If the corresponding bits in both operands are 1, then the

       corresponding bit in the result is set to 1; otherwise, it is set to 0.


 

270 Appendix 3

 

 

 

 

    | (bitwise OR)

      If either of the corresponding bits in the operands are 1, then the

      corresponding bit in the result is set to 1; otherwise, it is set to 0.

 

    ^ (bitwise XOR)

      If the corresponding bits in the operands are not alike, then the

      corresponding bit in the result is set to 1; otherwise, it is set to 0.

 

[] In integer division, the remainder is either 0 or has the same sign as

   the dividend.

[] In a right shift of a negative-valued signed integral type, the sign bit is

   used to fill the vacated bit positions on the left. That is, the result

   retains the sign of the left operand.

 

 

F.3.6 Floating-Point

 

[] Floating-point numbers are represented using the IEEE standard

   representation, unless the math= ffp option is on. In the latter case,

   the Motorola Fast Floating Point representation is used. The range of

   possible values for floating-point numbers is specified in the header file

   float.h and in Chapter 12, "How Does the Compiler Work?"

[] If an integral number is converted to a floating-point number that

   cannot exactly represent the original value, the number is rounded for

   all math options except math=coprocessor. For

   math=coprocessor, the number is truncated. You can change the

   behavior for the math=coprocessor option by modifying the source

   code to the __fpinit.c function, located in sc:source/_fpinit.

   However, choosing another rounding mode affects the conversion from

   floating-point to integer such that the conversion does not adhere to the

   ANSI Standard. Specifically, the following statement might assign the

   integer value 6 to i if you specify math=coprocessor, and the

   coprocessor's rounding mode is not set to truncate:

 

                          int i = (int)5.5;

 

 

[] Conversions from double to float round or truncate in the same

   manner as conversions from integral types to floating-point types.

 

 

F.3.7 Arrays and Pointers

[] The type of integer required to hold the maximum size of an array is

   unsigned int.

[] When a pointer is converted to integer, the resulting bit pattern is

   as if an object of type unsigned long with the same bit pattern as

   the pointer had been converted to the integer type.

 

                                 Implementation Defined Behavior 271

 

 

 

 

[] When an integer is converted to a pointer, the resulting bit pattern is

   the same as if the integer had been converted to an unsigned long.

 

 

 

F.3.8 Registers

 

[] Under normal circumstances, there can be up to 4 integer register

   variables, 3 pointer register variables, and 5 floating point register

   variables. Using the cover compiler option, the stackext compiler

   option, the __stackext keyword, or __aligned keyword on a

   function definition costs one pointer register variable. Using the

   data=faronly compiler option adds an additional pointer register

   variable. The reg i s ter keyword is ignored when the global optimizer

   is used because registers are allocated to variables by the global

   optimization phase. If you specify the autoreg option, the code

   generator selects additional register variables for you if registers are

   available after assigning your choices to registers.

 

 

 

F.3.9 Structures, Unions, Enumerations, and

Bit-Fields

 

[] If a member of a union is accessed using a member of a different type,

   the result is undefined. If optimization is used, the compiler may

   attempt to keep the value stored in one member of a union in a

   register, and a subsequent access to a different member may get an old

   value.

[] Structure members of type char can appear at any byte offset.

   Structure members of other simple types must be aligned on an even

   byte boundary, and padding is inserted if necessary. Any structure or

   union member declared with the __aligned keyword is aligned on a

   four-byte boundary, relative to the start of the structure or union, with

   padding inserted as necessary. Substructures and subunions have the

   same alignment requirements as their most restrictive members.

   Structures and unions are padded at the end to the boundary of their

   most restrictive member. For more information on structure padding,

   see Chapter 13, "Writing Portable Code."

[] int bitfields are treated as unsigned int bitfields.

[] The order of allocation of bitfields for an int is from left to right.

   Bitfields never cross storage unit boundaries.

[] The values of an enumeration type are normally of type int. However,

   the SAS/C Compiler allows the declaration of char enum, short

   enum, and long enum types. Enumeration types so declared are of

   the specified type. For more information on using enumerated types,


 

272 Appendix 3

 

 

 

 

   see Chapter 11, "Using Amiga Specific Features of the SAS/C

   Language."

 

 

 

F.3.10 Qualiflers

[] Any reference to an object whose type is qualified by the keyword

   volatile is considered an access to that object.

 

 

 

F.3.11 Declarators

[] There is no limit on the number of declarators that can modify an

   arithmetic, structure, or union type.

 

 

 

F.3.12 Statements

[] There is no limit to the number of case values in a switch

   statement.

 

 

 

F.3.13 Preprocessing Directives

 

[] The value of a single-character constant in a constant expression that

   controls conditional inclusion matches the value of the same character

   constant in the execution character set. Such a character can have a

   negative value unless the unschar compiler option is active.

[] The compiler defines a search path for # include files that are

   included with angle brackets (<>) around their names. This path is

   defined as follows:

      1. directories specified with the includedirectory compiler

         option

      2. the logical assignment INCLUDE:.

 

[] The compiler uses a slightly different search path for #include files

   that are included with double quotes ("") around their names. This

   path is defined as follows:

      1. the current directory

      2. the directory of the file containing the #include statement

      3. directories specified with the includedirectory compiler

         option

      4. the logical assignment INCLUDE:.

 

[] Source file character sequences are not mapped. The string between the

   angle brackets (<>) or double quotes ("") is passed to the file system.


 

                                 Implementation Defined Behavior 273

 

 

 

 

[] The behavior of the libcall, syscall, and tagcall #pragma

   directives is described in the SAS/C Development System Library

   Reference. The behavior of the msg and flibcall #pragma

   directives is described in Chapter 11, "Using Amiga Specific Features

   of the SAS/C Language."

[] The definitions for the __DATE __and __TIME __preprocessor

   macros contain the date and time as specified by the DateStamp

   AmigaDOS function. This function always returns a value, so the date

   and time are always available.

 

 

 

F.3.14 Library Functions

[] The NULL pointer constant to which the macro NULL expands is OL.

[] The diagnostic printed by the assert function is of the form:

 

 

     Assertion (condition) failed in file filename at line number

 

 

   where:

 

   condition is the condition passed to the assert macro

    filename is the current value of __FILE__

      number is the current value of__ LINE__.

 

   The assert function calls abort after printing the above line. For

   more information, refer to the description of the assert function in

   the SAS/C Development System Library Reference.

[] The sets of characters tested for by the isalnum, isalpha,

   iscntrl, islower, isprint, and isupper functions is defined by

   the entries in the external array __ctype. The following table lists

   the hexadecimal values for each of the characters tested for by these

   functions.

 

 

 

   Function Name Character Type Hexadecimal Values

 

  isalnum         alphabetic or       0x30 to 0x39, 0x41 to 0x5a,

                  numeric             0x61 to 0x7a

  isalpha         alphabetic          0x41 to 0x5a, 0x61 to 0x7a

  iscntrl         control             0x00 to 0x1f, 0x7f


 

                                                         (continued)

 

274 Appendix 3

 

 

 

 

  Function Name Character Type Hexadecimal Values

 

  islower       lowercase      0x61 to 0x7a

  isprint       printable      0x20 to 0x7e

  isupper       uppercase      0x41 to 0x5a

 

 

 

 

[] The mathematics functions return zero on domain errors.

[] On underflow range errors, the mathematics functions set the integer

   expression errno to the macro ERANGE.

[] Zero is returned when the fmod function has a second argument of

   zero.

[] The set of signals for the signal function are the minimum set

   defined by the ANSI Standard: SIGABRT, SIGFPE, SIGILL, SIGINT,

   SIGSEGV, and SIGTERM.

[] Refer to the description of the signal function in the SAS/C

   Development System Library Reference for the semantics of the signals.

[] By default, the SIGINT signal results in calling the _ CXBRK function,

   which terminates the program. Also by default, the SIGFPE signal

   results in calling the _ CXFPE function, which sets errno and returns

   to the caller causing the exception. By default, all other signals are

   ignored.

[] The default handling is reset if the SIGILL signal is received by a

   handler specified to the signal function.

[] The last line of a text stream does not require a terminating newline

   character. No newline character is generated if one is not explicitly

   written.

[] Space characters that are written out to a text stream immediately

   before a newline character appear when read in.

[] The implementation does not append any NULL characters to data

   written to a binary stream.

[] The file position indicator of an append mode stream is initially

   positioned at the beginning of a file.

[] A write on a text stream does not cause the associated file to be

   truncated beyond that point (see Section 4.9.3 of the ANSI Standard).

   However, some of the modes truncate the file upon open. The following

   table lists whether a file is truncated after a write.


 

                                 Implementation Defined Behavior 275

 

 

 

 

                       File

 Mode                  Truncated?    Comments

 

 "r" or "ra"           N/A           No writes allowed.

 

 "w" or "wa"           No            The file is truncated at open

                                     time only.

 

 "a" or "aa"           No            All data are written after EOF.

 

 "r+" or "ra+"         No

 

 "w+" or "wa+"         No

 

 "a+" or "aa+"         No            All data are written after EOF.

 

 "rb"                  N/A           No writes allowed.

 

 "wb"                  No            The file is truncated at open

                                     time only.

 

 "ab"                  No            All data are written after EOF.

 

 " rb+ "               No

 

 "wb+ "                No

 

 "ab+"                 No            All data are written after EOF.

 

 

 

 

[] A call to the fopen function opens a buffered I/O stream. For writes,

   data are stored into the buffer until it is full, and then the data are

   written out. A call to the fflush function forces a write of any

   buffered data.

     You can use the library routines setbuf and setvbuf to change

   between buffered, unbuffered, and line buffered modes. For more

   information, refer to the description of these functions in the SAS/C

   Development System Librar,v Reference.

[] A zero-length file can be created by either creating a file and not

   writing anything to it or by truncating an existing file.

[] In general, a file can be opened multiple times as long as a previous

   call to open the file did not physically create the file. However, some

   devices or file-handlers may prevent multiple opens. Refer to the

   documentation for the device or file handler that you are using.

[] A file cannot be deleted if there are any outstanding locks or file

   handles on the file. In this case, the remove function sets errno and

   OSERR and returns a nonzero value.

[] The output for %p conversion specification for the fprintf function

   is the pointer's value in hexadecimal.


 

276 Appendix 3

 

 

 

 

[] The input for the %p conversion specification for the fscanf function

   is a hexadecimal pointer, optionally preceded by 0x or 0x.

[] A minus (--) character that is neither the first nor the last character in

   the scanlist for a % [ conversion specification in the fscanf function is

   treated as a subrange specifier. That is, %[a-d] is equivalent to

   %[abcd].

[] The functions fgetpos and ftell set the variable errno to the

   value of EBADF for a bad file handle. Otherwise, errno is set as

   described in the SAS/C Development System Library Reference for the

   function lseek.

[] The perror function generates the following messages:

 

 

 

                         errno

                         Value         Description

                         __________________________________

                         0             Unknown error code

                         EPERM         User is not owner

                         ENOENT        No such file or directory

                         ESRCH         No such process

                         EINTR         Interrupted system call

                         EIO           I/O error

                         ENXIO         No such device or address

                         E2BIG         Arg list is too long

                         ENOEXEC       Exec format error

                         EBADF         Bad file number

                         ECHILD        No child process

                         EAGAIN        No more processes allowed

                         ENOMEM        No memory available

                         EACCES        Access denied

                                                             (continued)


 

                               Implementation Defined Behavior 277

 

 

 

 

errno

Value         Description

___________________________

EFAULT        Bad address

ENOTBLK       Bulk device required

EBUSY         Resource is busy

EEXIST        File already exists

EXDEV         Cross-device link

ENODEV        No such device

ENOTDIR       Not a directory

EISDIR        Is a directory

EINVAL        Invalid argument

ENFILE        No more files (units) allowed

EMFILE        No more files (units) allowed for this process

ENOTTY        Not a terminal

ETXTBSY       Text file is busy

EFBIG         File is too large

ENOSPC        No space left

ESPIPE        Seek issued to pipe

EROFS         Read-only file system

EMLINK        Too many links

EPIPE         Broken pipe

EDOM          Math function argument error

ERANGE        Math function result is out of range

 

 

 

 

[] If the functions calloc, malloc, or realloc are passed a size of

   zero, the allocation fails, and the function returns a NULL pointer.

   errno is set to the value of EINVAL.

[] The abort function closes all open and temporary level 2 I/O files.

   The value passed to the exit function is the value that is passed back

   to the system. For EXIT _ SUCCESS, the value returned is 0. For

   EXIT _ FAILURE, the value returned is 20.


 

278 Appendix 3

 

 

 

 

[] The list of environment names are in the system file-handler ENV:.

   Environment name values are modified through the putenv function.

[] The contents and mode of execution of the string passed to the

   AmigaDOS system by the system function is as follows:

 

   [] Under AmigaDOS Version 1.3, the AmigaDOS function Execute is

      called.

   [] Under AmigaDOS Version 2.0 or higher, the AmigaDOS function

      System is called.

 

[] The system function returns the value returned from the AmigaDOS

   Execute or System function. If the command processor cannot be

   invoked, system returns a -1.

[] The strerror function returns the same error messages as the

   perror function. The messages returned by the perror function are

   listed above.

[] The default time zone is CST6, and the default for Daylight Savings

   Time is 0.

[] The era for the clock function is based on the first call to the clock

   function. The first call returns a value of zero, and subsequent calls

   measure the processor time from that starting point. For more

   information, refer to the description of the clock function in the

   SAS/C Development System Library Reference.

 

 

 

F.3.15 Locale-Specific Behavior

 

[] The execution character set contains all ASCII characters in all locales.

[] The direction of printing is from left to right.

[] The period (.) is the decimal-point character.

[] Refer to the description of the i s ..functions in the SAS/C

   Development System Library Reference for information on the

   implementation-defined aspects of character-testing and case-mapping

   functions.

[] The collation sequence for ASCII characters is used as the collation

   sequence of the execution character set.

[] The SAS/C Development System uses the normal U.S. time and date

   conventions for the C locale.


 

                               Implementation Defined Behavior 279

 

 

 

 

Type            Values

____________________________________________

Weekday name    Sun Mon Tue Wed Thu Fri Sat

Month name      Jan Feb Mar Apr May Jun

                Jul Aug Sep Oct Nov Dec

 

Date/Time       DDD MMM dd hh:mn:ss YYYY

format          Tue Jun 16 14:12:22 1992

 


 

280

 


                                                                                        281

 

 

 

 

 Appendix 4

 Converting From Aztec C

 Options to SAS/C Options

 

 

Table A4.1 lists each of the Aztec 5.0 options and their equivalent SAS/C

options (if available). Some Aztec C options do not have equivalent SAS/C

options. Also, for some SAS/C options listed in this table, you must

specify additional options before the ones listed in this table will take

effect. For example, you must specify the genprotos option before the

genprotoparms option will take effect.

 

 

Table A4.1 Converting From Aztec C Options to SAS/C Options

 

Aztec C

Option       SAS/C Option                    Comments

__________________________________________________________________________________________

-3           no equivalent

 

-5           no equivalent

 

-a           disasm=filename                 These options generate assembly output.

             noobjname

 

-at          disasm=filename                 The debug option adds C source to the

             debug = line                    assembly output.

             noobj name

 

-bd          stackcheck                      stackcheck is the default setting. You can

                                             turn off stack checking with nostackcheck.

 

-bs          debug=level                     You can specify one of five levels of debug

                                             information.

 

-c2          cpu=68020

 

-d           define symbol=value

 

-fa          math=ieee                       You must also link with the appropriate math

                                             library.

 

-ff          math=ffp                        You must also link with the appropriate math

                                             library.

 

-fm          math=standard                   You must also link with the appropriate math

                                             library.

 

                                                                                (continued)


 

282 Appendix 4

 

 

 

TableA4.1 (continued)

 

Aztec C

Option       SAS/C Option                     Comments

____________________________________________________________________________________________

-f8          math=68881                       You must also link with the appropriate math

                                              library.

-hi          gst=gst-filename

-ho          makegst=gst-filename

-i           includedirectory=filename

-k           no equivalent

-ma                                           This option is on by default.

-mb          no equivalent

 

-mc          code=far

 

-md          data=far

 

-me          no equivalent

 

-mm          stringmerge                      stringmerge forces the compiler to have only

                                              one copy of identical strings and places these

                                              strings in the code section. stringmerge also

                                              places data declared static const into the

                                              code section.

 

-ms          nostringmerge

 

-o           objectname=filename

 

-pa          ansi

             trigraph

-pb                                           Bitfields are unsigned by default. Use the

                                              signed keyword to declare a signed bitfield.

-pc          ignore= 132                      This option suppresses the warning for tokens

                                              after #endif.

-pe          no equivalent

-pl          noshortint

-po          oldpp

-pp          unsignedchar

 

                                                                                (continued)


 

                                        Converting From Aztec C Options to SAS/C Options 283

 

 

 

TableA4.1 (continued)

 

Aztec C

Option       SAS/C Option                    Comments

_____________________________________________________________________________________________

-ps          shortintegers

 

-pt          trigraph

 

-pu          no equivalent

 

-qa          genprotoparms

 

-qf          errorrexx

 

-qp          nogenprotostatics

 

-qq          noverbose

             noversion

 

-qs          nogenprotoexterns

 

-qv          no equivalent

 

-r4          data = faronly                  This option uses register A4 for register

                                             variables. Do not use the __near or __chip

                                             keywords if you use this option.

 

-sa                                          This option is always on.

 

-sb          no equivalent                   Include string.h in your source code.

 

-sf          optimize

 

-sm          no equivalent                   Include the appropriate header file in your

                                             source code.

 

-sn                                          This option is always on.

 

-so          optimize

 

-sp                                          The cleanup overhead reduction enhancement is

                                             always on unless you specify debug=sf or

                                             debug=ff.

-sr          optimize

 

-ss          stringmerge

 

-su                                          This option is the default setting. You can

                                             disable this option with the noautoreg option.

                                                                                (continued)


 

284 Appendix 4

 

 

 

Table A4. 1 (continued)

 

Aztec C

Option       SAS/C Option                    Comments

__________________________________________________________________________________________

-wa                                          This option is the default setting. You can

                                             disable this option with the ignore=88 option.

 

-wd

 

-we          error=all                       This option turns all warnings into errors. To

                                             make a specific message n an error message,

                                             specify error=n.

-wl                                          This option is the default setting.

 

-wn          ignore=225

 

-wo                                          This option is the default setting.

 

-wp                                          This option is the default setting. You can

                                             disable this option with the ignore= 100

                                             option.

 

-wq          no equivalent                   Use command line redirection.

 

-wr                                          This option is the default setting. You can

                                             disable this option with the

                                             nowarnvoidreturn or ignore=85 option.

 

-ws          ignore=all                      This option turns off all warnings.

 

-wu                                          This option is the default setting. You can

                                             disable this option with the ignore=93 option.

-ww          maxerr=n                        The number n specifies the new error limit.

 


 

 

                                                                 285

 

 

 

 

Appendix 5

Converting from Version 5

to Version 6

 

 

285 Introduction

285 Upgrading from Previous Versions

286 Converting Compiler Options

294 Specifying Version 6 Libraries

 

 

 

 

Introduction

This appendix lists the Version 6 options and libraries that are equivalent

to the Version 5 options and libraries.

 

 

 

Upgrading from Previous Versions

 

You should install Version 6 in a separate location from previous

versions of the compiler. Modify your startup sequence files to either

remove the LC: directory from your path or ensure that the directory

SC: C is on your search path before LC: .

  In addition, make sure that include: and lib: get assigned to the

correct include and link library directories for Version 6. The compiler

for Version 6 does not use the QUAD: device used by previous versions.

  In general, it is a good idea to recompile all your code when you

convert to Version 6. However, because the Version 6 libraries are ANSI-

compliant, your old programs may not compile or may generate many

warning messages. Appendix 1, "Solving Common Problems," provides

solutions to some of the problems you may encounter in converting to

Version 6.

  You may want to use the sc5 command to convert older, seldom-used

projects. The sc5 command accepts Version 5 options and reads default

options from the file sascopts. However, it is recommended that you

become familiar with and begin using Version 6 as soon as possible.

  You can use the lctosc conversion utility to convert your Version 5

sascopts file to a Version 6 scoptions file and to determine quickly

the Version 6 equivalent of a Version 5 option. The lctosc utility reads

the sascopts file in the current directory, reads any command-line


 

286 Appendix 5

 

 

 

 

options, converts the options to Version 6 options, and writes the results

to standard output. For example, to convert the sascopts file in the

current directory to a Version 6 scoptions file, enter the following

command at the Shell prompt:

 

 

  lctosc >scoptions

 

 

To determine the Version 6 equivalent of the Version 5 option -cs, enter

the following command:

 

 

  lctosc -cs

 

 

For code compiled with previous versions of the compiler, the new

version of CodeProbe can read the line number information but cannot

read the symbol information from the executables. Recompile your code

with the Version 6 compiler to produce usable debugging information for

symbols.

  If you get unresolved symbols when you link your application, you may

be referring to symbols whose name has changed so as to make the

compiler conform to the ANSI Standard. In this case, look up the symbol

name in the SAS/C Development System Library Reference, Version 6.0 to

determine the new name, and change any references to the symbol name

in your code to the new name. Alternatively, you can choose to use the

define linker option to force all references to the old name to refer

instead to the new name.

 

 

 

Converting Compiler Options

 

Table A5.1 lists each of the Version 5 options and the equivalent

Version 6 option (if available). Some Version 5 options do not have

equivalent Version 6 options. Also, for some Version 6 options listed in

this table, you must specify additional options before the ones listed in

this table will take effect. For example, you must specify the link option

before any of the math=type options will take effect, and you must

specify the genprotos option before the genprotoparms option will

take effect.


 

                                                   Converting from Version 5 to Version 6 287

 

 

 

Table A5.1 Converting Version 5 Options to Version 6 Options

Version 5

Option       Version 6 Option                Description

____________________________________________________________________________________

-+           verbose                         Display commands as executed

-.           noversion                       Suppress execution message

-ab          bss=chip                        Force all uninitialized data (BSS) to chip memory

-ac          code=chip                       Force all code to chip memory

-ad          data=chip                       Force all initialized data to chip memory

-b           data=near                       Base relative data (16-bit offsets)

-b0          data=far                        Non-base relative data (32-bit offsets)

-b1          data=near                       Base relative data (same as -b)

-ba          data=auto                       Automatic non-base relative on data overflow

-c+          idlen=100                       Allow longer identifiers for C++

-ca          ansi                            Maximize ANSI compatibility

-cc          commentnest                     Allow nested comments

-cd          ignore=77                       Allow $ in identifiers

-ce          noerrorsource                   Suppress source line printing for errors

-cf                                          Require function prototypes [1]

-ci          nomultipleincludes              Suppress multiple includes of same file

-ck          ansi                            Suppress non-ANSI keywords (chip, far, near)

-c1          Use __aligned keyword [2]       Align all externs on longword boundary

-cm          multiplecharconstants           Allow multiple character constants

-co          oldpp                           Enable old style preprocessor

-cp                                          Allow #if to span files

-cq          structequivalence               Allow passing of equivalent structure silently

 

 

 

                                                                                 (continued)

 

[1]sc5 did not require function prototypes. By default, Version 6 requires function prototypes. To suppress the Version 6

messages dealing with prototypes, specify ignore=100+161+154.

[2]Use the __aligned keyword to force individual objects to longword boundaries.


 

288 Appendix 5

 

 

 

TableA5.1 (continued)

Version 5

Option       Version 6 Option                Description

______________________________________________________________________________________________

-cr                                          Disallow __asm keyword on function definitions

-cs          stringmerge                     Create only one copy of identical strings

-ct                                          Obsolete - does nothing

-cu          unsignedchar                    Force all char declarations to unsigned char

-cw          nowarnvoidreturn                Shut off warning for return without a value

-cx          noexternaldefs                  Treat all global declarations as externs

-C           onerror = continue              Continue on error

-d           debug=line                      Enable debugging

-d0          nodebug                         Disable debugging

-d1          debug=line                      Enable debugging - dump line table

-d2          debug=symbol                    Generate symbol information

-d3          debug=symbolf lush              Generate symbol information and flush registers

                                             at every line

-d4          debug=full                      Generate full symbol information

-d5          debug= fullflush                Generate full symbol information and flush

                                             registers at line

-dsym=val    define sym=val                  Define preprocessor symbol to a value

-E           errorrexx                       Invoke Editor on error

-Efilename                                   Invoke Editor on error, filename is an errorfile

                                             name

-e                                           Enable Asian character set (default is Japanese)

-e0                                          Enable Japanese character set (same as -e)

-e1                                          Enable Chinese character set

-e2                                          Enable Korean character set

-f           math=ffp                        Use Motorola FFP (forces -fs)

-f8          math=68881                      Generate code for Motorola 68881

                                                                                 (continued)


 

                                                   Converting from Version 5 to Version 6 Z89

 

 

 

TableA5.I (continued)

Version 5

Option       Version 6 Option                DescFiption

_____________________________________________________________________________________________

-fd          precision=double                Use double precision for both float and double

-ff          math=ffp                        UseMotorolaFFP

-fi          math=ieee                       Generate code for IEEE libraries

-f1          math= standard                  Use standard SAS/C floating point library

-fm          precision=mixed                 Use single precision for float, double for double

-fs                                          Use single precision for both float and double

-gc          xref system                     Cross-reference compiler-provided files

-gd          xrefmacros                      Cross-reference defined symbols

-ge                                          List excluded lines

-gh          listheaders                     List header files

-gi          listsystem                      List included files

-gm          listmacros                      List macro expansions

-gn          listnarrow                      Print narrow lines

-go          errorlisting                    Put errors and warnings to both stderr and

             errorconsole                    listing file

-gs          list                            List source

-gx          xreference                      Produce cross reference listing

-g=filename  listfile=filename               Generate listing file with name filename

-Hname       gst=gst-filename                Read in precompiled header file name

-hb          bss=fast                        Force all uninitialized data (BSS) to fast RAM

-hc          code=fast                       Force all code to fast RAM

-hd          data=fast                       Force all initialized data to fast RAM

-ix          incdirectory=filename           Specify directory to search for includes

-jn          ignore=n                        Disable message number n

 

                                                                                 (conhnued)


 

290 Appendix 5

 

 

 

Table A5.1 (continued)

 

Version 5

Option       Version 6 Option                Description

__________________________________________________________________________________________

-jne         error=n                         Make message number n an error instead of a

                                             warning

-j*e         error =all                      Turn all warnings into errors

-jni         ignore=n                        Disable message number n (same as - jn)

-j*i         ignore=all                      Disable all warnings

-jnw         warn=n                          Enable message number n as a warning

-ja          noerrorhighlight                Suppress ANSI escape codes from error line

                                             output

-L+          ob ject=object-file             Specify additional linker objects

             library = link-library

-La          addsym                          Add symbol information when linking

-Lc          smallcode                       Use small code memory model (16bit jumps)

-Ld          smalldata                       Use small data memory model (16-bit data offsets)

-Lf          math=ffp                        LinkwithFFPmathlibrary

-Lh          maphunk                         Produce linker hunk map

-Li          stdio                           Link with _ tinymain instead of _ main

-L1          maplib                          Produce linker library map

-Lm          math=math-type                  Link with appropriate math library

-Ln          stripdebug                      Suppress debugging information in executables

-Lo          mapoverlay                      Produce linker overlay map

-Ls          mapsym                          Produce linker symbol map

-Lt          smallcode                       Use typical link options (same as -Lc, -Ld, -Lv,

             smalldata                       or -Lcdv)

             verbose

 

-Lv          verbose                         Print verbose linking information

 

-Lx          mapxref                         Produce linker cross-reference

 

                                                                                 (continued)


 

                                                   Converting from Version 5 to Version 6 291

 

 

 

TableA5.1 (conhnued)

Version 5

Option       Version 6 Option                Description

_______________________________________________________________________________________

-l           Use __aligned keyword.  [1]     Align objects on longword boundaries

-M           modified                        Compile only modified source files

-m           cpu=any                         Generate code for Motorola 68000

-mO          cpu=68000                       Generate code for Motorola 68000 (same as -m)

-m1          cpu=68010                       Generate code for Motorola 68010

-m2          cpu=68020                       Generate code for Motorola 68020

-m3          cpu=68030                       Generate code for Motorola 68030

-ma          cpu=any                         Generate code for all Motorola processors (same

                                             as -m)

-mc                                          Disable cleanup overhead reduction enhancement

-ml          libcode                         Generate code for resident library use

-mp          absfuncpointer                  Generate 32bit references to functions

-mr          noautoregister                  Disable automatic registerization

-ms          optsize                         Generate code optimized for space

             optimize

 

-mt          opttime                         Generate code optimized for time

             optimize

-N                                           Disable linking from editor

-n           identifierlength=8              Retain only 8 characters for identifiers

-nn          identifier length=n             Specify maximum length for identifiers

-O           optimize                        Invoke global optimizer

-ox          objectname=filename             Place object file in filename

-Px          programname=filename            Use filename as the name of the final executable

                                             module

                                                                     (continued)

 

 

[1] Use the __aligned keyword to force individual objects to longword boundaries.


 

292 Appendix 5

 

 

 

TableA5.1 (continued)

Version 5

Option       Version 6 Option                Description

_________________________________________________________________________________________

-p           preprocessonly                  Preprocess only

-pe          nogenprotostatics               Generate prototypes for external functions

-ph          makegst=filename                Generate precompiled header file

-pi                                          Include identifier names in generated prototypes

-pp          genprotoparms                   Generate prototypes with __PARMS for

                                             portability

-pr          genproto                        Generate prototypes for external and static

                                             functions

-ps          nogenprotoexterns               Generate prototypes for static functions only

             nogenprotodataitems

-pt          nogenprototypedefs             Suppress use of typedefs when generating

                                             prototypes

-qx                                          Place quad file in location x

-qne         maxerr=n                        Quit compilation after n error/warnings

-qnw         maxwarn=n                       Quit compilation after n warnings

-q           maximumwarn= 1                  Quit after 1 error or 1 warning (same as

             maximumerrors=1                 -q1e1w)

-r           code=near                       Default function calls to near (PC-relative)

-r0          code=far                        Default function calls to far (Absolute)

-r1          code=near                       Default function calls to near (Same as -r)

-rr          parms=register                  Pass and receive parameters in registers

-rs          parms=stack                     Pass and receive parameters on the stack

-rb          parms=both                      Generate code for both register and stack

                                             conventions

-Rfilename   objectlib=filename              Place compiled objects into library filename

                                                                                 (continued)


 

                                                   Converting from Version 5 to Version 6 293

 

 

 

Table A5.1 (conhnued)

 

Version 5

Option       Version 6 Option                Description

_____________________________________________________________________________________________

-s                                           Use default segment names text, data, and

                                             udata

 

-sb=name     bssname=name                    Specify a name for uninitialized data (BSS)

                                             segment

 

-sc=name     codename=name                   Specify a name for code segment

 

-sd=name     dataname=name                   Specify a name for data segment

 

-t           startup= cback                  Link with cback.o instead of c.o

 

-tb          startup=cback                   Link with cback.o instead of c.o (same as -t)

 

-tc          startup= catch                  Link with catch.o instead of c.o

 

-tcr         startup=catchres                Link with catchres.o instead of c . o

 

-tr          startup=cres                    Link with cres.o instead of c.o

 

-t=x         startup=filename                Link with filename instead of c.o

 

-u                                           Undefine all preprocessor symbols

 

-v           nostackcheck                    Disable stack checking code

 

-w           shortintegers                   Default to short integers

 

-x           noexternaldefs                 Treat all global declarations as externals (same as

                                             -cx)

 

-y           saveds                          Load A4 with base address at start

 

-znnn        ppbuf=nnn                       Set preprocessor expansion buffer size to nnn


 

 

294 Appendix 5

 

Specifying Version 6 Libraries

 

Table A5.2 lists each of the Version 5 libraries and the equivalent

Version 6 library. In Version 6, the standard libraries provide support

for registered parameters. To use registered parameters, you must

compile with the params=registers option, but you do not need a

special library.

 

Table A5.2

 

Version 5 Library Version 6 Library

_____________________________________________

lc.lib                  sc.lib

lcm.lib                 scm.lib

lcmieee.lib       scmieee.lib

lcmffp.lib        scmffp.lib

lcmr.lib          scm.lib

lcms.lib          scms.lib

lcmsr.lib         scms.lib

lcm881.lib        scm881.lib

lcmr881.lib       scm881.lib

lcnb.lib          scnb.lib

lcr.lib                 sc.lib

lcs.lib                 scs.lib

lcsnb.lib         scsnb.lib

lcsr.lib          scs.lib

 

 

 

 


 

 

                                                                295

 

 

 

Index

 

 

 

 

 

 

A                                             __ aligned keyword 155-156

                                              __ asm keyword 157-158

.a filename extension  78                     __ chip keyword 156-157

abbreviated menus 50                          __ far keyword 156-157

abort function 277                            __ Inline keyword 159

absfuncpointer compiler option  85, 177       __ interrupt keyword 157

accelerator keys 50                           __ near keyword 156-157

addressing data 176-177                       __ regargs keyword 157-158

 chip data 176                                __ saveds keyword 158-159

 modifying access to program code and         __ stackext keyword 160-161

     data 176-177                             __ stdargs keyword 157-158

 reentrant and non-reentrant programs        amigaguide.se, AREXX macro 69

     176                                     AmigaGuide, invoking 28

addsym linker option 121                     ANSI compiler option 85, 181

addsymbols compiler option 85                ANSI Standard

__ aligned keyword 155-156                     See also implementation defined

 affecting definitions of functions 155           behavior

 automatic variable problems 156              See also portable code, v.~riting

 ensuring stack alignment 156                 default argument promotion rules 187

 example 156                                  format for incoming command line 140

 pointer register variables 161              ANSI compliant C compilers 182

Alt keys                                     AREXX interface 65-73

 equivalence 60                               AREXX port 68

 independent operation 60                      command summary 70-73

Amiga keys                                     commands without keystroke equivalents

 caution against redefining 60                    70-73

Amiga-specific features of SAS/C language      communicating with external programs

   153-169                                        68-69

 C++  style comments 168                       definition 73

 comma (,) operator 168                        executing a series of editor commands

 common model external data     168-169           65-68

 enumerated types 167                          keystroke equivalents for commands

 equivalent structures 164-166                  70-73

 implicit structure references 164         AREXX macros

 managing stack space 160-161               amigaguide.se 69

 national characters in variable names      assigning to keys 66

     168                                    definition 73

 nested comments 168                        deletetabs.se 69

 #pragma statements 161 163                 examples 66-68, 69

 sizeof operator 168                        findsym.se 69

 special keywords 154 159                   indent.se 70

 unnamed unions 163-164                     newline character (\n) 65

 zero-length arrays  163-164                provided with the compiler  69-70


 

296 Index

 

 

 

AREXX macros (conhnued)               autotermination function 145-147

 .se suffix required 65                definition 145

 tolower.se 70                         example 146

 toupper.se 70                         level 1 or 21/O functions not used 147

 unindent.se 70                        order in which modules called 147

argc and argv                          _STD preceding function name 145

 ANSI Standard requirement 140         __dtors array 146, 147

 Shell environment 135-136            Autowrap option 61-62

 Workbench environment 136                    Aztec C options, converting  281-284

arguments

 raising argument limits 140-141

argumentsize= compiler option 85-86           B

 See also memorysize= compiler option

arrays                                          __BackGroundlO external definition 143

 SAS/C Compiler behavior 270-271                backslash (\)

asctime function 200-201                         preceding comment character 62

.asm filename extension 78                      _Backstdout external definition

__asm keyword                                    AmigaDOS functions requirements 143

 affecting caller and callee 155                 definition 143

 Amiga-specific features 157-158                 NULL file handle 143

Asm modes 61-62                                  printing messages in the Shell 143

assembler= compiler option 78, 86               backup copies of installation diskettes 3

assert function 273                             Backup File Mode option, Options pull down

assign statements, adding to startup file 10       menu 63

asterisk (-)                                    backward searching 42

 Asm mode 62                                    batch compiler option 86

 indicating depth of overlay tree 129           batch linker option 121

 indirection operator 155                       Beginning option

at sign (@)                                       Block pull down menu 53

 preceding linker symbols 122, 158              Beginning option, Block pull down menu

/AUTO keyword 138                                  51

Auto Indent Mode, Options pull down menu        bitfields

   62-63                                          SAS/C Compiler behavior 271

autoinitialization function 145-147             bitwise operations 269-270

 definition 145                                 BIX (Byte Information Exchange) 31

 example 146                                    block operations 43-44, 53

 level 1 or 2 I/O functions not used      147    marking blocks 43

 library bases automatically initialized         unmarking blocks 44

     148-149                                    Block pull down menu

 order in which modules called 147                Beginning 51, 53

 _STI preceding function name 145                 Copy 53

 __ctors array 146, 147                           Delete 52, 53

automatic storage class 180                       End 51, 53

automatic variables                               Move 53

 stack alignment problems 156                     Print 53

_autoopenfail function                            Read 53

 calling when autoimtialized libraries            Write 53

     cannot open 150-151                        braces ({ })

 source code 151                                 Auto-lndent Mode  62-63

autoregister compiler option  86, 180, 271      bssmemory= compiler option  86, 177


 

                                                         Index 297

 

 

 

bssname= compiler opvion 87                 chip data

bufsize linker option 121                    reentrant and non-reentrant programs

Build icon                                       176

 compiling and linking programs 18-19       chip hunk 172

 definition  14                             __chip keyword 156-157

                                             declaring data items 176

                                             overriding data=auto compiler option

C                                                90

                                             purpose and use 156-157

c directory 6                               chip linker option 121

.c filename extension 78                    chip memory 157

c.o startup module                          clock function 278

 default module 142                         /CLOSE keyword 138

 definition 140                             Close Window option

C+ + style comments 168                      Project pull down menu 47

calloc function 141, 277                     Windows pull-down menu 54

Case Sensitive Characters option, Options   code= compiler option 87, 177

   pull-down menu 63-64                     code hunk 172

case sensitive searches 42                  codememory= compiler option 87, 177

casting results of short integers 179       codename= compiler option 87

catch.o startup module                      CodeProbe

 creating snapshot files 142                 See debugging programs

 definition 140                             colon (:)

catchres.o startup module                    Asm mode 62

 debugging residentable programs 144        colors, changing 54

 definition 140                             Column Display option, Options pull down

 saveds compiler option and __saveds           menu 63

     keyword not allowed 159                comma (,)

 snapshot files 142, 144                     separating filenames for sc command  78

cback.o startup module                      comma (,) operator in preprocessor

 char *__procname external definition           directives 168

     142                                    commentnest compiler option 87-88, 168

 creating detachable programs 142-143       comments

 definition 140                               C++ stylecomments 168

 extern BPTR _ Backstdout external           comment characters, Asm mode 62

     definition 143                          comment start sequence (/') 168

 long _ BackGroundlO external                nested comments 168

     definition 143                          nested comments not allowed by ANSI

 long __priority external definition 142         168

 long _stack external definition 142         slashes (//) defining comment blocks 168

 uses 142                                   common compiler option 88, 169

char *__procname external definition 142    common model external data 168-169

character constants 104                     compiler options 79-119

character strings, replacing                  See also compiler options, setting

 See replacing character strings              abbreviations 80

character strings, searching                  absfuncpointer 85, 177

 See searching for character strings          addsymbols 85

characters                                    ANSI 85, 181

 locale specific behavior 278-279             argumentsize= 85-86

  SAS/C Compiler behavior  268                assembler=  78, 86


 

298 Index

 

 

 

compiler options (continued)               genprototypedefs 95

 autoregister 86, 180, 271                 globalsymboltable= 96

 batch 86                                  GSTimmediate 96

 bssmemory= 86, 177                        icons 96-97

 bssname= 87                               identifierlength=  97

 case-insensitivity 80                     ignore= 97

 code= 87, 177                             includedirectory=  97

 codememory= 87, 177                       keepline 97

 codename= 87                              keyword options 79

 commentnest 87-88, 168                    libcode 98, 159

 common 88, 169                            library= 78, 98

 constlibbase 88                           link 16, 17, 24, 98

 converting from Aztec C options           linkeroptions= 98-99, 120

     281-284                               list 99

 converting Version 5 options to Version 6 listfile= 99

     286-293                               listheaders 99

 coverage 88-89, 271                       listinclude 99-100

 CPU= 89                                   listmacros 100

 csource= 78                               listnarrow 100

 data= 89-90, 132, 157, 177                listsystem 100

 data=auto 90                              makeglobalsymboltable=      100

 data=far 89, 182                          map 100

 data=faronly 90, 161, 182                 mapfile= 100

 datamem= chip 172                         maphunk 101

 datamemory= 90, 177                       maplib 101

 dataname= 91                              mapoverlay 101

 data=near 89, 172                         mapsymbols 101

 debug= 91, 173                            mapxreference 101

 debug=full 91                             math= 102

 debug = fullflush 91                      math = coprocessor 2 70

 debug = line 91                           math = ffp 2 70

  debug=symbol 91                          math=ieee 270

 debug=symbolflush   16, 17, 91            math=standard 16, 17

 define= 92                                maximumerrors= 102

 disassemble= 92                           maximumwarnings= 102

 error= 92                                 memorysize= 103

 errorconsole 92                           modified 104

 errorhighlight 93                         multiplecharacterconstants  104-105

 errorlist 93                              multipleincludes 105

 errorrexx 16, 17, 93                      noautoreg 180

 errorsource 93                            object= 78, 105

 externaldefs 93                           objectlibrary= 106

 findsymbol= 93                            objectname= 106

 from 94                                   oldpreprocessor 106-107

 genprotodataitems  94                     onerror= 107-108

 genprotoexterns 94                        optimize 108

 genprotofile= 94                          optimizealias 108

 genprotoparameters 94                     optimizercomplexity=  108

 genprotos 94-95                           optimizerdepth= 109

 genprotostatistics 9S                     optimizerglobal 109


 

                                                        Index 299

 

 

 

optimizerinline 109                        xreferenceheaders 118

optimizerinlocal 109                       xreferencesystem 119

optimizerloop 109                        compiler options, setting

optimizerpeephole 109                      gadgets for selecting options 17

optimizerrecurdepth= 110                   saving settings 17

optimizersize 110                          scopts screens 23

optimizertime 110                          scopts utility 16-18

overriding settings in scoptions file 79   Shell method 23

parameters= 110-111                        specifying from screen editor (se) 26

parameters=both 202                        specifying on command line 23

parameters=register 202                    Workbench method 16 18

precision= 111                           compiling programs 77 78, 171-173

preprocessor symbols defined 120           See also compiler options

preprocessorbuffer= 111                    See also sc command

preprocessoronly 111-112                   Build icon 18-19

programname= 112                           hunks 171-173

resetoptions 79, 112                       numbered compiler messages  206-257

SAS/C Compiler Options Index screen        portability considerations 181-182

   17                                      sc command 24, 77-78

saveds 112, 144                            screen editor (se) 48

scoptions file 79                          Shell method 22-24

shortintegers 112, 178, 179, 183           solving problems 195-197

smallcode 113, 132, 177                    unnumbered compiler messages      204-205

smalldata 113, 132, 177                    Workbench method 18-19

solving problems 196                     CON: keywords 138

sourceis= 113                            Configuration Window, screen editor (se)

specifying 79-80                             57-64

stackcheck 113, 160, 161                   Asm modes 61-62

stackextend 113, 160, 161                  AutolndentModeoption 62-63

standardio 114                             Autowrap option 62

startup= 114                               Backup File Mode option 63

strict 114, 181-182, 183                   Case Sensitive Characters option   63-64

stringconst 114                            Column Display option 63

stringmerge 114-115, 132, 177, 180         displaying 57-58

stripdebug 116                             illustration 58

structureequivalence 116, 164, 275         Input processing option 61-62

summary of options  80-84                  key definitions, displaying 59 60

switch options 79                          key definitions, setting 60-61

to= 116                                    Keys 14 pull down menu 58

trigraph 116                               No processing option 61-62

underscore 116                             Options pull down menu 58

unschar 272                                Project pull-down menu 58

unsignedchar 116, 177                      Prompt Before Undo option 63

utilitylibrary 117                         reusing saved settings 64

verbose 117, 173                           saving new settings 64

version 117                                Searches Method option 41, 63

warn= 117-118, 183, 265                    Tab Expansion Method option 62

warnvoidreturn 118                         tab stops, setting 61

with= 118                                console window 138

xreference  118                          const keyword problems  196-197


 

300 Index

 

 

 

constlibbase compiler option 88               purpose and use 89-90

control characters, entering 46               using in overlays 132

Control-\ escape character 46                data storage classes 179-180

conversion of data types 178-179             data types and sizes 177-179

Convert Macro to Key option, Project pull-    casting results of short integers 179

   down menu 55                               conversion 178-179

converting compiler options                   effect of shortint option 178, 179

 Aztec C options 281 284                      narrow types in pre ANSI function

 Version 5 options to Version 6 286-293           declarations 187-188

converting from Version 5 to Version 6        pointer length 178

   285-294                                    portability considerations 183

 compilation errors 195-196                   signed and unsigned objects 177

 compiler option conversion 286-293           sizes and values 177-178

 installing Version 6 285                     widest operand 178

 recompiling code 285                        data=auto compiler option 90

 sascopts file conversion 285-286            data=far compiler option 89 182

 specifying Version 6 librarieS 294          data=faronly compiler Option 90 161

 symbol information 286                         182

Copy option, Block pull down menu 53         datamem=chip compiler option 172

Correcting errors in source file 16, 19, 24  datamemory= compiler Option 90 177

  erage compiler Option 88-89, 271           dataname= compiler Option 91

cpr (Codeprobe) command 25                data=near compiler option 89 143  172

cpr.guide help database 28                 __DATE preprocessor macro 273

CPU= compiler option  89                    locale specific behavior 278-279

crashing the machine 200                    daylight savings time, default   278

Create New CLI option, Windows pull-down   debug compiler option 91, 173

   menu 54                                 Debug icon

cres.o startup module                       definition 14

 creating residentable programs  143-144    starting the debugger 20

 definition 140

 saveds compiler option and __saveds         debug=fullflush compiler option 91

     keyword not allowed 159                 debugging programs

csource= compiler option 78                   cpr (CodeProbe) command 25

__ctors array 146, 147                       Dialog window 20-21, 25

customizing screen editor (se)                display command 21

 See Configuration Window, screen editor      go command 21, 25

     (se)                                     problems with CodeProbe 197

__CXBRK function 274                         quit command 21, 25

__CXFPE function 274                          Source window 20-21, 25

__CXOVF stack overflow routine 160           stepping through programs 21

                                              using Shell 25

                                              using Workbench 20-21

D                                            debug =line compiler option 91

                                             debug=symbol compiler option 91

d command                                    debug=symbolflush compiler option 16,

 See display command                            17, 91

d option, se command 38                      declarators

data= compiler option                         SAS/C Compiler behavior 272

 changing data addressing methods 177        def _

 changing default data section  157       beginning of names for icons  25-26


 

                                                          Index 301

 

 

 

default icons for tools 26                   End option, Block pull-down menu 51, 53

define= compiler option 92                   enumerated types, specifying size 167

define linker option                         enumerations

  eliminating standard 1/0 window    137       SAS/C Compiler behavior  271

  forcing symbol name references Z86         env directory 7

  purpose and use 121-122                    ENV: logical device 10

Delay function (AmigaDOS) 20                 ENV:sc subdirectory 11

Delete option, Block pull down menu 52,      environment

   53                                         SAS/C Compiler behavior 268

deletetabs.se, AREXX macro 69                environment names 278

deleting text 41, 52                         environment variables setting 10  11

  See also undoing changes                   equivalent structures 164 166

detachable programs 142-143                   definition 164

 See also residentable programs               examples 165,166

 cback.o startup module 142- 143             error and warning messages 203-266

 creating  142

 definition 142                                eliminating informational messages 202

 external definition requirements 142  143   enabling suppressed messages 265

 restricting to one copy running 143

diagnostics                                    numbered compiler messages 206-257

 SAS/C Compiler behavior 268                  unnumbered compiler messages 204-205

Dialog window (CodeProbe) 20-21, 25           using error and warllmg messages

directories created by installation program

   6-8                                       error compiler options

 c 6                                          error= 92

                                              errorconsole 92

 env 7

 examples 6                                   errorhighlight 93

 help 6                                       errorlist 93

 icons 6                                      errorrexx 16, 17, 93

 Include 7                                    errorsource 93

 Lib 7                                        maximumerrors= 102

 libs 7-8                                     onerror= 107-108

 source 7                                    errors in source file, correcting  16, 19, 24

 starter _ project 6                         escape character (Control-\) 46

disassemble= compiler option 92              examples directory 6

diskcopy command (AmigaDOS) 3                executable module 172

display command 21                           exit function 277

Display Names option, Project pull-down      Exit SE option, Project pull-down menu

   menu 56                                      47, 56

DOSBase                                      exiting screen editor (se) 46 47, 56

 initialized by startup code 149             extern BPTR _ Backstdout external

__dtors array  146, 147                         definition 143

                                             external data, common model 168-169

                                             external storage class 180

 

E                                            external symbol information in hunks 172

                                             externaldefs compiler option 93

Edit icon 14, 38

editor

 See screen editor (se)                      F

Electronic Mail Interface to Technical

   Support (EMITS)  31-32                    fancy linker option  122


 

302 Index

 

 

 

far BSS hunk 172                          __fpinit.c function Z70

far data 172         !                    fprint problems 197

far data hunk 172                         fprintf function 275

__far keyword 154, 156-157                __fpterm function

 affecting only calling function 155      from compiler option 94

 compatibility with previous releases 157 from linker option 122

 declaring data items 176                 fscanf function 276

 declaring far data 172                   ftell function 276

 overriding data=auto compiler option     function pointers

     90                                    effect of keywords 155

 purpose and use 156-157                  functions

fast linker option 122                     calling functions in overlays 128

faster linker option 122                   function call problems 199

fax numbers for Technical Support 30       writing replacement functions for SAS/C

fflush function 275                            library functions 202

fgetpos function 276                      fwidth linker option 122

filename extensions

 options for specifying with sc command

     78                                   G

 recognized by sc command 78

files                                     g command

 See also screen editor (xe)               See go command

 editing new files 55                     genprotodataitems compiler option 94

 maximum number of open files 39          genprotoexterns compiler option 94

 naming 56                                genprotofile= compiler option 94

 opening more than one 38                 genprotoparameters compiler option 94

 saving 46-47                             genprotos compiler option 94-95

 specifying multiple filenames with sc    genprotostatistics compiler option 95

     command 78                           genprototypedefs compiler option 95

 switching between 38, 39                 geta4 function 159

 truncation after a write 275             getch function 198

FindPort function 143                     getchar problems 198

findsym.se, AREXX macro 69                global message port 143

findsymbol= compiler option 93            global optimization 159, 180, 271

flibcall #pragma statement 162            global symbol information in hunks 172

floating-point numbers                    globalsymboltable= compiler option 96

 conversion types 179                       See also makeglobalsymboltable=

  SAS/C Compiler behavior 270                  compiler option

  value limits 178                        go command

floppy disk product installation 8-9        completing program execution 21, 25

 disks created 9                          grep

  Pretend to Install process 8-9            compared with screen editor (se)

  read.me file 9                               searching 43

fmod function 274                         GST= compiler option 96

fopen function 275                        GSTimmediate compiler option 96

formal storage class 180

formatted print functions

  %p conversion 275 276                   H

  problems 197

__fpinit function 146                     .h filename extension 78


 

                                                                 Index 303

 

 

 

H_DEBUG hunk 173                            I

H_SYMBOL hunk 173

hard disk product installation 4-8          icons 25-26

 directories created 6-8                     contained in starter _ project directory 14

 modifying startup files 5-6                 default icons for tools 26

  Pretend to Install process 4               modifying 26

header files                                 naming conventions 25

 function call problems 199                  object file icons 26

 incorrect characters at beginning 196       preventing all icons 26

 multipleincludes compiler option 105        preventing specific types 26

 reasons for including incorrect file 199    representing SAS/C tools 14

heap area 175                                templates in sc:icons drawer 25

height linker option  122                   icons compiler option 96-97

help command 27                             icons directory 6

help directory 6                            identifierlength= compiler option 97

help system 27-29                           identifiers

 See also problem solving                    SAS/C Compiler behavior 268

 See also Technical Support                 ignore= compiler option 97

 help databases 28-29                       implementation defined behavior  267-279

 installation procedure 4                    ANSI definition 267

 invoking AmigaGuide 28                      arrays and pointers  270-271

 menu bar of help screens 29                 bitfields 271

 navigating through help databases 29        characters 269

 sc command 78                               declarators 272

 screen editor (se) 48                       enumerations 271

 Screen Editor Help screen 28

hunk symbol records 121                      floating_point numbers 270

hunks 171-173                                identifiers 268

 changing hunk names 175                     integers 269-270

                                             library functions 273-278

 chip hunk 172

                                             locale speclfic behavior 278-279

                                             preprocessing directives 272-273

 contained in primary (root) node 174        qualifiers 272

 contents 171-1 72

 far BSS hunk 172                            registers 271

 far data hunk 172                           structures 271

 H_DEBUG hunk 173                            translation 268

 H_SYMBOL hunk 173                           unions 271

 letters indicating hunks produced by      implicit structure references 164

    compiler 173                           Include directory 7

 near BSS hunk 172                         #include files search paths 272

 near data hunk 172                        include: device name, assigning 10

 NTRYHUNK 133, 175                         includedirectory= compiler option   97

 reserved section names  175               incomplete structure tags 188-189

 udata hunk 172                            indent linker option 123

 __MERGED hunk 172, 175                    indent.se, AREXX macro 70

 __NOMERGE hunk 175                        indirection operator (-) 155

hwidth linker option 123                   __inline keyword 159


 

304 Index

 

 

 

Input Processing option 61-62                 exiting screen editor (se) 56

 Asm modes 61-62                              inserting text 52

 Autowrap 61-62                               keystroke macros 55

 No processing 61-62                          managing windows 54

Insert File option, Project pull down menu    moving around in files 40, 51

   52                                         qualifier keys 59

inserting text 40-41, 52                      saving files 56

installing SAS/C Development System 3-11      searching for and replacing strings 53

 assigning logical device names 10            Shift keys 60

 directories created by installation          undoing changes 56

     program 6-8                             Keys pull down menu

 floppy disk installation 8-9                 definition 58

 hard disk installation 4-8                   determining functions of commands 59

 modifying startup files 5-6                 keystroke equivalents for AREXX

 preparing for installation 3                   commands 70-73

 read.me file 5                              keystroke macros 45-46

 setting environment variables 10-11          assigning macros to another key 46

integers                                      creating 45

 SAS/C Compiler behavior 268                  keys 55

 value limits 177-178                         menu options  55

Interlace Toggle option, Windows pull down    reloading  45-46    

   menu 54                                    replacing 45

__interrupt keyword 155, 157                  saving  45-46

IntuiMessage structure 165, 166              keyword options  79

IOExtSer structure 166                       keywords

isalnum function 273-274                      affecting caller and callee  155

                                              affecting definition of functions 155

isalpha function 273-274

iscntrl function 273 274                      affecting only calling function  155

islower function 273-274                      /CLOSE 138

isprint function 273-274                      CON: keywords 138

isupper function  273-274                     const 196-197

 

                                              controlling standard 1/0 window 138

                                              list of special keywords 154

K                                             register 180, 271

                                              signed 177, 183

keepline compiler option 97                   specifying on function pointers 155

key definitions 59-61                         unsigned 177

 displaying 59-60                             /WAIT 138

 qualifiers 60                                __aligned 155-156, 161

 raw code 60                                  __asm 155, 157-158

 setting 60-61                                __chip 90, 156-157, 176

keyboard shortcuts  50                        __far 90, 155, 156-157, 172, 176

keys                                          __inline 159

 accelerator keys 50                          __interrupt 157

 Alt keys 60                                  __near 90, 155, 156-157, 172, 176

 assigning AREXX macros  66                   __regargs 111, 155, 157-158, 202

 block operations 53                          __saveds 112, 144, 145, 155,

 changing colors 54                              158-159

 deleting text 41, 52                         __stackext 155, 160-161

 editing new files  55                        __stdargs  111, 155, 157-158


 

                                                         Index 305

 

 

 

 

L                                           startup modules 141

                                            using with sc command Z4, 120

lctosc conversion utility 285-286          linker (slink)

Lib directory 7                             See slink command

.lib filename extension 78                 linker options 121-127

lib: device name, assigning 10              addsym 121

libcode compiler option  98, 159            batch 121

libent.o module 144                         bufsize 121

libfd linker option 123                     chip 121

libinit.o module 144                        define 121-122, 137, 286

libinitr.o module 144                       fancy 122

libprefix linker option 123-124             fast 122

libraries                                   faster 122

 See also shared libraries                  from 122

 problems creating resident libraries 201   fwidth 122

 Version 5 and Version 6 library            height 122

     equivalences 294                       hwidth 123

library base pointers                       indent 123

 See constlibbase compiler option           libfd 123

library bases, initializing                 libprefix 123-124

 See system library bases, initializing     library 124

library= compiler option 78, 98             librevision 124

.library files                              libversion 124

 library bases 149                          map 124

library functions                           maxhunk 124

 SAS/C Compiler behavior   273-278          noalvs 124

library linker option 124                   nodebug 125

library revision numbers 150                nover 202

librevision linker option 124               onedata 125

libs directory 7-8                          overlay 125

 scdebug.library 7                          overlymgr 125

 scgo.library 7                             plain 125

 scgst.library 7                            prelink 125

 schi.library 8                             pwidth 125

 sckeymap.library 8                         quiet 126

 sclist.library 8                           root 126

 scpeep.library 7                           smallcode 126

 scspill.library 8                          smalldata 126

 sc1.library 7                              stripdebug 126

 sc2.1ibrary 7                              swidth 126

libversion linker option 124                to 126

Line Number option, Search pull down        verbose 126

   menu 51                                  verify 126

link compiler option                        width 126

 displayed in SAS/C Compiler Options        with 127

     Index screen 17                        xref 127

 eliminating standard I/O window 137       linker symbols

 nostdio option 137                         absolute symbols not used with

 purpose and use 98                             residentable programs 159

 running example.c program 16               at sign (@) preceding 122


 

306 Index

 

 

 

linker symbols (continued)                    M

 converting from Version 5 to Version 6

     286                                      macros

 created for residentable programs 144         See AREXX macros

 extra underscores preceding 122               See keystroke macros

 NEWDATAL 144                                 Main Menu key (F2) 50

 RESBASE 144                                  __main routine

 RESLEN 144                                    converting incoming command to ANSI

 resolving undefined symbols  193  195             format 140

 __LinkerDB 144, 158                           opening standard I/O window 137

__LinkerDB symbol 144, 158                     raising argument limits 140-141

linkeroptions= compiler option 98-99, 120     makedir command (AmigaDOS) 22

linking programs 120-127, 173-174             makeglobalsymboltable= compiler option

 See also linker options                          100

 See also sc command                            See also globalsymboltable= compiler

 See also slink command                            option

 eliminating standard I/O window   137        malloc function 141, 277

 entering slink command 121                   map compiler option 100

 linker messages 258-264                      map linker option 124

 producing executable modules  173-174        mapfile= compiler option  100

 sc compared with slink 120

 startup modules 14l-l44                      maphunk compiler Option   101

                                              maplib compiler option 101

 using Bulld Icon 18 19                       mapoverlay compiler option 101

 using Shell 24                               mapsymbols compiler Option 101

list compiler option 99                       mapxreference compiler option 101

listfile= compiler option 99                  math= compller option 102

listheaders compiler option 99                math libraries

listinclude compiler option 99-100             including incorrect library 194

listmacros compiler option 100                 unresolved symbol problems 193-194

listnarrow compiler option 100                math=coprocessor compiler option 270

listsystem compiler option 100                mathematics functions 274

load and stay resident programs               math=ffp compiler option 102, 270

 See detachable programs                      math=ieee compiler option 102, 270

 See residentable programs                    math=standard compiler option 16, 17,

load files 172                                   102

Load Macros option, Project pull down         math=68881 compiler option   102, 158

   menu 55                                    math=68882 compiler option   102

locale specific behavior  278-279             MAXARG symbol 140

logical device names                          maxhunk linker option 124

 ENV: 10                                      maximumerrors= compiler option 102

 ram: 11                                      maximumwarnings= compiler option 102

logical device names, assigning 10            memory options

 include: 10                                   bssmemory= 86

 lib: 10                                       codememory= 87

 sc: 10                                        datamemory= 90

long __BackGroundIO external definition        memorysize= 103-104

   143                                        memorysize= compiler option  103-104

long __priority external definition 142          See also argumentsize= compiler

long __stack external definition 142                option


 

                                                         Index 307

 

 

 

 See also preprocessorbuffer= compiler       overriding data=auto compiler option

     option                                      90

 default values for argumentsize and         purpose and use 156-157

     preprocessorbuffer options 104         nested comments 168

 size specifications 103                     See also commentnest compiler option

menus                                       NEWDATAL symbol 144

 See also specific menus                    newline character (\n), AREXX macros 65

 abbreviated menus 50                       \n (newline character) 65

 block operations 53                        No processing option 61-62

 deleting text 52                           noalvs linker option 124

 editing new files 55                       noautoreg compiler option 180

 exiting screen editor (se) 56              nodebug linker option 125

 inserting text 52                          __NOMERGE hunk 175

 keystroke macros 55                        non-reentrant programs 176

 managing windows 54                        nostdio option 137

 moving around in files 51                  nover linker option 202

 naming files 56                            NTRYHUNK code hunk  133, 175

 saving files 56

 searching for and replacing strings 53

 selecting menu options 50                  O

 undoing changes 56

__MERGED hunk 172, 175                      .o filename extension  78

message browser                             object= compiler option 78, 105

 See scmsg (message browser)                object file icons 26

messages                                    objectlibrary= compiler option 106

 See error and warning messages             objectname= compiler option 106

modified compiler option 104                oldpreprocessor compiler option 106-107

Move option, Block pull down menu 53        onedata linker option 125

moving around in files 40, 51               onerror= compiler option 107-108

msg statement                               online help

 See #pragma msg statement                   See help system

multiplecharacterconstants compiler option  Open New Window option, Project pull-

   104-105                                     down menu 55

multipleincludes compiler option 105        Open Window option

                                             Project pull down menu 55

                                             Windows pull-down menu 47, 54

 

N                                           operands

                                             conversion types 179

naming files 56                              widest operand 178

narrow types in pre-ANSI function           optimize compiler option 108

   declarations 187-188                     optimizealias compiler option 108

national characters in variable names 168   optimizercomplexity= compiler option 108

near BSS hunk 172                           optimizerdepth= compiler option 109

near data 172                               optimizerglobal compiler option 109

near data hunk 172                          optimizerinline compiler option 109

__near keyword 154, 156-157                 optimizerinlocal compiler option 109

 affecting only calling function 155        optimizerloop compiler option 109

 compatibility with previous releases 157   optimizerpeephole compiler option 109

 declaring data items 176                   optimizerrecurdepth= compiler option

 declaring near data 172                       110


 

308 Index

 

 

 

optimizersize compiler option 110           parameters=register compiler option 110,

optimizertime compiler option 110              157-158, 202

Options pull down menu                      parameters=registers option 294

 Auto-lndent Mode 62 63                     parameters=stack compiler option   110,

 Backup File Mode 63                           158

 Case Sensitive Characters 63-64            patterns, searching for 43

 Column Display 63                          perror function messages 276-277

 Configuration Window 57                    plain linker option 125

 definition 58                              plus sign (+)

 Input Processing 61-62                      continuing lines of filenames for

 Prompt Before Undo 63                           overlays 129

 Searches Method 63                          separating filenames for overlays 129

 Tab Expansion Method 62                     separating filenames for sc command 78

__OSlibversion external long integer 150    pointers

overlay linker option  125                   declaring 155

overlay manager                              default length 178

 customizing 133                             SAS/C Compiler behavior 270-271

 definition 127                             portable code, writing 181-189

overlay tree                                 See also implementation defined

 asterisks indicating depth 129                  behavior

 definition 127                              compiling with strict or ANSI options

 examples 128,130-131,132                        181-182

 terminating with pound sign (#) 129         data and type sizes 183

overlays 127 133                             defining __STRICT__ANSI preprocessor

 data=near compiler option 132                   symbol 182

 definition 127                              guidelines for avoiding problems

 functions in overlays 128                       182 183

 listing filenames 129                        incomplete structure tags 188-189

  maximum number 129                          narrow types in pre ANSI function

  nodes in executable module  174                  declarations 187-188

  overlay option 129                            structure size and padding 493

  root node 127, 128-129                        writing structures to disk file 184-186

  smallcode compiler option 132             pound sign (#)

  smalldata compiler option 132              terminating overlay tree 129

 specifying compiler options 132-133        #pragma msg statement  162, 162-163

 stringmerge compiler option 132             error 162

 using mu]tiple shared libraries instead     example 163

     12,                                     ignore 162

  with files 129 130                         pop 162

overlymgr linker option 125                  push 162

overwrite mode 41                            warn 162

__ovlymgr global symbol  133                #pragma statements  161-163

                                             flibcall 162

                                             types of #pragma statements 161

P                                            using in residentable programs 143

                                           precision= compiler option 111

.p filename extension  78                  prelink linker option 121, 125

padding structures 183                     preprocessing

parameters= compiler option  110-111         comma (,) operator 168

parameters=both compiler option 110,         oldpreprocessor compiler option  106-107

   158, 202                                  sizeof operator  168


 

                                                         Index 309

 

 

 

preprocessing directives                    Prompt Before Undo option, Options pull-

 SAS/C Compiler behavior     272-273           down menu 63

preprocessor symbols                        prototype generation 94 95

 defined by compiler 119                    PutMsg exec function 165

 defined by compiler options 120            pwidth linker option 125

 __STRICT__ANSI 85, 182

preprocessorbuffer= compiler option 111

preprocessoronly compiler option 111-112    Q

primary node 174

Print option, Block pull down menu 53       q (quit) command 21, 25

printing messages in the Shell 143          qualifier keys 59, 60

__priority external definition 142

problem solving 193-202                     qualifiers

 See also Technical Support                  SAS/C Compiler behavior 272

 asctime function 200-201                   question mark (?)

 CodeProbe problems 197                      getting help for sc command 78

 compilation errors 195-197                 quiet linker option 126

 crashing the machine 200                   quit command (debugger)  21, 25

 eliminating informational messages 202

 formatted print functions 197-198

 getchar problems 198                       R

 incorrect results from function calls 199

 resident programs or libraries 201         ram: logical device 11

 resolving undefined symbols 193-195        raw code for key definitions  60

 standard I/O window 201                    rawcon function 198

 writing replacement functions 202          Read option, Block pull-down menu 53

proceed command                             read.me file 5, 9

 equivalent to Return key 21                realloc function 277

process restrictions using startup modules  recompiling and linkillg (rebuilding)

   141                                         programs 19, 24

processor-specific code                     reentrant and non-reentrant programs 176

 See CPU= compiler option                     regargs keyword 157 158

programname= compiler option 112             affecting caller and callee 155

Project pull down menu                       purpose and use 157 158

 Close Window 47

 Convert Macro to Key   55                   usmg with user-written replacement

 definition 58                                     functions  111,202

 Display Names 56                           register keyword 180, 271

 Exit SE 47, 56                             register storage class 180

 Insert File 52                             registerized parameterS 294

 Load Macros 55                             registers

 Open New Window 55                          SAS/C Compiler behavior 271

 Open Window 55                             regular expressions

 Rename 56                                   definition 41

 Save & Close 19, 24, 47, 56                 entering in searches 43

 Save & Continue 47, 56                      Use Regular Expressions option 63

 Save & Reopen 47, 55, 56                   relocation records 172

 Save Macros 55                             remove function 275

 Undo Last Change 56                        Rename option, Project pull-down menu

projects, setting up 14-15                     56


 

310 Index

 

 

 

replacing character strings 42-43         s:user startup file

 entering regular expressions 43           modifying 5-6

 keys 53                                   solving problems 195

 menu options 53                          SAS/C language

 options 43                                See Amiga-specific features of SAS/C

 prompted replacements 42                      language

RESBASE symbol 144                        sascopts file, converting 285-286

resetoptions compiler option 79, 112      Save & Close option, Project pull-down

resident command (AmigaDOS)                  menu 19, 24, 47, 56

 not used with detachable programs 143    Save & Continue option, Project pull-down

 using with residentable programs  143       menu 47, 56

resident libraries, creating 201          Save & Reopen option, Project pull down

resident program                             menu 47, 55, 56

 definition 143                           Save Macros option, Project pull-down

residentable programs 143-144                menu 55

 See also detachable programs             saveds compiler option 112, 144, 158

 creating 143-144                         __saveds keyword 112, 158-159

 cres.o startup module 143, 144            affecting definitions of functions 155

 debugging with catchres.o startup         Amiga-specific features 158-159

     module 144                            applications without startup modules

 requirements 144                              145

 solving problems 201                      compared with saveds compiler option

 symbols created by slink 144                  158

 unable to reference absolute symbols      equivalent to geta4 function 159

     159                                   not used with cres.o and catchres.o

RESLEN symbol 144                              startup modules 144, 159

resolving undefined symbols  193-195       purpose and use 112

restoring text                            saving

 See undoing changes                       compiler options 17

Return key                                 files 46-47, 56

 equivalent to proceed command 21          keystroke macros 45-46

reusing saved configuration settings 64    new settings in Configuration Window

root linker option 126                         64

root node                                 sc command 77-78

 contents 128-129, 174                     See also compiler options

 definition 127                            compared with slink command 120

running programs 174-175                  compiling and linking programs   24

 heap area 175                            default icons 26

  Shell method 24-25                      filename extensions 78

 stack area 174                           link compiler option 24, 120

 Workbench method 19-20                   options for specifying filename

                                              extensions 78

                                          specifying multiple filenames 78

S                                         specifying startup modules 141

                                          startup option 141

.s filename extension 78                  syntax 77

s:startup-sequence file                  sc.guide help database 29

 modifying 5-6                           sclib.guide help database 29

  solving problems 195                   sc util.guide help database 28

s:startupII file, modifying 5            sc: device name, assigning 10


 

                                                         Index 311

 

 

 

scdebug.library 7                            status line 39-40

scgo.library 7                               substituting another editor 14

scgst.library 7                              switching between windows 38, 48

schi.library 8                               undoing changes 44, 56

sckeymap.library 8                           window display size 39

sclist.library 8                             window management 47-48, 54

scmsg (message browser)                     screen editor (se), controlling 49-56

 correcting source file errors 18, 24        block operations 43-44, 53

 SAS/C Message Browser window 18             changing colors 54

 specifying errorrexx compiler option 16,    deleting text 41, 52

     17                                      editing new files 55

scmsg.guide help database 28                 exiting the editor 47, 56

scoptions file                               inserting text 40-41, 52

 converting sascopts file  285-286           keystroke macros 45-46~ 55

 overriding settings 79                      managing windows 47-48, 54

 saving options 16, 23                       moving around in files 40, 51

SCoptions icon 14                            naming files 56

scopts utility                               replacing character strings 42-43, 53

 gadgets for selecting options  17           saving files 46 47, 56

 running from screen editor (se) 48          searching for character strings 41-42

 setting compiler options 16-18                    43, 53

 specifying options on command line 23       selecting menu options 50

 starting with SCoptions icon 14, 16         undoing changes 44, 56

 using scopts screens 23                    screen editor (se), customizing

                                             See Configuration Window, screen editor

scpeep.library 7                                  (se)

screen editor (se) 37-48

 See also AREXX interface                   screen editor (se), startmg 38 39

 See also se command

 block operations 43-44 53                  specifymg more than one filename   38

 compiling programs 8                       using Edit icon 14, 38

                                          setup command

 control characters 46                      default icons 26

 creating source files 15-16, 22            setting up projects  14-15

 deleting text 41, 52                     scspill.library 8

 Edit window, illustration 19             sc1.library 7

 editing text 40 46                       sc2.library 7

 entering text 40-46                      sc5 command

 exiting 46-47, 56                          converting old code to Version 6  285

 getting help 48                          se command

 insert mode 40-41, 52                      See also screen editor (se)

 keystroke macros 45-46, 55                 -d option 38

 maximum number of open files 39            default icons 26

 moving around in files 40, 51              syntax 38

 overwrite mode 41                          -v option 38

 replacing character strings 42-43, 53    se.dat file 38

 saving files 46-47, 56                   se.guide help database  28

 Screen Editor Help screen 28             Search pull down menu

 searching for character strings 41-42,      Line Number 51

     43, 53                                  Search Again 53

 split-screen mode 48                        Search and Replace 53

 starting  14, 38-39                         String Search  53


 

312 Index

 

 

 

Searches Method option                      compared with sc command 120

 Options pull-down menu 63                  default icons 26

 String Matching 41, 63                     define linker option 137

 Use Regular Expressions 63                 eliminating standard I/O window 137

searching for character strings 41-42       invoked by smake utility 19

 See also replacing character strings       linker messages 258-264

 backward searching 42                      specifying startup modules 141

 case sensitivity 42                        symbols created for residentable

 entering regular expressions 43                programs 144

 forward searching 41                       syntax 121

 keys 53                                   smake utility

 menu options 53                            compiling programs 18-19

 regular expressions 41                     definition 14

 String Matching option 41                  starting with Build icon 14

semicolon (;)                              smallcode compiler option 113, 132, 177

 Asm mode 62                               smallcode linker option 126

setbuf funnion 275                         smalldata compiler option 113, 132, 177

setbufv function 275                       smalldata linker option 126

setenv command 11                          snapshot files

shared libraries                            creating 142, 144

 creating 144                               hard drive corruption  142, 144

 using instead of overlays 127

Shell                                      solving problems

 environment for argv and argc 135-136       See problem solving

 printing messages in the Shell 143        source code

 programs linked with startup module        not placed in sc dlrenory tree 8

     141                                   source directory 7

 using SAS/C tools 22-25                   source file errors, correning 16, 19  24

Shift keys                                 source files, creating

 equivalence 60                             screen editor (se) 15-16, 22

 independent operation 60                   Shell 22

short integers                              Workbench 15-16

 problems with casting results     179     Source window (CodeProbe) 20-21, 25

shortintegers compiler option   112, 178,  sourceis= compiler option 113

   179, 183                                special keywords

SIGILL signal 274                            See keywords

SIGINT signal 274                          stack

signal funnion 274                           alignment problems 156

signed data types                            definition 160

 See data types and sizes                    managing stack space 160-161

signed keyword 177, 183                      purpose and use 174

sizeof operator                              running out of stack space 161

 portability of structures 183              __stack external definition 142

 preprocessor direnives 168                 __stack external long integer 160, 161

slash (/)                                   stack overflow routine (__ CXOVF) 160

 comment start sequence (/*) 168            stackcheck compiler option 113, 160, 161

 slashes (//) defining comment blocks 168   __stackext keyword 160-161

slink command                                affecting definitions of functions 155

 See also linker options                     managing stack space 160-161

 See also linking programs                   pointer register variables 161


 

                                                         Index 313

 

 

 

stackextend compiler option 113            stepping through programs 21

 managing stack space 160, 161             _STI preceding function name 145

 pointer register variables 161            __STKNEED external long integer 160,

 purpose and use 113                          161

standard I/O window                        storage classes 179-180

 changing window attributes 137-138         automatic 180

 declaring _ stdiowin external variable     external 180

     137                                    formal 180

 eliminating 137, 201                       register 180

 keeping open 20                            static 180

 keywords for controlling 138              strerror function 278

 program crashes caused by eliminating     __STRICT __ANSI preprocessor symbol

     138                                      85, 182

standard programs, creating 142            strict compiler option 114, 181-182, 183

standardio compiler option 114             strict reference-definition model 169

starter _ project directory 6, 14          String Search option, Search pull-down

startup= compiler option 114                  menu 53

startup files, modifying                   stringconst compiler option 114

 adding assign statements 10               stringmerge compiler option 114-115

 s:StartuP sequence file 5-6                declaring data items 177

 s:startupll 5                              effect on static objects 180

 s:user-startup file 5-6                    purpose and use 114-115

startup modules 140-145                     using overlays. 132 .

 See also autoinitialization function      stripdebug compiler option 116

                                           stripdebug linker option  126

 See also autotermmahon functlon           struct IntuiMessage 165, 166

 argument hmut, changmg 140-141            struct Message 166

 detachable programs (load and stay        struct WBStartup 136

     resident) 142-143

 linking with startup modules 141-144      Structureequivalence compiler option  116,

                                                   154,275

 list of modules 140                       structures

 modifying __main 140-141                   determining size and padding 183-184

 residentable programs 143-144              equivalent structures 164-166

  shared libraries 144                      implicit structure references 164

  Shell process restrictions 141            incomplete structure tags 188-189

 standard programs 142                       IntuiMessage structure 165, 166

 tasks performed by all modules 140         IOExtSer 166

 writing applications without startup       portability guidelines 185-186

     modules 145                            SAS/C Compiler behavior 271

startup option 141                          writing to disk file 184-186

statements                                 __stub library function 121

  SAS/C Compiler behavior 272              suppressed messages, enabling 265

static storage class 180                   swidth linker option 126

status line, screen edhor (se) 39-40       switch options 79

_STD preceding function name 145           Switch Windows option, Windows pull-down

__stdargs keyword 111                         menu 39

 affecting caller and callee lSS           Switch windows option, Windows pull-down

 purpose and use 111, 157-158                 menu 54

__stdiov37 external variable 138           switching between windows 38, 39, 48

__stdiowin external variable, declaring    symbols

   137-138                                   See linker symbols


 

314 Index

 

 

 

SYSBase                                     tolower.se, AREXX macro 70

 initialized by startup code 149            toupper.se, AREXX macro 70

system function 278                         translation (diagnostics)

system library base pointers                 SAS/C Compiler behavior 268

  See constlibbase compiler option          trigraph compiler option 116

system library bases, initializing 147-151

  automatically initialized library bases

     148-149                                U

  defining library bases in your code 149

  examples 148, 149-150                     udata hunk  172

 failure of libraries to open 150-151       undefined symbols, resolving  193-195

 library bases for .library files 149       underscore ( _ )

   library revision numbers 150              default prefix for functions 123

 

                                             preceding linker symbols 122

T                                           underscore compiler option 116

                                            undo command 44

                                            Undo Last Change option, Project pull down

Tab Expanslon Method opbon, Optlons pull-      menu 56

   down menu 62                             undoing changes 44, 56

tab stops, setting 61

tb utility 142, 144                          fifty line limit 44

Technical Support 29-34                      keys 56

 See also problem solving                    last line of text deleted 41

 BIX support 31                              menu options 56

 contacting 29-34                            Prompt Before Undo option 63

    ITS (Electronic Mail Interface to       unindent.se, AREXX macro 70

     Technical Support) 31-32               unions

 information required 33-34                  SAS/C Compiler behavior 271

 Internet support 31-32                     unnamed unions 163-164

 phone number requirement 33                unschar compiler option 272

 phone, mail, and fax support 30            unsigned data types

 problem description requirement 33_34       See data types and sizes

 registration number requirement 3, 33      unsigned keyword 177

 return address requirement 33              unsignedchar compiler option    116, 177

 Usenet support 31-32                       utilitylibrary compiler option  117

 version number requirement 33

 when to call 29-30

telephone numbers for Technical Support     V

   30

text hunk 172                               -v option, se command 38

time and date                               variables

 locale specific behavior 278-279            displaying values 21

__TIME preprocessor macro 273                national characters in variable names

time zone, default 278                           168

__tinymain routine 290                      verbose compiler option 117, 173

to= compiler option 116                     verbose linker option 126

to linker option 126                        verify linker option 126

Toggle Display Size option, Windows pull-   version compiler option 117

   down menu 39, 54                         Version 5, converting

Toggle Screen Size option, Windows pull-     See converting from Version 5 to

   down menu 48                                  Version 6


 

                                                         Index 315

 

 

 

W                                              X

 

/WAIT keyword 138                              _ XCEXIT function 151

warn= compiler option                          XDEFS in hunks 172

 enabling suppressed messages 265              xref linker option 127

 enabling warnings 183                         xreference compiler option 118

 purpose and use 117-118                       xreferenceheaders compiler option  118

warnings, enabling                             xreferencesystem compiler option 119

 See also error and warning messages

 See also warn= compiler option

 incomplete structure tags 189                 Z

 narrow types 188

warnvoidreturn compiler option  118           zero-length arrays  163-164

widest operand 178

width linker option 126

windows                                        Special Characters

 displaying two files 39

 managing in screen editor (se) 47-48, 54      {} (braces)

 switching between windows in screen            See braces ({ })

     editor (se) 38, 39                        \ (backslash)

 text window size in screen editor (se) 39      See backslash (\)

Windows pull down menu                         / (slash)

 Close Window 54                                See slash (/)

 Create New CLI 54                             + (plus sign)

 Interlace Toggle 54                            See plus sign (+)

 Open Window 47, 54                            * (asterisk)

 Switch Windows 39                              See asterisk (*)

  Switch windows S4                            *__procname external definition 142

 Toggle Display Size 39, 54                    ; (semicolon)

 Toggle Screen Size 48                          See semicolon (;)

with= compiler option 118                      , (comma)

with files                                      See comma (,)

 asterisk (-) indicating depth of overlay      _(underscore)

     tree 129                                   See underscore ( _ )

 examples 130-131                              ? (question mark)

 format 129                                     See question mark (?)

 plus sign (+) separating filenames 129        : (colon)

 pound sign (#) terminating overlay tree        See colon (:)

     129                                       # (pound sign)

with linker option 127                          See pound sign (#)

Workbench 135-138                              @ (at sign)

 environment for argv and argc 136              See at sign (@)

 program structure, example 136

 running programs 135-138

 standard I/O window management                1

     137-138

 using SAS/C tools 14-21                       16-bit address

Write option, Block pull down menu 53           advantages and disadvantages 176

writing portable code                           relative to program counter 176

 See portable code, writing                     relative to register A4 176


 

316 Index

 

 

 

16-bit references

  specifying with code = compiler option

     87

  __far keyword  156

  __near keyword  156

 

 

 

3

 

32-bit address

  advantages and disadvantages  176

32-bit references

  chip data  176

  specifying with code = compiler option

       87


  SYSOP's Hut     Rush              CO-SYSOP's LawnMower Man  Nickel

          Falcon  Red Wizard                   CMDR Quack     Beast        

                 ___          _

        ____    /   \        / \__________________________________

       (THE_\  /     \      /    )             _                  )

        \_/ \\/       \    /    /    _________/(___     ________ /

             )    /\   \  /    /    (________      \    \      //

            /    / /_   \/    /             /      /_    \    //

           /    / // \       /     ___ ____/      // \    \  //

         _/    (_/(___)     (_)   (___)\_________/(___)    \//

        /                                                   ( 

       (_____________________________________________________)

        

         Running CNet v2.63 with a USRobotics 16.8 Dual Standard

            ________ ____ _____/\  __/\ ______  _/\__    __/\   

  C00l US HQ\___  _//   ¬\\__    \/    \\_    \ \_   \  /    \  

               / ||/  |  \\|~  : /   :  \/  :  \/~|  \\/  :   \

              /  ·|\\ ¦  //|     \\  !  /       \ :    \  |   /

              \___| \____/ |__|\\ X  :_/~\\ |___/ _____/\  __/ 

            ....................\/.\/.....\/....\/LawNmoV\/....

 

 NODE 1 <<<<The_NET>>>> 407-656-8205  NODE 3 <<<<The_NET>>>> 407-656-8246

 NODE 2 <<<< RUSH  >>>> 407-896-8113  NODE 4 <<The_Dungeon>> 407-654-0456

 NODE 5 < High Society> 717-654-5061

[4;32m                                                                             [0m

[4;31;43m                     NOW CALL: 1-407-656-8246!!!                               [0m[24;1H                                                                             [22;1H



Part1 - Part2