Neda Communications, Inc.
17005 SE 31st Place
Bellevue, WA 98008
June 15, 1999
Intel is a trademark of the Intel Corporation. UNIX is a trademark of AT&T. XENIX is a registered trademark of Microsoft Corporation. MS-DOS is a registered trademark of Microsoft Corporation. VRTX is a trademark of Hunter & Ready Inc. VMS and VAX are trademarks of Digital Equipment Corporation. IBM and PC are trademarks of International Business Machines Corporation.
This document describes the VoRDE Library, a utility which
aids in the consistency of portable implementation of Voice
Response Development Environment.
Copyright ©1988, 1989, 1994 Mohsen Banan.
Copyright ©1994, 1995 Neda Communications, Inc.
Published by Neda Communications, Inc.
17005 SE 31st Place
Bellevue, WA 98008 USA
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the Copyright holders.
VoRDE is Neda Communications, Inc.'s Voice Response Development Environment. VoRDE provides a convenient environment for developing and managing Voice Response applications. A simple yet powerful language called "V" enables ordinary computer users to create Voice Response applications. More complex applications can be developed in "C" through the services provided by VoRDE. Finally, user-developed "V" application programs, powerful "C" generated applications and a great number of Voice Response Management capabilities are all integrated into a system that makes Voice Response a reality of today.
This publication applies to VoRDE - Neda Communications, Inc.'s Voice Response Development Environment as implemented for a computer equipped with Dialogic hardware and MSDOS operating system.
VoRDE is a collection of generalized commands, voice programming tools, software libraries, and related publications. Typically, a voice application programmer, a voice response system manager, and a casual end user will require access to different subsets of this collection. Anyone coming to VoRDE for the first time will find it useful to read through an overview of concepts and facilities.
The following section provides such an overview. Where appropriate, reference to other sections of this publication or other related publications will be made.
This manual is written in LATEXinfo. LATEXinfo is a documentation system that uses a single source file for both on-line documentation and a printed manual. See the LATEXinfo Manual for more details [8].
The on-line documentation is in the form of an Info file. An on-line Info file is a file formatted so that the Info documentation reading program can operate on it. Info files are divided into pieces called nodes, each of which contains the discussion of one topic. M-x info in emacs and xinfo under X11 are two Info documentation reading programs that can be used for on-line manipulation of this manual.
Other Voice Processing documents that are available through VoRDE.ORG:
This section describes VoRDE in terms familiar to a computer user. Figure 2.1 represents the functional component of VoRDE.
The Dialogic board contains a processor with its own ROM and RAM. Contained in the read-only portion of the memory on the Dialogic board is firmware (DX-FIRMWARE) that provides the basic voice response capabilities for controlling telephone lines.
On the host computer, VoRDE components provide an interface to the Dialogic board (i.e. the Board Specific Host Software) and a voice response device independent interface (i.e. Neda Open Source Voice Development Environment).
VoRDE services can logically be divided into two basic categories:
Details of each will be described later.
TTSCF services can logically be categorized as Phonetic Speech Synthesizer.
For more detail information on Development and Target Environments, please refer to Open C Platform document. [1]
Voice Response applications can be developed through a simple Voice Response application generator language called "V". The V-Module section of this document describes this language.
Voice Response applications can also be developed in "C". A complete library of Voice Response Development services (VR-LIB) is provided. Applications developed through (VR-LIB) can co-exist with other applications written in "V". The C-Module section of this document describes the proper use of VR-LIB.
A Voice Response application is a sequence of desired Voice Response actions. A Voice Response application can be assigned to one or more telephone lines (Phone-Port). Once assigned to a Phone-Port, that telephone line will perform the actions defined in the application.
VoRDE consists of a number of modules that are clustered into five principle groups.
The PP_ module is the interface to an abstract telephone handler module. This abstract interface is asynchronous. An action is requested and some time later an event is observed.
several entities that may be using it. This is supported through the concept of a Service Access Point (SAP). A Service Access Point is defined as the interface between a service user and a service provider.
Each SAP is identified by the PP_ module through a SAP-Address (PP_SapAddr).
delete a SAP (PP_sapDelete).
user entity.
One or more Phone-Ports can be associated with a SAP. Association of a Phone-Port to a SAP is accomplished through the PP_attach facility. Once a Phone-Port has been attached to a SAP, all events associated with that Phone-Port will be delivered to the SAP to which it is attached. A Phone-Port can be not be attached to more than one SAP.
An action primitive is a request to the
typedef struct PP_Event {
struct PP_Event *next;
struct PP_Event *prev;
PP_PortDesc portDesc;
PP_EventId evtId;
union EventData {
PP_PlayCnf playCnf;
PP_GetDtmfCnf getDtmfCnf;
PP_RecordCnf recordCnf;
PP_DialCnf dialCnf;
} evtData;
} PP_Event;
VM_ module operates on voice messages. A voice message in the D40/MS-DOS implementation is a DOS file.
#include "spa.h" void SPA_vMsgDomainSet(String domain) String SPA_vMsgDomainGet(void) SPA_PlayResult SPA_vMsgPlayN(PP_PortDesc portDesc, String vMsg, Int nuDtmfs) SPA_PlayResult SPA_wordSeqPlayN(PP_PortDesc portDesc, String wordSeq, Int nuDtmfs) SuccFail SPA_dtmfWaitFor(PP_PortDesc portDesc, Int nuDtmfs, String dtmfTerms, Int wait, Char *buf, Char *bufEnd) SuccFail SPA_mfWaitFor(PP_PortDesc portDesc, Int nuDtmfs, String dtmfTerms, Int wait, Char *buf, Char *bufEnd) SuccFail SPA_dtmfGenerate(PP_PortDesc portDesc, String dtmfStr)
A voice response application in VoRDE environment is a state table that is executed by PM_Machine. PP_ module can be used to assign a name to an application and to assign the application to one or more Phone-Ports.
PM_ module provides the service of dynamic creation of state tables and event driven execution of these state tables. Several state tables (Applications) may exist within a program (process). Each of these state tables may be associated with one or more Phone-Ports.
Sections 5.4.2 address the categories of services provided by the PM_ module.
The PM_ state machine, takes as input the
the Phone-Port.
There is a PM_Machine associated with each Phone-Port. Each PM_Machine consists of:
- A Stack. - Memory for static variables. - State Information.
PM_ states may dynamically be generated and linked together to generate state tables (Voice Response Applications).
A state is normally generated through a facility which has the form PM_genStateName. % 'StateName'% is the name of the desired state. For example to generate a state that would play a file, the user would:
{
PM_State *state;
state = PM_genPlayN(0, "hello.vox");
}
A state table is a linked set of states. PM_States are linked together through PM_Events.
PM_addState facility is used to link two states together with an event.
The V compiler consists of two elements. A macro pre-processor identical in capabilities to the C pre-processor, and an application state generator.
The pre-processor is a portation of "Decus CPP" to MS-DOS environment.
The state generator, parses the syntax specifies in the V-Module section and produces states according to its input.
#include "ui.h"
#include "ui_menu.h"
The user interface to VoRDE is a Nested Menu Handler (NMH).
Appendix 'A' has a description of the commands and features supported by NMH.
User of NMH defines a menu by creating a MenuDef and a set of MenuItems that go with it. Each MenuItem has associated with it either a pointer to a function or a pointer to a MenuDef. When the console user issues the command corresponding to a MenuItem which has a function associated with it. NMH indirectly invokes the user supplied function. Syntax of the invocation is:
(*menuFunc)(argc, argv, env);
Int argc;
String *argv;
UI_Environment *env;
argc and argv are the translated information that was obtained from
the console user.
env describes the user interface environment and must only be used
in conjunction with UI_ facilities.
It is the responsiblety of the application program to interpret
argc and argv.
Once one or more applications have been declared, defined and assigned to Phone-Ports, each Phone-Port executes the application assigned to it. Voice response applications can be developed in V or in C, as described in "Voice Response Application Development" of this publication.
VC is the name of the program that integrates C developed applications, the V compiler, and Voice Response management capabilities. While voice response applications are being executed, the status of the Voice Response system can be monitored and managed through an interactive menu oriented interface running on the console. The following sections describe the features and the services provided by the console menu interface.
A simple yet powerful user interface is provided through the Nested Menu Handler (NMH). Appendix NMH-APDX outlines the basic features provided by this menu handler. The following sections describe specifics of each menu level.
The prompt for the root menu is "VoRM". A list of available menu options follows:
A list of available applications is reported.
The current status of each Phone-Port is reported.
The current association of Phone-Ports to applications is reported.
Nested Menu Handler (NMH) is a simple menu based user interface.
A menu command is the first character of the first word on the command line. Only the first character is significant. A '?' provides a list of available commands. Illegal commands result in a reminder of the availability of '?'.
If the command corresponds to a menu function, that function is invoked. If the menu function expects arguments, the arguments can be issued on the command line.
If the command corresponds to another menu, that menu becomes active. Every menu level has a "menu prompt" associated with it. When the user enters a menu, previous menu prompts are concatenated to the current prompt and displayed. This reminds the user of which submenu he is currently at.
Characters listed in the following table are treated specially by the menu handler:
'?' Display all menu items.
' ' Argument Separator.
';' Command Separator.
'\bs ' Command terminator.
'x' Pop the menu Stack.
'\bs ' Go to Root level menu.
All Neda Communications, Inc. programs conform to the Proposed Syntax Standards for Unix System Commands put forth by Kathy Hemenway and Helene Armitage of AT&T Bell Laboratories in Unix/World, Vol.1, No.3, 1984. Some of these rules are:
This section describes TTSCF in terms familiar to an computer user. Figure 7.1 represents the functional components of TTSCF.
+-------------------------------------------------------------- + | U S E R | +-------------------------------------------------------------- + +------------------+ +-------------------+ +-----------------+ | TEXT TO SPEECH | | NESTED | | TEXT TO SPEECH | | APPLICATIONS | | MENU | | LIBRARY | | | | HANDLER | | | +------------------+ +-------------------+ +-----------------+ +--------------+ +----------------------------------------+ | | | ENGLISH | | | | PHRASE | | | | ANALYZER | | | +----------------------------------------+ | | +---+ +--------+ +--------------------+ | | | T | | IPA | | | | | | A | | DICT- | | ENG2IPA | | | | B | | IONARY | | by rules | | TELEPHONE | | L | +--------+ +--------------------+ | | | E | | LINE | | | | | | E | +--------+ +--------------------+ | INTERFACE | | D | | SCA | | | | | | I | | DICT- | | IPA2SC | | | | T | | IONARY | | by rules | | | +---+ +--------+ +--------------------+ | | +----------------------------------------+ | | | | | | | SC01 INTERFACE | | | | | +--------------+ +----------------------------------------+ +-------------------------------------------------------------- + | PHONEME GENERATOR HARDWARE INTERFACER | +-------------------------------------------------------------- + +============================================================== + | PHONEME GENERATOR HARDWARE | =============================================================== +
There are a limited number of sounds that make up words in human languages. In linguistics these sounds are referred to as phonemes. Any word may be created by a sequence of phonemes. Phoneme Synthesis Technique is best suited for applications that require unlimited vocabularies.
Table 7.1 presents a list of English phonemes. International Phonetic Alphabet (IPA) assigns a set of symbols to phonemes. Most of these symbols are not available on an ordinary typewriter setting. A set of one and two character Latin alphabet codes are assigned to phonemes. These codes will be used for IPA expressions.
Electronic Phoneme synthesizers are devices capable of producing the phoneme sounds through corresponding digital code. Votrax SC01 is one popular phoneme synthesizers currently available.
Ideally the input to a phonetic speech synthesizer should be a string of ASCII characters that is readable by a human. In order to provide complete text-to-speech capabilities, TTSCF uses a multi step process that converts ASCII text into natural sounding speech waveforms. Individual steps of this process are:
The following table provides a list of the functions used for conversion required for transformation of text to speech.
|
Two user maintained phonetic dictionaries are used by TTSCF software. These phonetic dictionaries may be used to conversion rules when desired.
English to IPA dictionary is a relation that contains tuples of the form: <"english-word": "ipa-string">. This dictionary can be maintained by the "Binary Table Editor".
English to IPA conversion is done through a set of phonetic rules published by the Naval Research Laboratories. Each rule has the form:
[left] [match] [right] [out]
[left] [match] [right] [out]
In the United States you can dial a phone number using two completely independent methods: Tones and Dial Pulses. The information presented below has been gathered from Refs. 1 and 3. Since in this project the existence of DTMF facilities is being assumed and is the method used, more emphasis will be placed on the Tone method.
Each time you hold down a key on your push botton telephone set a pair of audio frequency signals is transmitted over the telephone voice channel. Central-office switching facilities decode these tones and connect the desired circuits based on the sequence of tone pairs received. Each tone must last long enough and there must be adequate separation between them. A tone pair duration of about 150 ms and a separation of about 75 ms works.
Each of these tones is composed of two pure sine waves of different frequencies superimposed on each other. These two frequencies explicitly represent one of the digits on the telephone key-pad.
The telephone key-pad can be thought of as a 4 row by 3 column matrix. Associated with each row is a specific frequency belonging to the low group (697 to 941 HZ) and corresponding to each column is a unique frequency of the high group (1209 to 1633 HZ). All the keys in a given row or column have one tone in common (see Table 1.1). For example, pressing the digit "9" (row 3 and column 3) produces 852 Hz and 1477 Hz tones simultaneously, while pressing a "5" produces 770 and 1336 HZ tones.
The full DTMF-encoding standard defines four rows and four columns for a total of 16 two-tone combination. Standard telephones use only 12 of these combinations. Depending on the application, these extra codes may be useful. Most tone decoding devices allow a 2 per cent tolerance on DTMF frequencies. This creates a range of acceptable frequencies, which is demonstrated in Table (1.2).
When you pick up the receiver on a telephone, an electrical connection is made to the lines leading to the central office. When you replace the receiver on the cradle the connection is broken or interrupted. This applies to both push-button and rotary dial telephones.
By periodically breaking the connections leading to the central office a number can be dialed. The number of interruptions is equal to the digit dialed, with the exception that ten interruptions corresponds to zero. These pulses may be generated at the rate of ten times per second and there should be a 1/2 second delay between each two digits.
The rotary dial on the telephone is a mechanical device which periodically breaks the connection leading to the central office. When the rotary dial is released, as it travels back to its resting position, it breaks the connection at a rate of ten times per second thus dialing the digit.
Numbers can also be dialed by pushing the cradle switch button at a rate of ten times per second. A solenoid plunger that is mounted to depress and release the cradle switch on the telephone set may be used to dial numbers using the dial pulses technique.
VoRDE is distributed on three diskettes.
The source is in "Shell Archive" format. The archive file is "vc.shr". A mini-shell called "sharsh.exe" is provided for expansion of the archive in MS-DOS environment. A brief description of the files on the source diskette follows:
This section describes the procedure for the generation of VoRDE from the C source. This Generation procedure supports two environments.
VoRDE has been developed with portability in mind. VoRDE may easily be ported to any environment that has a C compiler that conforms to the proposed ANSI X3J11 specification.
Make sure that your MSC compiler is properly installed. Make sure that the compiler may be invoked through "msc " command. Follow these steps:
When build terminates, vc.exe and vpp.exe are produced.
Follow these steps:
When make terminates, vc/vc.exe and vpp//vpp.exe are produced.
Copy vc.exe and % 'vpp.exe'% from the binary diskette to your executables directory. Install the Dialog 40 driver. Verify the installation of the V Compiler by invoking "vc config.v" from the binary diskette directory. Call the system and see it perform.
PCSTB-1 is distributed on two diskettes.
This section describes the procedure for the generation of PCSTB-1 from the C source. This Generation procedure supports two environments.
PCSTB-1 has been developed with portability in mind. PCSTB-1 may easily be ported to any environment that has a C compiler that conforms to the proposed ANSI X3J11 specification.
Make sure that your MSC compiler is properly installed. Make sure that the compiler may be invoked through "msc " command. Follow these steps:
When build terminates, pcstb1/bs pcstb1.exe and eng2ipa/bs eng2ipa.exe are produced.
When make terminates, pcstb1/pcstb1 and eng2ipa/eng2ipa are produced.
Copy pcstb1.exe and % 'eng2ipa.exe'% from the binary diskette to your executables directory. Execute demo.bat and see the system perform.
Copyright ©1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
[This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.]
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library.
Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license.
The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such.
Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better.
However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a ``work based on the library'' and a ``work that uses the library''. The former contains code derived from the library, while the latter only works together with the library.
Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one.
A ``library'' means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The ``Library'', below, refers to any such software library or work which has been distributed under these terms. A ``work based on the Library'' means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term ``modification''.)
``Source code'' for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
However, linking a ``work that uses the Library'' with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a ``work that uses the library''. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a ``work that uses the Library'' uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
For an executable, the required form of the ``work that uses the Library'' must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does. Copyright (C) year name of author
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice
That's all there is to it!