Discarded tofrodos sources files that were accidentally kept around
This commit is contained in:
parent
1a260f04ce
commit
ae1454911c
26 changed files with 0 additions and 3459 deletions
|
@ -1,339 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 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.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, 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 software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, 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 redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
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 Program, 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 Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, 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 executable. 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.
|
|
||||||
|
|
||||||
If distribution of executable or 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 counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
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 Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. 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 program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; 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.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
|
@ -1,60 +0,0 @@
|
||||||
Distribution file list and directory structure for Tofrodos
|
|
||||||
http://www.thefreecountry.com/tofrodos/index.shtml
|
|
||||||
Copyright 2002-2013 by Christopher Heng. All rights reserved.
|
|
||||||
-------------------------------------------------------------
|
|
||||||
|
|
||||||
# Main directory
|
|
||||||
|
|
||||||
todos.exe precompiled Win32 console application
|
|
||||||
fromdos.exe precompiled Win32 console application
|
|
||||||
|
|
||||||
readme.txt Read this file first
|
|
||||||
filelist.txt You're currently reading this file
|
|
||||||
tofrodos.html Tofrodos manual (HTML)
|
|
||||||
tofrodos.lsm Brief information about tofrodos (for
|
|
||||||
the Linux Software Map)
|
|
||||||
COPYING Text file containing the GNU General Public License v2
|
|
||||||
|
|
||||||
|
|
||||||
# source code and makefiles
|
|
||||||
|
|
||||||
src\
|
|
||||||
|
|
||||||
config.h Change variables here if you're porting tofrodos
|
|
||||||
emsg.c Error message logging and display function
|
|
||||||
emsg.h Error messages header
|
|
||||||
tofrodos.h Main header
|
|
||||||
utility.h Utility functions header
|
|
||||||
version.h Version number header
|
|
||||||
utility.c Utility functions
|
|
||||||
tofrodos.c Main program and functions
|
|
||||||
init.c Initialization functions
|
|
||||||
|
|
||||||
fromdos.1 Linux/Unix man page for tofrodos
|
|
||||||
|
|
||||||
# Makefiles for other MSDOS/Windows compilers
|
|
||||||
|
|
||||||
makefile.min MinGW Makefile
|
|
||||||
makefile.wcc Watcom Makefile
|
|
||||||
makefile.vs7 Visual Studio .NET 2003 makefile
|
|
||||||
|
|
||||||
# Makefiles for Linux
|
|
||||||
|
|
||||||
Makefile Linux makefile
|
|
||||||
makefile.gcc Duplicate of Makefile
|
|
||||||
|
|
||||||
# Miscellaneous source files (for MSDOS/Windows compilation)
|
|
||||||
|
|
||||||
src\lib\
|
|
||||||
|
|
||||||
mktemp.c mkstemp() for deficient systems
|
|
||||||
mktemp.h
|
|
||||||
getopt.c getopt() for deficient systems
|
|
||||||
getopt.h
|
|
||||||
|
|
||||||
|
|
||||||
# Empty Directories for "make" to use for various platforms/targets
|
|
||||||
|
|
||||||
src\bin
|
|
||||||
|
|
||||||
src\lib\bin
|
|
Binary file not shown.
|
@ -1,429 +0,0 @@
|
||||||
Tofrodos Ver 1.7.13
|
|
||||||
Copyright 1996-2013 Christopher Heng. All rights reserved.
|
|
||||||
----------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
Contents
|
|
||||||
--------
|
|
||||||
|
|
||||||
1. What Is Tofrodos?
|
|
||||||
2. How To Install Tofrodos
|
|
||||||
3. Compiling Tofrodos In Linux, Mac OS X and Unix-type Systems
|
|
||||||
4. Compiling Tofrodos In Msdos And Windows
|
|
||||||
5. Porting To Other Systems
|
|
||||||
6. History Of Changes
|
|
||||||
7. Copyright And Contacting The Author
|
|
||||||
|
|
||||||
|
|
||||||
1. What Is Tofrodos?
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
DOS text files traditionally have CR/LF (carriage return/line feed) pairs
|
|
||||||
as their new line delimiters while Unix text files traditionally have
|
|
||||||
LFs (line feeds) to terminate each line.
|
|
||||||
|
|
||||||
Tofrodos comprises two programs, "fromdos" and "todos", which convert
|
|
||||||
ASCII and Unicode UTF-8 text files to and from these formats. Use "fromdos"
|
|
||||||
to convert DOS text files to the Unix format, and "todos" to convert Unix
|
|
||||||
text files to the DOS format.
|
|
||||||
|
|
||||||
|
|
||||||
2. How To Install Tofrodos
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
a. Windows 9x/ME/NT/2k/XP/Vista/7
|
|
||||||
|
|
||||||
The Tofrodos package comes with sources as well as precompiled
|
|
||||||
executables (binaries) for the Windows console mode. If you
|
|
||||||
want to install everything, just unpack the archive into
|
|
||||||
a directory of your choice.
|
|
||||||
|
|
||||||
Alternatively, if you only want to use the executables and
|
|
||||||
don't want to bother with the sources, just do the following
|
|
||||||
from a Windows console (command prompt):
|
|
||||||
|
|
||||||
copy todos.exe {destination directory}\todos.exe
|
|
||||||
copy fromdos.exe {destination directory}\fromdos.exe
|
|
||||||
copy tofrodos.html {destination directory}\tofrodos.html
|
|
||||||
|
|
||||||
To read the manual, open the tofrodos.html file with a web browser.
|
|
||||||
|
|
||||||
If you work on the command line often, you might want to
|
|
||||||
consider putting the directory where you placed the tofrodos
|
|
||||||
executables in your PATH.
|
|
||||||
|
|
||||||
Note that if you prefer the names "dos2unix.exe" and
|
|
||||||
"unix2dos.exe", just make a copy of "todos.exe" (or "fromdos.exe")
|
|
||||||
under those names. Tofrodos automatically detects the name under
|
|
||||||
which it is run, and will change its behaviour accordingly.
|
|
||||||
(That is, "dos2unix" will convert files from the DOS format to
|
|
||||||
the Unix format, and "unix2dos" will convert files from the
|
|
||||||
Unix format to the DOS format.)
|
|
||||||
|
|
||||||
b. MSDOS/FreeDOS and Clones
|
|
||||||
|
|
||||||
You will need to compile the sources. See the section
|
|
||||||
"Compiling Tofrodos in MSDOS and Windows", particularly
|
|
||||||
the section on using OpenWatcom C/C++.
|
|
||||||
|
|
||||||
c. Linux, Mac OS X, Unix-type systems
|
|
||||||
|
|
||||||
See the section "Compiling Tofrodos in Linux, Mac OS X
|
|
||||||
and Unix-type Systems"
|
|
||||||
|
|
||||||
d. Other systems
|
|
||||||
|
|
||||||
See the section "Porting to Other Systems".
|
|
||||||
|
|
||||||
|
|
||||||
3. Compiling Tofrodos In Linux, Mac OS X and Unix-type Systems
|
|
||||||
--------------------------------------------------------------
|
|
||||||
|
|
||||||
I've stopped distributing precompiled versions of Tofrodos for
|
|
||||||
Linux for two main reasons. There are just too many distributions
|
|
||||||
to compile for and it's a simple matter to do it yourself. The
|
|
||||||
process is painless and fast, since the source code compiles
|
|
||||||
out-of-the-box.
|
|
||||||
|
|
||||||
To compile everything, simply do the following:
|
|
||||||
|
|
||||||
cd src
|
|
||||||
make all
|
|
||||||
|
|
||||||
You can then install by typing
|
|
||||||
|
|
||||||
make install
|
|
||||||
|
|
||||||
Since you're installing the binary and manual page into your
|
|
||||||
system directories with this command, you'll need to be
|
|
||||||
logged in as root (either directly, or via "su" or "sudo").
|
|
||||||
(I know this is stating the obvious, but it's just in case
|
|
||||||
you're new to installing programs.)
|
|
||||||
|
|
||||||
To install them somewhere other than /usr/bin and /usr/man/man1,
|
|
||||||
redefine BINDIR and MANDIR for the binary and manual page
|
|
||||||
destinations respectively. For example, to install the binaries
|
|
||||||
in /usr/local/bin and the manual page in /usr/local/man/man1,
|
|
||||||
do the following:
|
|
||||||
|
|
||||||
make BINDIR=/usr/local/bin MANDIR=/usr/local/man/man1 install
|
|
||||||
|
|
||||||
Note that Mac OS X does not have a specific directory for
|
|
||||||
man pages. As such, simply typing "make install" will fail on
|
|
||||||
that system. You will need to set MANDIR to some directory that
|
|
||||||
you know exists.
|
|
||||||
|
|
||||||
To read the manual page after installation, simply type
|
|
||||||
|
|
||||||
man fromdos
|
|
||||||
|
|
||||||
If you've installed MANDIR to a non-standard location, so
|
|
||||||
that the above does not work (such as you may have done
|
|
||||||
on Mac OS X), just specify the path, for example:
|
|
||||||
|
|
||||||
man ./fromdos.1
|
|
||||||
|
|
||||||
There should be no errors or warnings in the compilation.
|
|
||||||
|
|
||||||
Note that if you prefer the names "dos2unix" and
|
|
||||||
"unix2dos", just rename the binaries accordingly and you're done.
|
|
||||||
Tofrodos automatically detects the name under which it is run,
|
|
||||||
and will change its behaviour accordingly. That is, "dos2unix"
|
|
||||||
will convert files from the DOS format to the Unix format,
|
|
||||||
and "unix2dos" will convert files from the Unix format to the
|
|
||||||
DOS format. No code changes are necessary.
|
|
||||||
|
|
||||||
|
|
||||||
4. Compiling Tofrodos In MSDOS And Windows
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
Tofrodos comes with binaries (executables) for the Windows console
|
|
||||||
mode. However, if you prefer to recompile tofrodos yourself,
|
|
||||||
there are a few makefiles you may use, depending on the compiler
|
|
||||||
you have on your system.
|
|
||||||
|
|
||||||
To compile Tofrodos under MSDOS or Windows 9x/XP/Vista/7, simply use
|
|
||||||
the appropriate makefile for your compiler or roll your own.
|
|
||||||
|
|
||||||
If you want a trouble-free compilation, you should probably use
|
|
||||||
the Open Watcom C compiler (which is free), since that is the
|
|
||||||
compiler I currently use for creating the precompiled binaries
|
|
||||||
for Windows.
|
|
||||||
|
|
||||||
In case it's not clear from the above paragraph, please note
|
|
||||||
that although I provide makefiles for a few other compilers, most
|
|
||||||
of them were only tested with earlier versions of Tofrodos
|
|
||||||
and not the current version.
|
|
||||||
|
|
||||||
Makefiles for use with the following compilers and their MAKE
|
|
||||||
utilities are as follows:
|
|
||||||
|
|
||||||
makefile.wcc OpenWatcom C/C++ 1.9 and WMAKE.EXE (DOS 16/32 bit
|
|
||||||
and Win32 targets)
|
|
||||||
makefile.vs7 Visual Studio .NET 2003 and NMAKE.EXE (Win32 target)
|
|
||||||
makefile.min MinGW 3.1.0 and mingw32-make.exe (Win32 target)
|
|
||||||
Makefile Linux makefile. Do not use for Windows or DOS.
|
|
||||||
|
|
||||||
Note that the file Makefile is for use with the GNU C compiler and
|
|
||||||
GNU make on a Linux system. Do not use it under Windows or MSDOS.
|
|
||||||
To avoid using it by default, make sure you specify the makefile
|
|
||||||
name on your compiler system's "make" command line.
|
|
||||||
|
|
||||||
These makefiles can probably be adapted for other compilers or other
|
|
||||||
versions of the above compilers.
|
|
||||||
|
|
||||||
You can get free versions of most (if not all) of the supported
|
|
||||||
compilers from
|
|
||||||
http://www.thefreecountry.com/compilers/cpp.shtml
|
|
||||||
|
|
||||||
i. Recompiling with OpenWatcom C/C++
|
|
||||||
|
|
||||||
To recompile with OpenWatcom C/C++, copy the files
|
|
||||||
src\startup\wildargv.c
|
|
||||||
src\startup\initarg.h
|
|
||||||
from your WATCOM directory to the src\lib subdirectory. For example, if
|
|
||||||
you installed Watcom to c:\watcom, and you expanded the tofrodos
|
|
||||||
package into d:\tofrodos, do the following:
|
|
||||||
copy c:\watcom\src\startup\wildargv.c d:\tofrodos\src\lib
|
|
||||||
copy c:\watcom\src\startup\initarg.h d:\tofrodos\src\lib
|
|
||||||
|
|
||||||
If you cannot find wildargv.c on your hard disk, you probably did not
|
|
||||||
install the startup source code or have somehow deleted it. Just reinstall
|
|
||||||
OpenWatcom again, this time with the necessary options.
|
|
||||||
|
|
||||||
To create a Windows console executable, the following command line can be
|
|
||||||
used:
|
|
||||||
cd src
|
|
||||||
wmake -f makefile.wcc TARGET=Win32 all
|
|
||||||
|
|
||||||
To create the MSDOS executables, do the following:
|
|
||||||
cd src
|
|
||||||
wmake -f makefile.wcc TARGET=16bit all
|
|
||||||
|
|
||||||
Make sure you do a
|
|
||||||
wmake -f makefile.wcc clean
|
|
||||||
before compiling again for a different target or the response files
|
|
||||||
and object files will be wrong for the new target.
|
|
||||||
|
|
||||||
Note that the included precompiled Windows executable was compiled
|
|
||||||
with OpenWatcom 1.9.
|
|
||||||
|
|
||||||
ii. Recompiling with Visual C++
|
|
||||||
|
|
||||||
Visual C++ (from Visual Studio) can only create Win32 console
|
|
||||||
executables. Use the following procedure to create todos.exe
|
|
||||||
and fromdos.exe.
|
|
||||||
|
|
||||||
cd src
|
|
||||||
nmake -f makefile.vc all
|
|
||||||
|
|
||||||
There should be no warnings or errors. Note that the latest
|
|
||||||
version of tofrodos was not tested with Visual C++.
|
|
||||||
|
|
||||||
iii. Recompiling with MinGW
|
|
||||||
|
|
||||||
To compile with MinGW, use the GNU Make utility (mingw32-make.exe)
|
|
||||||
with makefile.min as follows:
|
|
||||||
|
|
||||||
cd src
|
|
||||||
mingw32-make -f makefile.min all
|
|
||||||
|
|
||||||
Note that the latest version of tofrodos was not tested with
|
|
||||||
MinGW. However, since MinGW uses GCC, and I test all versions of
|
|
||||||
tofrodos using GCC on Linux, it should theoretically work fine.
|
|
||||||
|
|
||||||
|
|
||||||
5. Porting To Other Systems
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
If you want to compile Tofrodos for a system other than Linux, MSDOS
|
|
||||||
or Windows you may or may not have some work in store for you. The
|
|
||||||
program is fairly trivial, so the work you need to do is probably
|
|
||||||
(hopefully) minimal.
|
|
||||||
|
|
||||||
The first place to look into is probably the config.h file, where I
|
|
||||||
tried to place as many system and compiler macros as I could bother.
|
|
||||||
|
|
||||||
If you are compiling on other Unix systems, tweaking the config.h file
|
|
||||||
macros may well be all that you need to do. I have reports of success
|
|
||||||
with people using it on HP-UX and others.
|
|
||||||
|
|
||||||
|
|
||||||
6. History Of Changes
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Dates given are the dates where the code base was finalised and do not
|
|
||||||
necessarily refer to the date of public release.
|
|
||||||
|
|
||||||
Version 1.7.13 25 October 2013
|
|
||||||
- [Hurd, NetBSD, FreeBSD kernel] Added support for Hurd,
|
|
||||||
NetBSD and FreeBSD kernel (a system that uses the FreeBSD
|
|
||||||
kernel, but is not necessarily the full FreeBSD system).
|
|
||||||
As a side benefit, tofrodos is slightly more portable since
|
|
||||||
it no longer depends on certain system-specific macros
|
|
||||||
(namely MAXPATHLEN from sys/param.h).
|
|
||||||
- [All] Tofrodos now displays information on what to do if
|
|
||||||
it is not able to rename the temporary file back to the
|
|
||||||
original filename after a successful conversion.
|
|
||||||
- [All] The -a option is now documented as "deprecated",
|
|
||||||
since you shouldn't use it unless you have an unusual
|
|
||||||
text file that you're trying to fix.
|
|
||||||
- [All] Minor improvements to the documentation.
|
|
||||||
|
|
||||||
Version 1.7.12 1 October 2012
|
|
||||||
- [All] Under certain error conditions, Tofrodos may fail to
|
|
||||||
remove the temporary files that it creates. This is now fixed.
|
|
||||||
- [All] Fixed another bug where an exit code of 0, instead of 1,
|
|
||||||
is returned under certain failure conditions.
|
|
||||||
- [MSDOS] Although MSDOS is not a multitasking system, and
|
|
||||||
thus should not need it, the DOS port of Tofrodos now also uses
|
|
||||||
my implementation of mkstemp(). This simplifies maintenance
|
|
||||||
since I have fewer code paths to test.
|
|
||||||
- [Windows] Support for compiling the source code using
|
|
||||||
DJGPP 2, Borland C/C++, LCC-Win32 and Digital Mars C has been
|
|
||||||
removed. Please use one of the other supported compilers (eg,
|
|
||||||
Open Watcom C, etc).
|
|
||||||
- [All] The documentation now has information about the exit
|
|
||||||
codes returned by Tofrodos.
|
|
||||||
|
|
||||||
Version 1.7.11 27 September 2012
|
|
||||||
- [All] tofrodos now consistently returns an exit code of 1 when
|
|
||||||
there's a failure. Previously, under certain error conditions,
|
|
||||||
it could return an exit code of -1 (which is not a valid
|
|
||||||
exit code for some operating systems).
|
|
||||||
- [Windows] This version now includes an implementation of
|
|
||||||
mkstemp() for Windows (when compiled with Open Watcom C),
|
|
||||||
bringing the Windows (Open Watcom) port of tofrodos up to
|
|
||||||
par with versions for systems like Linux and Mac OS X which
|
|
||||||
provide mkstemp() in their C libraries. Hopefully, this will
|
|
||||||
help those of you who run multiple instances of tofrodos at
|
|
||||||
the same time in the same directory.
|
|
||||||
- [Windows] Fixed a bug introduced in 1.7.9 where the Windows port
|
|
||||||
of tofrodos always creates the temporary file in the current
|
|
||||||
directory instead of the directory where the target file is.
|
|
||||||
- [Mac OS X] The Mac OS X port of tofrodos now uses mkstemp() to
|
|
||||||
create the temporary file the way it does on Linux.
|
|
||||||
- [Mac OS X] Added more information in readme.txt for Mac users.
|
|
||||||
- [All] Improved documentation about the -p and -b options.
|
|
||||||
|
|
||||||
Version 1.7.10 25 September 2012
|
|
||||||
- Limited (beta) distribution only, not released for general use.
|
|
||||||
If you have this version, please upgrade to 1.7.11.
|
|
||||||
|
|
||||||
Version 1.7.9 21 February 2011
|
|
||||||
- [Windows, Linux, Mac OS X, Unix] The behaviour of the -b option
|
|
||||||
(create backup file) has been changed to be more useful on systems
|
|
||||||
with support for long filenames and an arbitrary number of file
|
|
||||||
extensions (ie, all systems except MSDOS). It now backs up
|
|
||||||
"filename.ext" as "filename.ext.bak" instead of "filename.bak".
|
|
||||||
Note that with this version, the DOS version no longer behaves
|
|
||||||
the same way (when the -b option is used) as the Windows, Linux,
|
|
||||||
Mac OS X, *BSD and other Unix versions, since DOS systems have
|
|
||||||
filename limitations. At least this way, we're not held back by
|
|
||||||
the least common denominator (DOS), especially since few people
|
|
||||||
use DOS nowadays.
|
|
||||||
- [All] The documentation has been updated to explain the behaviour of
|
|
||||||
the -b option in more detail.
|
|
||||||
|
|
||||||
Version 1.7.8 8 April 2008
|
|
||||||
- [Mac OS X] Fixed corrupted portion of config.h that only shows up when
|
|
||||||
compiling under Mac OS X (sorry - I don't know what happened)
|
|
||||||
|
|
||||||
Version 1.7.7 1 April 2008
|
|
||||||
- [Mac OS X] Added support for compiling tofrodos under Mac OS X.
|
|
||||||
- [FreeBSD] Added support for compiling tofrodos under FreeBSD.
|
|
||||||
- [OpenBSD] Added support for compiling tofrodos under OpenBSD (not tested).
|
|
||||||
- [All] Fixed typos in documentation (Unix man page and HTML version).
|
|
||||||
|
|
||||||
Version 1.7.6 15 March 2005
|
|
||||||
- [All systems] New option: -l allows you to send the error messages to
|
|
||||||
a log file. It's particularly convenient for systems with less powerful
|
|
||||||
command line shells that do not allow you to easily redirect stderr.
|
|
||||||
- [All systems] Fixed: all error and verbose messages are now sent to
|
|
||||||
stderr or the error log file (if -l is given).
|
|
||||||
- [Windows] Older versions of compilers like Borland 4.X and 5.0,
|
|
||||||
Watcom 10.X and Visual C++ 6.0 no longer have makefiles. Use the latest
|
|
||||||
versions; all these compilers are now available free of charge from
|
|
||||||
their vendors so using the latest version to compile tofrodos should
|
|
||||||
not be a great hardship.
|
|
||||||
- [All systems] Other minor fixes.
|
|
||||||
|
|
||||||
Version 1.7 26 November 2003
|
|
||||||
- [Linux/Unix] Bug fix: now handles symbolic link arguments correctly.
|
|
||||||
This bug only affects Unix-type sytems (like Linux, FreeBSD, OpenBSD,
|
|
||||||
etc).
|
|
||||||
- [Linux] tofrodos now uses mkstemp() to create the temporary file to
|
|
||||||
avoid a race between file name creation and opening which may occur
|
|
||||||
when using mktemp(). If you use a non-Linux system, and have
|
|
||||||
mkstemp(), you can take advantage of this by defining HAVE_MKSTEMP
|
|
||||||
in config.h (defined by default for Linux only).
|
|
||||||
- [Linux/Unix] "make install" now installs to /usr/bin by default (you
|
|
||||||
can still change this easily) since Linux distributions using tofrodos
|
|
||||||
appear to use this value. (Makes it easier for maintainers of those
|
|
||||||
distributions.)
|
|
||||||
- [All systems] Made some error messages a bit more informative.
|
|
||||||
- [All systems] Verbose mode is slightly more informative.
|
|
||||||
- [Windows] Added support for compiling with the MinGW (GNU) C Compiler
|
|
||||||
on Win32 systems.
|
|
||||||
- [All systems] Added an HTML version of the manual page. Useful for
|
|
||||||
systems that don't have a built-in facility to read a man page (like
|
|
||||||
MSDOS and Windows).
|
|
||||||
|
|
||||||
Version 1.6 1 July 2002
|
|
||||||
Added support for LCC-Win32 and BCC 5.5
|
|
||||||
|
|
||||||
Version 1.5 19 June 2002
|
|
||||||
Minor fixes to documentation.
|
|
||||||
Added support for the Digital Mars C/C++ compiler (Win32 console mode)
|
|
||||||
|
|
||||||
Version 1.4 16 March 1999
|
|
||||||
Fixed bug when using -b on a file not in the current directory.
|
|
||||||
Added RPM support.
|
|
||||||
|
|
||||||
Version 1.3 8 October 1997
|
|
||||||
Added new option (-p) to preserve file ownership and time.
|
|
||||||
Added support for Win32 compilation and some compilers under DOS and
|
|
||||||
Windows.
|
|
||||||
|
|
||||||
Version 1.2 5 April 1997
|
|
||||||
(Internal version - not publicly released.)
|
|
||||||
|
|
||||||
Version 1.1 16 December 1996
|
|
||||||
Fixed bug in creation of temporary filename on Linux.
|
|
||||||
Fixed bug in creation of backup filename on Linux.
|
|
||||||
|
|
||||||
Version 1.0 22 June 1996 Initial version.
|
|
||||||
|
|
||||||
|
|
||||||
7. Copyright And Contacting The Author
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
The program and its accompanying files and documentation are
|
|
||||||
Copyright 1996-2012 Christopher Heng. All rights reserved.
|
|
||||||
They are distributed under the terms of the GNU General Public License
|
|
||||||
Version 2, a copy of which is enclosed in this package in the file COPYING.
|
|
||||||
|
|
||||||
You can retrieve the latest version of tofrodos from the following
|
|
||||||
website:
|
|
||||||
http://www.thefreecountry.com/tofrodos/index.shtml
|
|
||||||
|
|
||||||
If you need to contact me, you can use the feedback form at the
|
|
||||||
following URL:
|
|
||||||
http://www.thefreecountry.com/feedback.php
|
|
||||||
|
|
||||||
While I generally like to hear from you if you are using this program,
|
|
||||||
especially if you find any bugs in it, I make no promises about fixing
|
|
||||||
anything or even replying. If you do contact me, please also let me have
|
|
||||||
the following information:
|
|
||||||
|
|
||||||
1. The version of tofrodos that you are using;
|
|
||||||
2. The operating system (and its version) on which you are
|
|
||||||
running the program (eg, Debian Linux [Woody], or MSDOS 6.22,
|
|
||||||
Windows 95/98/ME/NT/2k/XP/Vista/7, Mac OS/X with version number,
|
|
||||||
or all of the above).
|
|
||||||
If the bug only surfaces in one of the operating systems and not
|
|
||||||
the other, please also note this.
|
|
||||||
3. Any other information which you think might be relevant.
|
|
||||||
|
|
||||||
This will help me give you a more relevant reply (and also to trace
|
|
||||||
whatever bugs that may be present).
|
|
|
@ -1,97 +0,0 @@
|
||||||
# makefile.gcc Makefile for building with the GNU C compiler on Linux.
|
|
||||||
# Copyright 1996-2012 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
# This makefile requires the GNU make to work (we use the GNU extensions).
|
|
||||||
|
|
||||||
# Define the following if you need
|
|
||||||
#
|
|
||||||
# DEBUG to add debugging information, eg "make DEBUG=1 all"
|
|
||||||
|
|
||||||
|
|
||||||
ifdef DEBUG
|
|
||||||
CDEBUG = -g
|
|
||||||
LDEBUG = -g
|
|
||||||
else
|
|
||||||
CDEBUG = -O2
|
|
||||||
LDEBUG = -s
|
|
||||||
endif
|
|
||||||
|
|
||||||
# programs
|
|
||||||
CC = gcc
|
|
||||||
CD = cd
|
|
||||||
CP = cp
|
|
||||||
GZIP = gzip
|
|
||||||
INSTALL = install
|
|
||||||
LN = ln
|
|
||||||
LD = gcc
|
|
||||||
MAKE = make
|
|
||||||
MKDIR = mkdir
|
|
||||||
MV = mv
|
|
||||||
RM = rm -f
|
|
||||||
|
|
||||||
# flags
|
|
||||||
CFLAGS = $(DEFINES) $(TFLAG) $(CDEBUG) -c -Wall
|
|
||||||
GZIPFLAGS = -9
|
|
||||||
INSTALLBINFLAGS = -m 755
|
|
||||||
INSTALLDATAFLAGS = -m 644
|
|
||||||
LDFLAGS = $(LDEBUG)
|
|
||||||
LNFLAGS = -sf
|
|
||||||
RMRECURFLAGS = -rf
|
|
||||||
|
|
||||||
# directories
|
|
||||||
BINDIR = /usr/bin
|
|
||||||
LIBDIR = lib
|
|
||||||
MANDIR = /usr/man/man1
|
|
||||||
|
|
||||||
# filenames
|
|
||||||
FROMDOS = fromdos
|
|
||||||
FROMDOSMAN = fromdos.1
|
|
||||||
FROMDOSTXT = fromdos.txt
|
|
||||||
TODOS = todos
|
|
||||||
ZIPSRCNAME = tfd.zip
|
|
||||||
|
|
||||||
# lists of filenames
|
|
||||||
OBJS = emsg.o \
|
|
||||||
init.o \
|
|
||||||
tofrodos.o \
|
|
||||||
utility.o
|
|
||||||
|
|
||||||
# implicit rules
|
|
||||||
.c.o:
|
|
||||||
$(CC) $(CFLAGS) $<
|
|
||||||
|
|
||||||
# user visible rules
|
|
||||||
all: $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(OBJS)
|
|
||||||
|
|
||||||
clobber: clean
|
|
||||||
$(RM) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
install: installman
|
|
||||||
$(INSTALL) $(INSTALLBINFLAGS) $(FROMDOS) $(BINDIR)
|
|
||||||
($(CD) $(BINDIR) ; $(LN) $(LNFLAGS) fromdos todos)
|
|
||||||
|
|
||||||
installman: $(FROMDOSMAN)
|
|
||||||
$(INSTALL) $(INSTALLDATAFLAGS) $(FROMDOSMAN) $(MANDIR)
|
|
||||||
($(CD) $(MANDIR) ; $(LN) $(LNFLAGS) fromdos.1 todos.1)
|
|
||||||
|
|
||||||
|
|
||||||
# real rules
|
|
||||||
$(FROMDOS): $(OBJS)
|
|
||||||
$(CC) $(LDFLAGS) -o $(FROMDOS) $(OBJS)
|
|
||||||
|
|
||||||
$(FROMDOSTXT): $(FROMDOSMAN)
|
|
||||||
gtbl $(FROMDOSMAN) | groff -Tascii -mandoc | \
|
|
||||||
troff -Tascii -mandoc | grotty > $@
|
|
||||||
|
|
||||||
$(TODOS): $(FROMDOS)
|
|
||||||
$(LN) $(LNFLAGS) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
# objects
|
|
||||||
init.o: init.c config.h emsg.h tofrodos.h utility.h version.h
|
|
||||||
|
|
||||||
tofrodos.o: tofrodos.c config.h emsg.h tofrodos.h utility.h version.h
|
|
||||||
|
|
||||||
utility.o: utility.c config.h emsg.h tofrodos.h utility.h
|
|
|
@ -1,174 +0,0 @@
|
||||||
/*
|
|
||||||
config.h Handles system dependencies.
|
|
||||||
Copyright (c) 1996-2013 by Christopher Heng. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
You need an ANSI C compiler. I assume this everywhere. If you
|
|
||||||
have a pre-ANSI C compiler, it's likely that you have to make
|
|
||||||
a lot of changes to the sources that you might as well just
|
|
||||||
rewrite the program. It *is* afterall a trivial program.
|
|
||||||
|
|
||||||
I have not specifically designed this program so that it is
|
|
||||||
portable across systems. The comments below might help if you
|
|
||||||
are using anything other than the compilers I used to develop
|
|
||||||
the program. Note that the comments and macros in this file
|
|
||||||
about system dependencies are not necessarily exhaustive.
|
|
||||||
|
|
||||||
1. These macros are defined for the following systems:
|
|
||||||
System Macros defined
|
|
||||||
------ --------------
|
|
||||||
LINUX LINUX, UNIX
|
|
||||||
MSDOS MSDOS
|
|
||||||
WIN32 WIN32
|
|
||||||
|
|
||||||
2. You will need a getopt() implementation. It must support the
|
|
||||||
usual behaviour of the Unix getopt(), plus the variables
|
|
||||||
optind, opterr, and optarg.
|
|
||||||
|
|
||||||
If your system has the header <getopt.h>, define HAVE_GETOPT_H.
|
|
||||||
I have defined this for the systems I compile for.
|
|
||||||
|
|
||||||
I have supplied my own version of getopt.c and getopt.h in
|
|
||||||
the lib subdirectory since most MSDOS and Win32 compilers do
|
|
||||||
not have getopt() in their libraries.
|
|
||||||
|
|
||||||
3. If your system has <unistd.h>, define HAVE_UNISTD_H. This is
|
|
||||||
usually relevant only for Unix systems, although the DJGPP GNU C
|
|
||||||
compiler has that as well. If you don't have unistd.h, you may
|
|
||||||
have to declare some standard Unix functions that are usually
|
|
||||||
found there, such as chown(), chmod(), etc.
|
|
||||||
|
|
||||||
4. Note that on MSDOS systems, you will need _splitpath()
|
|
||||||
and _makepath(). If you use DJGPP, you probably can get away
|
|
||||||
with defining _splitpath() to call fnsplit(), etc. Otherwise,
|
|
||||||
you will need to roll your own version. I think all the
|
|
||||||
commercial MSDOS C compilers have these functions.
|
|
||||||
|
|
||||||
5. You will also need stricmp() and strnicmp() on MSDOS or
|
|
||||||
strcasecmp() or strncasecmp() on Unix. If you have stricmp() and/or
|
|
||||||
strnicmp() on a Unix system, define HAVE_STRICMP and/or
|
|
||||||
HAVE_STRNICMP respectively. I assume stricmp() for all non-Unix
|
|
||||||
systems so if you are neither compiling for Unix or MSDOS, you
|
|
||||||
better check out my macros below. If you have a Unix system,
|
|
||||||
defining UNIX here will cause the compiler to use strcasecmp()
|
|
||||||
and strncasecmp().
|
|
||||||
|
|
||||||
6. You will need mkstemp(). On Unix systems, this is probably
|
|
||||||
declared in <unistd.h>.
|
|
||||||
|
|
||||||
I have supplied my own mktemp.c and mktemp.h for use with the
|
|
||||||
Open Watcom C (Windows/DOS) and Visual C++ (Windows) compilers
|
|
||||||
that includes my implementation of mkstemp(). If your system
|
|
||||||
does not have mkstemp(), you might try to see if you can use
|
|
||||||
this. (It's in the lib directory.)
|
|
||||||
|
|
||||||
If your compiler has mkstemp() declared somewhere else (other
|
|
||||||
than unistd.h on Unix), define MKTEMP_HEADER to be the name
|
|
||||||
of the header, eg <whatever.h> (include the angle brackets or
|
|
||||||
double quotes), and HAVE_MKTEMP_H to force inclusion of the
|
|
||||||
header in the relevant files.
|
|
||||||
|
|
||||||
7. tofrodos.c assumes utime.h exists in <sys/utime.h> for
|
|
||||||
Microsoft's compiler and Watcom C/C++ (which tries to emulate
|
|
||||||
Microsoft's compiler closely). It assumes that all other compilers
|
|
||||||
keep utime.h in the standard include directories which are accessible
|
|
||||||
simply by including <utime.h>. I must confess I have not bothered to
|
|
||||||
keep this system dependent setting in this file, only noting it here
|
|
||||||
for completeness. If you find that you have to tweak this for your
|
|
||||||
system, please let me know.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(CONFIG_H_INCLUDED)
|
|
||||||
#define CONFIG_H_INCLUDED
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* define the systems */
|
|
||||||
#if defined(__linux__) /* (predefined) */
|
|
||||||
#if !defined(LINUX)
|
|
||||||
#define LINUX
|
|
||||||
#endif
|
|
||||||
#if !defined(UNIX)
|
|
||||||
#define UNIX /* make sure this is defined */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
|
|
||||||
defined(__OpenBSD__) || defined(__NetBSD__) || defined(__GNU__)
|
|
||||||
/* these systems seem to work like Linux. Note to self: __GNU__ == Hurd */
|
|
||||||
#if !defined(LINUX)
|
|
||||||
#define LINUX
|
|
||||||
#endif
|
|
||||||
#if !defined(UNIX)
|
|
||||||
#define UNIX /* make sure this is defined */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__MSDOS__)
|
|
||||||
#if !defined(MSDOS)
|
|
||||||
#define MSDOS /* make sure this is defined */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__WIN32__) || defined(__NT__) || defined(_WIN32)
|
|
||||||
#if !defined(WIN32)
|
|
||||||
#define WIN32
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
#if !defined(UNIX)
|
|
||||||
#define UNIX
|
|
||||||
#endif
|
|
||||||
#define HAVE_UNISTD_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* define what headers we have (based on the systems) */
|
|
||||||
#if defined(LINUX)
|
|
||||||
#define HAVE_GETOPT_H
|
|
||||||
#define HAVE_UNISTD_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(WIN32) || defined(MSDOS)
|
|
||||||
#if !defined(HAVE_MKTEMP_H)
|
|
||||||
#define HAVE_MKTEMP_H
|
|
||||||
#endif
|
|
||||||
#if !defined(MKTEMP_HEADER)
|
|
||||||
#define MKTEMP_HEADER <mktemp.h>
|
|
||||||
#endif
|
|
||||||
#if !defined(HAVE_GETOPT_H)
|
|
||||||
#define HAVE_GETOPT_H
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__MINGW32__)
|
|
||||||
#define HAVE_GETOPT_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* if we are in Unix define stricmp to be strcasecmp and strnicmp to */
|
|
||||||
/* be strncasecmp. I'm not sure if all Unices have these, but Linux */
|
|
||||||
/* does. */
|
|
||||||
#if defined(UNIX)
|
|
||||||
#if !defined(HAVE_STRICMP)
|
|
||||||
#define stricmp strcasecmp
|
|
||||||
#endif
|
|
||||||
#if !defined(HAVE_STRNICMP)
|
|
||||||
#define strnicmp strncasecmp
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Microsoft's compiler havs S_IREAD and S_IWRITE in its sys/stat.h */
|
|
||||||
/* but not S_IRUSR and S_IWUSR which I use. */
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define S_IRUSR S_IREAD
|
|
||||||
#define S_IWUSR S_IWRITE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* CONFIG_H_INCLUDED */
|
|
|
@ -1,68 +0,0 @@
|
||||||
/*
|
|
||||||
emsg.c Error message printing functions.
|
|
||||||
Copyright (c) 2005-2012 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this should always be first */
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
/* standard headers */
|
|
||||||
#include <stdarg.h> /* va_arg and family */
|
|
||||||
#include <stdio.h> /* fprintf(), fopen(), fclose() */
|
|
||||||
#include <stdlib.h> /* atexit() */
|
|
||||||
|
|
||||||
/* our own headers */
|
|
||||||
#include "emsg.h"
|
|
||||||
#include "tofrodos.h"
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#if defined(MSDOS) || (WINDOWS)
|
|
||||||
#define ERROR_LOG_MODE "at"
|
|
||||||
#else
|
|
||||||
#define ERROR_LOG_MODE "a"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* data local to this file */
|
|
||||||
static FILE * errorfp ;
|
|
||||||
|
|
||||||
/* local functions */
|
|
||||||
static void close_error_file ( void ) ;
|
|
||||||
|
|
||||||
|
|
||||||
void emsg ( char * message, ... )
|
|
||||||
{
|
|
||||||
va_list argp ;
|
|
||||||
|
|
||||||
if (errorfp == NULL) {
|
|
||||||
if (errorlogfilename == NULL) {
|
|
||||||
errorfp = stderr ;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
errorfp = fopen ( errorlogfilename, ERROR_LOG_MODE );
|
|
||||||
if (errorfp == NULL) {
|
|
||||||
fprintf( stderr, EMSG_ERRORLOG, progname, errorlogfilename );
|
|
||||||
errorfp = stderr ;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* close error file on exit (not needed, but just being pedantically neat) */
|
|
||||||
atexit( close_error_file ); /* ignore errors */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf( errorfp, "%s: ", progname );
|
|
||||||
va_start( argp, message );
|
|
||||||
vfprintf( errorfp, message, argp );
|
|
||||||
va_end( argp );
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void close_error_file ( void )
|
|
||||||
{
|
|
||||||
/* there's no need to check for stderr, since we should not have set this function */
|
|
||||||
/* on exit() if only stderr were used */
|
|
||||||
if (errorfp != NULL) {
|
|
||||||
fclose( errorfp );
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
emsg.h Error messages.
|
|
||||||
Copyright 1996-2013 by Christopher Heng. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(EMSG_H_INCLUDED)
|
|
||||||
#define EMSG_H_INCLUDED
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define EMSG_BAKFILENAME "File cannot have a .bak extension "\
|
|
||||||
"when used with -b flag.\n"
|
|
||||||
#define EMSG_CONVERT "File read/write error while "\
|
|
||||||
"converting \"%s\".\n"
|
|
||||||
#define EMSG_INTERNAL "Internal error: %s.\n"
|
|
||||||
#define EMSG_NOFILENAME "Need to specify filename or redirect "\
|
|
||||||
"stdin.\n"
|
|
||||||
#define EMSG_NOMEM "Insufficient memory to run program.\n"
|
|
||||||
#define EMSG_NOTEMPNAME "Unable to generate temporary filename for converting \"%s\".\n"
|
|
||||||
#define EMSG_OPENFILE "Unable to open file \"%s\".\n"
|
|
||||||
#define EMSG_SIGNAL "Terminated by user.\n"
|
|
||||||
#define EMSG_WRONGDOSVER "Requires DOS 3.1 and above.\n"
|
|
||||||
#define EMSG_ACCESSFILE "Unable to access file \"%s\".\n"
|
|
||||||
#define EMSG_NOTREADABLE "No read permission for \"%s\".\n"
|
|
||||||
#define EMSG_NOTWRITEABLE "No write permission for \"%s\". Use -f to force conversion.\n"
|
|
||||||
#define EMSG_CHOWN "Unable to change ownership of \"%s\".\n"
|
|
||||||
#define EMSG_SYMLINK "Unable to dereference symbolic link \"%s\".\n"
|
|
||||||
#define EMSG_CREATETEMP "Unable to create temporary file \"%s\" for converting \"%s\".\n"
|
|
||||||
#define EMSG_ERRORLOG "%s: Unable to create error log file \"%s\". Defaulting to stderr.\n" /* special case with progname */
|
|
||||||
#define EMSG_RENAMEBAK "Unable to save original file %s as %s.\n"\
|
|
||||||
"Reason: %s\n"
|
|
||||||
#define EMSG_RENAMETMP "Unable to rename temporary file %s back to %s after converting it.\n"\
|
|
||||||
"Reason: %s\n"\
|
|
||||||
"Please recover your converted file by manually renaming it back.\n"
|
|
||||||
|
|
||||||
/* internal error macros */
|
|
||||||
#define EINTNL_DIRECTION "unknown direction"
|
|
||||||
|
|
||||||
/* verbose messages */
|
|
||||||
#define VERBOSE_CONVERTING "Converting \"%s\"\n"
|
|
||||||
#define VERBOSE_SYMLINKSRC "\"%s\" resolves to \"%s\"\n"
|
|
||||||
|
|
||||||
/* function declarations */
|
|
||||||
extern void emsg ( char * message, ... );
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,126 +0,0 @@
|
||||||
.TH tofrodos 1 "Version 1.7.13" "2013"
|
|
||||||
.SH NAME
|
|
||||||
tofrodos
|
|
||||||
\- Converts text files between DOS and Unix formats.
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B fromdos
|
|
||||||
[
|
|
||||||
.I options
|
|
||||||
] [file...]
|
|
||||||
.br
|
|
||||||
.B todos
|
|
||||||
[
|
|
||||||
.I options
|
|
||||||
] [file...]
|
|
||||||
.br
|
|
||||||
.SH DESCRIPTION
|
|
||||||
DOS text files traditionally have carriage return and line feed pairs
|
|
||||||
as their newline characters while Unix text files have the line feed
|
|
||||||
as their newline character.
|
|
||||||
.I fromdos
|
|
||||||
converts ASCII and Unicode UTF-8 text files from the DOS format to the Unix format, while
|
|
||||||
.I todos
|
|
||||||
converts them from the Unix format to the DOS format.
|
|
||||||
.PP
|
|
||||||
The programs accept multiple filenames and wildcards as their arguments.
|
|
||||||
You may also use them in a pipe.
|
|
||||||
If either program finds its input redirected, it will process stdin
|
|
||||||
and place the output on stdout.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.BI \-a
|
|
||||||
This option is deprecated. Do not use it unless you know what you're doing. By default,
|
|
||||||
Tofrodos does the expected thing for text files. That is, when converting from
|
|
||||||
DOS to Unix, it will remove carriage returns only if they are followed by line feeds.
|
|
||||||
When converting from Unix to DOS, it will add carriage returns only if the linefeeds
|
|
||||||
are not already preceeded by carriage returns. When Tofrodos is run on a normal text file that
|
|
||||||
has already been converted, the resulting file should be identical to the original. However,
|
|
||||||
if you use this option, the program will always remove carriage returns in the DOS to Unix mode
|
|
||||||
and always add carriage returns in the Unix to DOS mode even if it is not appropriate.
|
|
||||||
.TP
|
|
||||||
.BI \-b
|
|
||||||
Make a backup of original file. The original file with a
|
|
||||||
.I .bak
|
|
||||||
extension appended to the original filename, silently replacing any existing file of that name.
|
|
||||||
For example, a file called "filename.ext" becomes "filename.ext.bak" replacing any existing file
|
|
||||||
having the name "filename.ext.bak".
|
|
||||||
Important: the program behaves differently if it is compiled for DOS (as compared to being compiled for Windows, Linux,
|
|
||||||
Mac OS X or other systems). In view of the filename restrictions present on DOS, the DOS executable
|
|
||||||
will strip the original file extension, if any, from the file before appending the
|
|
||||||
.I .bak
|
|
||||||
extension. For example, "filename.ext" becomes "filename.bak".
|
|
||||||
.TP
|
|
||||||
.BI \-d
|
|
||||||
Convert from DOS to Unix. This forces the program to convert the file in
|
|
||||||
a particular direction. By default, if the program is named
|
|
||||||
.I fromdos
|
|
||||||
or
|
|
||||||
.I dos2unix,
|
|
||||||
it will assume that the input file is in a DOS format and convert it to
|
|
||||||
a Unix format. If the program is named
|
|
||||||
.I todos
|
|
||||||
or
|
|
||||||
.I unix2dos,
|
|
||||||
it will assume that the input file is in a Unix format and convert it to
|
|
||||||
a DOS format. Using the
|
|
||||||
.I \-d
|
|
||||||
option forces the program to convert from a DOS format
|
|
||||||
to a Unix format regardless of how the program is named. Likewise, using the
|
|
||||||
.I \-u
|
|
||||||
option forces the program to convert from a Unix format to a DOS format
|
|
||||||
regardless of the name of the program.
|
|
||||||
.TP
|
|
||||||
.BI \-e
|
|
||||||
Abort processing on any error in any file. Normally, the program will
|
|
||||||
simply skip to process the next file on the command line when it encounters
|
|
||||||
any errors. This option causes it to abort on errors.
|
|
||||||
.TP
|
|
||||||
.BI \-f
|
|
||||||
Force: convert even if the file is not writeable (read-only). By default,
|
|
||||||
if the program finds that the file does not have write permission, it will not process
|
|
||||||
that file. This option forces the conversion even if the file is read-only.
|
|
||||||
.TP
|
|
||||||
.BI \-h
|
|
||||||
Display a short help screen on the program usage and quit.
|
|
||||||
.TP
|
|
||||||
.BI \-l <logfile>
|
|
||||||
Log error messages to <logfile>. Note that if your command line has an
|
|
||||||
error, such as when you specify an unknown option, the error message for the
|
|
||||||
command line option error will be issued to stderr instead and not logged.
|
|
||||||
.TP
|
|
||||||
.BI \-o
|
|
||||||
Overwrite the original file (no backup). This is the default.
|
|
||||||
.TP
|
|
||||||
.BI \-p
|
|
||||||
Preserve file ownership and time on Unix-type systems (like Linux). On Windows and MSDOS, it only
|
|
||||||
preserves the file time. Note that on many Unix-type systems, including Linux, the file
|
|
||||||
ownership will only be preserved if the program is run as root, otherwise it
|
|
||||||
will just set the file time and silently fail the change of file
|
|
||||||
ownership. On such systems, if you want a warning message when the file ownership
|
|
||||||
cannot be changed, use \-v (the verbose flag) as well.
|
|
||||||
.TP
|
|
||||||
.BI \-u
|
|
||||||
Convert from Unix to DOS. See the
|
|
||||||
.I \-d
|
|
||||||
option above for more information.
|
|
||||||
.TP
|
|
||||||
.BI \-v
|
|
||||||
Verbose.
|
|
||||||
.TP
|
|
||||||
.BI \-V
|
|
||||||
Show version message and quit.
|
|
||||||
.SH EXIT CODE
|
|
||||||
Tofrodos terminates with an exit code of 0 on success and 1 on error.
|
|
||||||
.PP
|
|
||||||
If the program is invoked with multiple files on the command line, the default behaviour is to skip to the next
|
|
||||||
file in the list if an error is encountered with any file. In such a case, the exit code returned will the
|
|
||||||
status of the last file processed (ie, 0 on success, 1 on failure). If this is not desirable, use the \-e option,
|
|
||||||
which will force the program to abort immediately with the appropriate exit code on encountering any error.
|
|
||||||
.SH AUTHOR
|
|
||||||
The program and its documentation are copyrighted (c) 1996-2013 by
|
|
||||||
Christopher Heng. All rights reserved. They are distributed under
|
|
||||||
the terms of the GNU General Public License Version 2.
|
|
||||||
.PP
|
|
||||||
The latest version of tofrodos can be obtained from
|
|
||||||
.br
|
|
||||||
http://www.thefreecountry.com/tofrodos/index.shtml
|
|
|
@ -1,215 +0,0 @@
|
||||||
/*
|
|
||||||
init.c Initialisation functions.
|
|
||||||
Copyright 1996-2013 Christopher Heng. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this should always be first */
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
/* standard headers */
|
|
||||||
#if defined(HAVE_GETOPT_H)
|
|
||||||
#include <getopt.h> /* getopt() (what else?) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <signal.h> /* signal() (surprise!) */
|
|
||||||
#include <stdlib.h> /* _splitpath(), _MAX_FNAME, exit, EXIT_SUCCESS */
|
|
||||||
#include <stdio.h> /* fprintf() */
|
|
||||||
#include <string.h> /* stricmp() */
|
|
||||||
|
|
||||||
#if defined(HAVE_UNISTD_H)
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* our own headers */
|
|
||||||
#include "emsg.h"
|
|
||||||
#include "tofrodos.h"
|
|
||||||
#include "utility.h"
|
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define HELPFMT "Usage: %s [options] [file...]\n"\
|
|
||||||
"-a\t(Deprecated option, see manual for info.)\n"\
|
|
||||||
"-b\tMake backup of original file (.bak).\n"\
|
|
||||||
"-d\tConvert DOS to Unix.\n"\
|
|
||||||
"-e\tAbort processing files on error in any file.\n"\
|
|
||||||
"-f\tForce: convert even if file is not writeable.\n"\
|
|
||||||
"-h\tDisplay help on usage and quit.\n"\
|
|
||||||
"-l file\tLog most errors and verbose messages to <file>\n"\
|
|
||||||
"-o\tOverwrite original file (no backup).\n"\
|
|
||||||
"-p\tPreserve file owner and time.\n"\
|
|
||||||
"-u\tConvert Unix to DOS.\n"\
|
|
||||||
"-v\tVerbose.\n"\
|
|
||||||
"-V\tShow version and quit.\n"
|
|
||||||
#define OPTLIST "abdefhl:opuvV"
|
|
||||||
#define VERFMT "%s Ver %d.%d.%d "\
|
|
||||||
"Converts text files between DOS and Unix formats.\n"\
|
|
||||||
"Copyright 1996-2013 Christopher Heng. "\
|
|
||||||
"All rights reserved.\n"\
|
|
||||||
"http://www.thefreecountry.com/tofrodos/index.shtml\n"
|
|
||||||
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
#if !defined(_MAX_NAME) || (_MAX_NAME < 260)
|
|
||||||
#define MAXFILESIZE 260
|
|
||||||
#else
|
|
||||||
#define MAXFILESIZE _MAX_NAME
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(MSDOS)
|
|
||||||
#define DIRSLASH '/'
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* local functions */
|
|
||||||
static void showhelp ( void );
|
|
||||||
static void showversion ( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
init
|
|
||||||
|
|
||||||
Checks for correct operating system version (DOS only).
|
|
||||||
Sets the default direction of conversion.
|
|
||||||
Sets the signal traps.
|
|
||||||
|
|
||||||
Returns 0 on success, -1 on error.
|
|
||||||
*/
|
|
||||||
int init ( char * firstarg )
|
|
||||||
{
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
char filename[MAXFILESIZE];
|
|
||||||
#else
|
|
||||||
char * s ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MSDOS)
|
|
||||||
/* Check that we have the minimum version of DOS needed. */
|
|
||||||
/* We only run on DOS 3.1 and above. */
|
|
||||||
if (_osmajor < 3 ||
|
|
||||||
(_osmajor == 3 && _osminor < 10)) {
|
|
||||||
emsg( EMSG_WRONGDOSVER );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* set the name of the binary to set default direction of */
|
|
||||||
/* conversion */
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
/* got to extract the name from the full path and extension */
|
|
||||||
_splitpath( firstarg, NULL, NULL, filename, NULL );
|
|
||||||
progname = xstrdup( filename );
|
|
||||||
#else /* neither MSDOS nor WIN32 - assume Unix */
|
|
||||||
/* got to wipe out the path prefix if any */
|
|
||||||
if ((s = strrchr( firstarg, DIRSLASH )) == NULL)
|
|
||||||
progname = firstarg ;
|
|
||||||
else { /* we got the last slash - let's get rid of it */
|
|
||||||
progname = ++s ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* set the default direction: Unless we are explicitly named */
|
|
||||||
/* to convert in a particular direction, the default direction */
|
|
||||||
/* depends on the system. If we are on a DOS system, it is to */
|
|
||||||
/* convert from Unix to DOS. If we are on a Unix system, it */
|
|
||||||
/* is to convert from DOS to Unix. */
|
|
||||||
/* The default direction is set in tofrodos.c using a macro defined in tofrodos.h */
|
|
||||||
if (!stricmp( progname, FROMDOSNAME ) ||
|
|
||||||
!stricmp( progname, FROMDOSNAME2 ))
|
|
||||||
direction = DOSTOUNIX ;
|
|
||||||
else if (!stricmp( progname, TODOSNAME ) ||
|
|
||||||
!stricmp( progname, TODOSNAME2 ))
|
|
||||||
direction = UNIXTODOS ;
|
|
||||||
|
|
||||||
/* set the signal traps - we use the old Unix version 7 signal */
|
|
||||||
/* mechanism since that is most portable to DOS. In any case, */
|
|
||||||
/* we don't do anything sophisticated when we receive a signal */
|
|
||||||
/* except cleaning up and quitting! */
|
|
||||||
if (signal( SIGINT, sighandler ) == SIG_IGN)
|
|
||||||
signal( SIGINT, SIG_IGN );
|
|
||||||
if (signal( SIGTERM, sighandler ) == SIG_IGN)
|
|
||||||
signal( SIGTERM, SIG_IGN );
|
|
||||||
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
parseargs
|
|
||||||
|
|
||||||
Parses the options.
|
|
||||||
|
|
||||||
Returns 0 on success, -1 on error.
|
|
||||||
*/
|
|
||||||
int parseargs ( int argc, char ** argv )
|
|
||||||
{
|
|
||||||
int c ;
|
|
||||||
|
|
||||||
while ((c = getopt( argc, argv, OPTLIST )) != -1) {
|
|
||||||
switch( c ) {
|
|
||||||
case 'a': /* force conversion of all \r\n to \n */
|
|
||||||
alwaysconvert = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'b': /* make backup of original file */
|
|
||||||
overwrite = 0 ;
|
|
||||||
break ;
|
|
||||||
case 'd': /* DOS to Unix */
|
|
||||||
direction = DOSTOUNIX ;
|
|
||||||
break ;
|
|
||||||
case 'e': /* abort processing list of files if */
|
|
||||||
/* we encounter errors in any file in */
|
|
||||||
/* a list of file names */
|
|
||||||
abortonerr = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'f': /* convert even if file is not writeable*/
|
|
||||||
forcewrite = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'h': /* display short usage screen and quit */
|
|
||||||
showhelp() ;
|
|
||||||
exit( EXIT_SUCCESS );
|
|
||||||
break ;
|
|
||||||
case 'l': /* log errors to filename */
|
|
||||||
errorlogfilename = optarg ;
|
|
||||||
break ;
|
|
||||||
case 'o': /* overwrite original file (default) */
|
|
||||||
overwrite = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'p': /* preserve file owner and date */
|
|
||||||
preserve = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'u': /* Unix to DOS */
|
|
||||||
direction = UNIXTODOS ;
|
|
||||||
break ;
|
|
||||||
case 'v': /* verbose */
|
|
||||||
verbose = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'V': /* show version and quit */
|
|
||||||
showversion() ;
|
|
||||||
exit( EXIT_SUCCESS );
|
|
||||||
break ;
|
|
||||||
default: /* error */
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void showversion ( void )
|
|
||||||
{
|
|
||||||
static int vershown ;
|
|
||||||
|
|
||||||
if (!vershown) {
|
|
||||||
fprintf( stderr, VERFMT, VERSN_PROGNAME, VERSN_MAJOR, VERSN_MINOR, VERSN_PATCH );
|
|
||||||
vershown = 1 ;
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
showhelp
|
|
||||||
|
|
||||||
Display the short usage help screen.
|
|
||||||
*/
|
|
||||||
static void showhelp ( void )
|
|
||||||
{
|
|
||||||
showversion();
|
|
||||||
fprintf( stderr, HELPFMT, progname );
|
|
||||||
return ;
|
|
||||||
}
|
|
|
@ -1,264 +0,0 @@
|
||||||
/*
|
|
||||||
getopt.c
|
|
||||||
Copyright 1997-2013 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
This code is released under the terms of the GNU General Public
|
|
||||||
License Version 2. You should have received a copy of the GNU
|
|
||||||
General Public License along with this program; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
|
|
||||||
USA.
|
|
||||||
|
|
||||||
The version of getopt() given here is based on the AT&T public
|
|
||||||
domain source for getopt() given out at the 1985 UNIFORUM conference
|
|
||||||
in Dallas. It has been modified as follows:
|
|
||||||
|
|
||||||
1. I support the newer optreset variable used in BSD 4.4.
|
|
||||||
2. I support a non-standard optprogname which the user can use
|
|
||||||
to set the program name to print. The AT&T version uses argv[0].
|
|
||||||
Mine simply does not print a program name if optprogname is NULL.
|
|
||||||
3. I support the use of '/' as the option switch character.
|
|
||||||
4. I use a character pointer to track which character within an
|
|
||||||
argument we are at for efficiency sake instead of the array
|
|
||||||
integer index used in AT&T's implementation.
|
|
||||||
5. Added Microsoft Windows GUI support. To enable this, just
|
|
||||||
define GUI_APPLICATION to have the message displayed in a message
|
|
||||||
box.
|
|
||||||
6. It returns -1 instead of EOF.
|
|
||||||
|
|
||||||
This function is primarily designed for MSDOS and Windows, since those
|
|
||||||
systems lack getopt(). Linux, BSD, and other Unix-type systems already
|
|
||||||
have a fully-functioning and thoroughly-debugged version, so you should
|
|
||||||
use the native versions on those systems instead. The error messages
|
|
||||||
in this file also presuppose an MSDOS/Windows environment since they
|
|
||||||
use '/' instead of '-' to describe the offending options.
|
|
||||||
|
|
||||||
See also list of differences in general in the documentation
|
|
||||||
preceding the function itself.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h> /* fprintf() */
|
|
||||||
#include <string.h> /* strchr() */
|
|
||||||
#include "getopt.h" /* our very own header */
|
|
||||||
|
|
||||||
/* system specific includes */
|
|
||||||
#if defined(GUI_APPLICATION)
|
|
||||||
#define STRICT
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma warning ( disable: 4514 4201 4214 )
|
|
||||||
#endif
|
|
||||||
#include <windows.h>
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma warning ( default : 4201 4214 )
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define OPT_SW1 '-' /* for Unix afficiondos */
|
|
||||||
#define OPT_SW2 '/' /* MSDOS traditional switch character */
|
|
||||||
|
|
||||||
/* macros specific to systems */
|
|
||||||
#if defined(GUI_APPLICATION) /* Windows version */
|
|
||||||
#define MESSAGEMAX 128
|
|
||||||
#define ERR_TITLE "Error"
|
|
||||||
#define ERR_UNKNOWNOPT "Unknown option: /%c."
|
|
||||||
#define ERR_OPTNEEDSARG "Option /%c requires an argument."
|
|
||||||
#if !defined(MB_ICONERROR)
|
|
||||||
/* define macro not defined in Win16's windows.h */
|
|
||||||
#define MB_ICONERROR MB_ICONHAND
|
|
||||||
#endif
|
|
||||||
#else /* command line version */
|
|
||||||
#define ERR_PREFIX "%s: "
|
|
||||||
#define ERR_UNKNOWNOPT "Unknown option: /%c.\n"
|
|
||||||
#define ERR_OPTNEEDSARG "Option /%c requires an argument.\n"
|
|
||||||
#endif /* command line version macros */
|
|
||||||
|
|
||||||
/* global variables */
|
|
||||||
char * optarg ; /* argument to option */
|
|
||||||
int opterr = 1 ; /* 0 = don't print error msg, 1 = print */
|
|
||||||
int optind = 1 ; /* next argument to parse */
|
|
||||||
int optopt ; /* the current option */
|
|
||||||
char * optprogname ;/* store program name here if you want the error */
|
|
||||||
/* message spouter to issue the program name */
|
|
||||||
int optreset ; /* 0 = continue processing, 1 = reset to start */
|
|
||||||
|
|
||||||
/* local functions */
|
|
||||||
static void error_message ( char * s );
|
|
||||||
|
|
||||||
/*
|
|
||||||
getopt
|
|
||||||
|
|
||||||
getopt() parses the command line given in the vector list,
|
|
||||||
and returns the option character (if any) and the option
|
|
||||||
argument in optarg.
|
|
||||||
|
|
||||||
argc, argv corresponds to the versions passed to main().
|
|
||||||
optlist is the list of valid options. Options which must
|
|
||||||
have arguments have a ':' suffixed to the option character
|
|
||||||
in optlist. Needless to say, ':' cannot be a valid option
|
|
||||||
character.
|
|
||||||
|
|
||||||
This function uses various globals: optarg, opterr, optind,
|
|
||||||
optopt, optreset and optprogname to govern its actions.
|
|
||||||
|
|
||||||
optarg contain the argument to the option if the option is
|
|
||||||
specified to have an argument.
|
|
||||||
opterr If this is set to 1, an error message will
|
|
||||||
be printed on stderr for bad options or missing arguments
|
|
||||||
to options. The default is to print the error message.
|
|
||||||
optind contains the next argv item which to be parsed. Defaults
|
|
||||||
to 1 to skip over the program name in the standard
|
|
||||||
argv[] passed to main().
|
|
||||||
optopt always contains the option character which is returned on
|
|
||||||
a valid option or which caused an error.
|
|
||||||
optprogname (non-standard) Contains the program name to be printed
|
|
||||||
prior to printing the error message.
|
|
||||||
optreset Set this to 1 if you need to call getopt() after using
|
|
||||||
it to parse a different argv list.
|
|
||||||
|
|
||||||
|
|
||||||
The options "//", "/-", "--", and "-/" will terminate the
|
|
||||||
list of options (unless one of those characters are themselves
|
|
||||||
specified in the option list, optlist). The character ':'
|
|
||||||
can never be an option. A solitary '-' or '/' will also cause
|
|
||||||
getopt() to return -1.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
-1 No more options to parse.
|
|
||||||
OPT_BADOPT An option character was encountered which
|
|
||||||
was not in the list of valid options.
|
|
||||||
OPT_BADARG An option was supposed to have an argument
|
|
||||||
but was found without one.
|
|
||||||
Otherwise, the option character is returned.
|
|
||||||
|
|
||||||
Differences from the Unix version:
|
|
||||||
1. '?' can be a valid option, since we do not return '?' when
|
|
||||||
there is an error. Unix getopt()s returns '?' when there is
|
|
||||||
an error. We return OPT_BADOPT (which is equated to 0).
|
|
||||||
2. the options are preceded by either '-' or '/' and the end
|
|
||||||
of option list demarcator can be "--", "-/", "//" or "/-".
|
|
||||||
Because our options begin with '/', filenames cannot begin
|
|
||||||
with the '/' character else it would be interpreted as
|
|
||||||
an option, unless you precede the file list with "--" to
|
|
||||||
mark the end of options.
|
|
||||||
3. We use optprogname to hold the program name to print
|
|
||||||
when there is an error. If this is missing, no program name
|
|
||||||
is printed. Some Unix versions print argv[0].
|
|
||||||
4. Some Unix versions do not have optreset. This is present
|
|
||||||
only in the later BSD versions. I have implemented it just in
|
|
||||||
case I need it.
|
|
||||||
5. Some Unix versions only return '?' when there is an error,
|
|
||||||
not differentiating between an invalid option and a missing
|
|
||||||
argument to an option. The version supplied with BSD 4.4
|
|
||||||
returns ':' for the latter error. We follow the protocol of
|
|
||||||
the BSD 4.4 version in this respect.
|
|
||||||
7. A solitary '-' or '/' will cause -1 to be returned.
|
|
||||||
According to the getopt manual page in BSD, this appears
|
|
||||||
to be the behaviour in System V. This is the behaviour in
|
|
||||||
Borland C/C++'s example getopt.c also.
|
|
||||||
*/
|
|
||||||
int getopt ( int argc, char * const * argv, const char * optlist )
|
|
||||||
{
|
|
||||||
static char nullstring[] = "" ;
|
|
||||||
static char * curptr = nullstring ;
|
|
||||||
char * s ;
|
|
||||||
|
|
||||||
if (optreset || *curptr == '\0') {
|
|
||||||
/* either end of current arg or first time or user wants us */
|
|
||||||
/* to treat this as first time */
|
|
||||||
|
|
||||||
/* got to restore this to zero for next iteration. Got to do */
|
|
||||||
/* it here before we exit */
|
|
||||||
optreset = 0 ;
|
|
||||||
|
|
||||||
/* get next (or first arg) */
|
|
||||||
if(optind >= argc ||
|
|
||||||
(*(curptr = argv[optind]) != OPT_SW1 && *curptr != OPT_SW2)) {
|
|
||||||
curptr = nullstring ; /* reset */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* got to set curptr since we could have got here by */
|
|
||||||
/* optind < argc prior to curptr being set */
|
|
||||||
curptr = argv[optind] ;
|
|
||||||
/* check if user specified end of list of options */
|
|
||||||
if (*++curptr == '\0' || /* solitary '-' */
|
|
||||||
(*curptr == OPT_SW1 || *curptr == OPT_SW2)) { /* "--" */
|
|
||||||
optind++; /* point to next argument */
|
|
||||||
curptr = nullstring ; /* reset */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* by the time we get here, we have skipped over the option */
|
|
||||||
/* switch character */
|
|
||||||
optopt = *curptr ;
|
|
||||||
|
|
||||||
if(optopt == ':' || /* need to trap this or problems will arise */
|
|
||||||
(s = strchr( optlist, optopt )) == NULL) { /* no such option */
|
|
||||||
if (opterr)
|
|
||||||
error_message ( ERR_UNKNOWNOPT );
|
|
||||||
/* skip erroneous option character */
|
|
||||||
if (*++curptr == '\0') /* end of argument */
|
|
||||||
optind++ ; /* go to next */
|
|
||||||
/* curptr = nullstring ; */ /* but already pointing to a null */
|
|
||||||
/* string */
|
|
||||||
return OPT_BADOPT ;
|
|
||||||
}
|
|
||||||
if(*++s == ':') { /* argument expected */
|
|
||||||
/* point to next argument - always done so might as well */
|
|
||||||
/* do it before we test */
|
|
||||||
optind++ ;
|
|
||||||
/* is the argument at the end of current argument? */
|
|
||||||
if(*++curptr != '\0') { /* yep */
|
|
||||||
optarg = curptr ;
|
|
||||||
curptr = nullstring ;
|
|
||||||
/* optind already pointing to next argument for next round */
|
|
||||||
}
|
|
||||||
else if (optind < argc) /* optarg is in next argument */
|
|
||||||
optarg = argv[optind++] ;
|
|
||||||
/* since we use the next arg for our optarg, we needed to */
|
|
||||||
/* point optind to the argument after that for next round */
|
|
||||||
/* curptr already pointing to null byte */
|
|
||||||
else { /* optarg not at end of current arg nor are there any */
|
|
||||||
/* more args */
|
|
||||||
if (opterr)
|
|
||||||
error_message ( ERR_OPTNEEDSARG );
|
|
||||||
return OPT_BADARG ;
|
|
||||||
/* optind already pointing to next (nonexistant) argument */
|
|
||||||
/* curptr already pointing to null byte */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else { /* optarg is not expected */
|
|
||||||
if (*++curptr == '\0') /* end of current argument */
|
|
||||||
optind++ ; /* skip to next for next round */
|
|
||||||
optarg = NULL; /* just in case */
|
|
||||||
}
|
|
||||||
return optopt ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
error_message
|
|
||||||
|
|
||||||
System specific error message spouter. It prints the program
|
|
||||||
name first if optprogname is not NULL.
|
|
||||||
|
|
||||||
References the global optopt.
|
|
||||||
|
|
||||||
Returns: nothing.
|
|
||||||
*/
|
|
||||||
static void error_message ( char * msgfmt )
|
|
||||||
{
|
|
||||||
#if defined(GUI_APPLICATION)
|
|
||||||
char buf[MESSAGEMAX];
|
|
||||||
char * title ;
|
|
||||||
|
|
||||||
sprintf( buf, msgfmt, optopt );
|
|
||||||
title = (optprogname == NULL) ? ERR_TITLE : optprogname ;
|
|
||||||
MessageBox( 0, buf, title, MB_ICONERROR | MB_OK );
|
|
||||||
#else
|
|
||||||
if (optprogname != NULL)
|
|
||||||
fprintf( stderr, ERR_PREFIX, optprogname );
|
|
||||||
fprintf( stderr, msgfmt, optopt );
|
|
||||||
#endif
|
|
||||||
return ;
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
/*
|
|
||||||
getopt.h
|
|
||||||
Copyright (c) 1996,1997 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
$Id: getopt.h,v 1.1 2004/10/01 12:33:39 chris Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(GETOPT_H_INCLUDED)
|
|
||||||
#define GETOPT_H_INCLUDED
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* macros for getopt() */
|
|
||||||
#define OPT_BADOPT 0 /* error return code for getopt() */
|
|
||||||
/* Note that EOF better not be zero! */
|
|
||||||
#define OPT_BADARG ((int)':') /* no argument given when there should */
|
|
||||||
/* be one! Note that ':' cannot be an */
|
|
||||||
/* option! */
|
|
||||||
|
|
||||||
/* global variables for getopt() */
|
|
||||||
extern char * optarg; /* argument if option has one */
|
|
||||||
extern int opterr; /* 0 = don't print err msg, 1 = print */
|
|
||||||
extern int optind; /* next argument to process */
|
|
||||||
extern int optopt ; /* current option */
|
|
||||||
extern char * optprogname; /* name of program to print before error msg */
|
|
||||||
extern int optreset ; /* set by user to 1 if you want to reset getopt() */
|
|
||||||
|
|
||||||
/* global variables for gesubopt() */
|
|
||||||
extern char * suboptarg ;
|
|
||||||
|
|
||||||
/* function declarations */
|
|
||||||
extern int getopt (int argc, char * const * argv, const char * optlist );
|
|
||||||
extern int getsubopt ( char ** optargp, char * const * optsp,
|
|
||||||
char ** suboptvalp );
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* GETOPT_H_INCLUDED */
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
mktemp.c Create a temporary file name.
|
|
||||||
Copyright 1996-2012 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
This code is released under the terms of the GNU General Public
|
|
||||||
License Version 2. You should have received a copy of the GNU
|
|
||||||
General Public License along with this program; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
|
|
||||||
USA.
|
|
||||||
|
|
||||||
Originally written for use in tofrodos, when compiled with
|
|
||||||
Watcom 10.0, which did not have either mktemp() or mkstemp().
|
|
||||||
Tofrodos can be found at
|
|
||||||
http://www.thefreecountry.com/tofrodos/index.shtml
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <errno.h> /* errno, ENOENT, EINVAL, EEXIST */
|
|
||||||
#include <io.h> /* access() */
|
|
||||||
#include <string.h> /* strlen(), strcmp() */
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h> /* O_IRUSR, O_IWUSR */
|
|
||||||
#include <fcntl.h> /* open(), O_RDWR, O_CREAT, O_EXCL */
|
|
||||||
#include "mktemp.h" /* our own header */
|
|
||||||
|
|
||||||
#define MAXVAL (65535u) /* unsigned is at least this (ANSI) */
|
|
||||||
|
|
||||||
/*
|
|
||||||
mkstemp
|
|
||||||
|
|
||||||
Creates a temporary file using "templ" and returns a
|
|
||||||
file descriptor opened using open(). The file is
|
|
||||||
open for read and write binary (not text) access
|
|
||||||
for the current user. The new filename is placed
|
|
||||||
in "templ", overwriting its existing contents.
|
|
||||||
|
|
||||||
The file path in "templ" must have six trailing "X"s,
|
|
||||||
ie, it must end with "XXXXXX".
|
|
||||||
|
|
||||||
On success, mkstemp() returns the file descriptor.
|
|
||||||
On failure, it returns -1, and errno is set to
|
|
||||||
EINVAL if "templ" does not end with "XXXXXX" on
|
|
||||||
entry to the function, or EEXIST if no file could
|
|
||||||
be created.
|
|
||||||
|
|
||||||
Function compatibility:
|
|
||||||
O_BINARY is used in file creation. This flag
|
|
||||||
only exists on Windows and MSDOS compilers.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
char tempfilename[] = "\\tmp\\myXXXXXX" ;
|
|
||||||
int fd ;
|
|
||||||
fd = mkstemp( tempfilename );
|
|
||||||
*/
|
|
||||||
int mkstemp ( char * templ )
|
|
||||||
{
|
|
||||||
static unsigned val ;
|
|
||||||
static char fch = 'A' ;
|
|
||||||
|
|
||||||
char *s ;
|
|
||||||
char *startp ;
|
|
||||||
size_t len ;
|
|
||||||
unsigned tval ;
|
|
||||||
int fd ;
|
|
||||||
int orig_errno ;
|
|
||||||
|
|
||||||
orig_errno = errno ;
|
|
||||||
|
|
||||||
/* do some sanity checks */
|
|
||||||
/* make sure that templ is at least 6 characters long */
|
|
||||||
/* and comprises the "XXXXXX" string at the end */
|
|
||||||
if ((len = strlen(templ)) < 6 ||
|
|
||||||
strcmp( (s = startp = templ + len - 6), MKTEMP_TEMPLATE )) {
|
|
||||||
errno = EINVAL ;
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
for ( ; fch <= 'Z'; val = 0, fch++ ) {
|
|
||||||
/* plug the first character */
|
|
||||||
*startp = fch ;
|
|
||||||
/* convert val to ascii */
|
|
||||||
/* note that we skip the situation where val == MAXVAL */
|
|
||||||
/* because if unsigned has a maximum value of MAXVAL */
|
|
||||||
/* in an implementation, and we do a compare of */
|
|
||||||
/* val <= MAXVAL, the test will always return true! */
|
|
||||||
/* Our way, we have at least a cut-off point: MAXVAL. */
|
|
||||||
for ( ; val < MAXVAL; ) {
|
|
||||||
tval = val++ ;
|
|
||||||
for (s = startp + 5; s > startp ; s--) {
|
|
||||||
*s = (char) ((tval % 10) + '0') ;
|
|
||||||
tval /= 10 ;
|
|
||||||
}
|
|
||||||
if ((fd = open( templ, O_CREAT | O_EXCL | O_BINARY | O_RDWR, S_IRUSR | S_IWUSR )) != -1) {
|
|
||||||
errno = orig_errno ;
|
|
||||||
return fd ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
errno = EEXIST ;
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
mktemp.h Declares my mktemp() function.
|
|
||||||
Copyright 1996-2012 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
Originally written for use in tofrodos, when compiled with
|
|
||||||
Watcom 10.0, which did not have either mktemp() or mkstemp().
|
|
||||||
Tofrodos can be found at
|
|
||||||
http://www.thefreecountry.com/tofrodos/index.shtml
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(MKTEMP_H_INCLUDED)
|
|
||||||
#define MKTEMP_H_INCLUDED
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define MKTEMP_TEMPLATE "XXXXXX"
|
|
||||||
|
|
||||||
/* functions declarations */
|
|
||||||
extern int mkstemp ( char * templ );
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,97 +0,0 @@
|
||||||
# makefile.gcc Makefile for building with the GNU C compiler on Linux.
|
|
||||||
# Copyright 1996-2012 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
# This makefile requires the GNU make to work (we use the GNU extensions).
|
|
||||||
|
|
||||||
# Define the following if you need
|
|
||||||
#
|
|
||||||
# DEBUG to add debugging information, eg "make DEBUG=1 all"
|
|
||||||
|
|
||||||
|
|
||||||
ifdef DEBUG
|
|
||||||
CDEBUG = -g
|
|
||||||
LDEBUG = -g
|
|
||||||
else
|
|
||||||
CDEBUG = -O2
|
|
||||||
LDEBUG = -s
|
|
||||||
endif
|
|
||||||
|
|
||||||
# programs
|
|
||||||
CC = gcc
|
|
||||||
CD = cd
|
|
||||||
CP = cp
|
|
||||||
GZIP = gzip
|
|
||||||
INSTALL = install
|
|
||||||
LN = ln
|
|
||||||
LD = gcc
|
|
||||||
MAKE = make
|
|
||||||
MKDIR = mkdir
|
|
||||||
MV = mv
|
|
||||||
RM = rm -f
|
|
||||||
|
|
||||||
# flags
|
|
||||||
CFLAGS = $(DEFINES) $(TFLAG) $(CDEBUG) -c -Wall
|
|
||||||
GZIPFLAGS = -9
|
|
||||||
INSTALLBINFLAGS = -m 755
|
|
||||||
INSTALLDATAFLAGS = -m 644
|
|
||||||
LDFLAGS = $(LDEBUG)
|
|
||||||
LNFLAGS = -sf
|
|
||||||
RMRECURFLAGS = -rf
|
|
||||||
|
|
||||||
# directories
|
|
||||||
BINDIR = /usr/bin
|
|
||||||
LIBDIR = lib
|
|
||||||
MANDIR = /usr/man/man1
|
|
||||||
|
|
||||||
# filenames
|
|
||||||
FROMDOS = fromdos
|
|
||||||
FROMDOSMAN = fromdos.1
|
|
||||||
FROMDOSTXT = fromdos.txt
|
|
||||||
TODOS = todos
|
|
||||||
ZIPSRCNAME = tfd.zip
|
|
||||||
|
|
||||||
# lists of filenames
|
|
||||||
OBJS = emsg.o \
|
|
||||||
init.o \
|
|
||||||
tofrodos.o \
|
|
||||||
utility.o
|
|
||||||
|
|
||||||
# implicit rules
|
|
||||||
.c.o:
|
|
||||||
$(CC) $(CFLAGS) $<
|
|
||||||
|
|
||||||
# user visible rules
|
|
||||||
all: $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(OBJS)
|
|
||||||
|
|
||||||
clobber: clean
|
|
||||||
$(RM) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
install: installman
|
|
||||||
$(INSTALL) $(INSTALLBINFLAGS) $(FROMDOS) $(BINDIR)
|
|
||||||
($(CD) $(BINDIR) ; $(LN) $(LNFLAGS) fromdos todos)
|
|
||||||
|
|
||||||
installman: $(FROMDOSMAN)
|
|
||||||
$(INSTALL) $(INSTALLDATAFLAGS) $(FROMDOSMAN) $(MANDIR)
|
|
||||||
($(CD) $(MANDIR) ; $(LN) $(LNFLAGS) fromdos.1 todos.1)
|
|
||||||
|
|
||||||
|
|
||||||
# real rules
|
|
||||||
$(FROMDOS): $(OBJS)
|
|
||||||
$(CC) $(LDFLAGS) -o $(FROMDOS) $(OBJS)
|
|
||||||
|
|
||||||
$(FROMDOSTXT): $(FROMDOSMAN)
|
|
||||||
gtbl $(FROMDOSMAN) | groff -Tascii -mandoc | \
|
|
||||||
troff -Tascii -mandoc | grotty > $@
|
|
||||||
|
|
||||||
$(TODOS): $(FROMDOS)
|
|
||||||
$(LN) $(LNFLAGS) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
# objects
|
|
||||||
init.o: init.c config.h emsg.h tofrodos.h utility.h version.h
|
|
||||||
|
|
||||||
tofrodos.o: tofrodos.c config.h emsg.h tofrodos.h utility.h version.h
|
|
||||||
|
|
||||||
utility.o: utility.c config.h emsg.h tofrodos.h utility.h
|
|
|
@ -1,68 +0,0 @@
|
||||||
# makefile.min Makefile for building with the MinGW (GNU) C Compiler.
|
|
||||||
# Copyright (c) 1996-2005 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
# $Id: makefile.min,v 1.2 2005/03/06 05:40:49 chris Exp $
|
|
||||||
|
|
||||||
# This makefile requires the GNU make to work (we use the GNU extensions).
|
|
||||||
|
|
||||||
# Define the following if you need
|
|
||||||
#
|
|
||||||
# DEBUG to add debugging information, eg "make DEBUG=1 all"
|
|
||||||
|
|
||||||
|
|
||||||
ifdef DEBUG
|
|
||||||
CDEBUG = -g
|
|
||||||
LDEBUG = -g
|
|
||||||
else
|
|
||||||
CDEBUG = -O2
|
|
||||||
LDEBUG = -s
|
|
||||||
endif
|
|
||||||
|
|
||||||
# programs
|
|
||||||
CC = gcc
|
|
||||||
CD = cd
|
|
||||||
CP = copy
|
|
||||||
INSTALL = install
|
|
||||||
LD = gcc
|
|
||||||
|
|
||||||
# flags
|
|
||||||
CFLAGS = $(DEFINES) $(TFLAG) $(CDEBUG) -c -Wall
|
|
||||||
GZIPFLAGS = -9
|
|
||||||
LDFLAGS = $(LDEBUG)
|
|
||||||
|
|
||||||
# directories
|
|
||||||
LIBDIR = lib
|
|
||||||
|
|
||||||
# filenames
|
|
||||||
FROMDOS = fromdos.exe
|
|
||||||
FROMDOSMAN = fromdos.1
|
|
||||||
TODOS = todos.exe
|
|
||||||
|
|
||||||
# lists of filenames
|
|
||||||
OBJS = emsg.o \
|
|
||||||
init.o \
|
|
||||||
tofrodos.o \
|
|
||||||
utility.o
|
|
||||||
|
|
||||||
# implicit rules
|
|
||||||
.c.o:
|
|
||||||
$(CC) $(CFLAGS) $<
|
|
||||||
|
|
||||||
# user visible rules
|
|
||||||
all: $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
# real rules
|
|
||||||
$(FROMDOS): $(OBJS)
|
|
||||||
$(CC) $(LDFLAGS) -o $(FROMDOS) $(OBJS)
|
|
||||||
|
|
||||||
$(TODOS): $(FROMDOS)
|
|
||||||
$(CP) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
# objects
|
|
||||||
emsg.o: emsg.c config.h emsg.h tofrodos.h
|
|
||||||
|
|
||||||
init.o: init.c config.h emsg.h tofrodos.h utility.h version.h
|
|
||||||
|
|
||||||
tofrodos.o: tofrodos.c config.h emsg.h tofrodos.h utility.h version.h
|
|
||||||
|
|
||||||
utility.o: utility.c config.h emsg.h tofrodos.h utility.h
|
|
|
@ -1,89 +0,0 @@
|
||||||
# Makefile for use with Visual Studio .NET 2003 to generate Win32 binaries
|
|
||||||
# Copyright 2005 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
# To debug, just use the IDE. Sorry.
|
|
||||||
|
|
||||||
# Programs
|
|
||||||
# Warning: the RM macro assumes that the del command accepts a "/y"
|
|
||||||
# argument (yes to all prompts) and accepts multiple filenames for
|
|
||||||
# deletion.
|
|
||||||
CC = cl
|
|
||||||
CP = copy
|
|
||||||
LD = link
|
|
||||||
RM = del /y
|
|
||||||
ZIP = zip
|
|
||||||
|
|
||||||
# Flags
|
|
||||||
CFLAGS = $(CFL1) $(CFL2)
|
|
||||||
# /nologo - suppress startup banner
|
|
||||||
# /Zi - debug - create program database
|
|
||||||
# /W4 - warning level 4
|
|
||||||
# /WX - treat warnings as errors
|
|
||||||
# /02 - maximize speed (/Og /Oi /Ot /Oy /Gs /GF /Gy)
|
|
||||||
# note that
|
|
||||||
# /Og global optimizations (implied by /O2)
|
|
||||||
# /Oi - enable intrinsic functions
|
|
||||||
# /Ot - optimize speed
|
|
||||||
# /Oy -
|
|
||||||
# /Gs stack checking calls (for local variables)
|
|
||||||
# /GF enable string pooling
|
|
||||||
# /Gy function-level linking
|
|
||||||
# /Ob1 - only expand __inline functions
|
|
||||||
# /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS"
|
|
||||||
# /ML - single threaded library
|
|
||||||
# /Fo - output dir
|
|
||||||
# /Fd - PDB dir
|
|
||||||
# /I - include directory
|
|
||||||
# /c - compile only
|
|
||||||
CFL1 = /nologo /Zi /W4 /WX /O2 /Ob1 /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /ML
|
|
||||||
CFL2 = /I "$(LIBDIR)" /Fo"$(BINDIR)\\" /Fd"$(BINDIR)\\" /c
|
|
||||||
LDFLAGS = $(LDFL1) $(LDFL2) $(LDFL3) $(LDFL4)
|
|
||||||
LDFL1 = /OUT:"$(FROMDOS)" /INCREMENTAL:NO /NOLOGO /DEBUG /PDB:"$(PDBFILE)"
|
|
||||||
LDFL2 = /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /MACHINE:X86
|
|
||||||
LDFL3 = odbc32.lib odbccp32.lib setargv.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
|
|
||||||
LDFL4 = advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
|
|
||||||
|
|
||||||
# Directories
|
|
||||||
BINDIR = .\bin
|
|
||||||
LIBDIR = .\lib
|
|
||||||
|
|
||||||
# Files
|
|
||||||
FROMDOS = $(BINDIR)\fromdos.exe
|
|
||||||
TODOS = $(BINDIR)\todos.exe
|
|
||||||
|
|
||||||
OBJS = $(BINDIR)\emsg.obj \
|
|
||||||
$(BINDIR)\init.obj \
|
|
||||||
$(BINDIR)\getopt.obj \
|
|
||||||
$(BINDIR)\mktemp.obj \
|
|
||||||
$(BINDIR)\tofrodos.obj \
|
|
||||||
$(BINDIR)\utility.obj
|
|
||||||
PDBFILE = $(BINDIR)\fromdos.pdb
|
|
||||||
|
|
||||||
# Implicit rules
|
|
||||||
.c{$(BINDIR)}.obj:
|
|
||||||
$(CC) @<<
|
|
||||||
$(CFLAGS) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
# Rules
|
|
||||||
all: $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(OBJS)
|
|
||||||
|
|
||||||
clobber: clean
|
|
||||||
$(RM) $(FROMDOS) $(TODOS) $(PDBFILE)
|
|
||||||
|
|
||||||
$(FROMDOS): $(OBJS)
|
|
||||||
$(LD) @<<
|
|
||||||
$(LDFLAGS) $(OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
$(TODOS): $(FROMDOS)
|
|
||||||
$(CP) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
$(BINDIR)\getopt.obj: $(LIBDIR)\getopt.c $(LIBDIR)\getopt.h
|
|
||||||
$(CC) $(CFLAGS) $(LIBDIR)\getopt.c
|
|
||||||
|
|
||||||
$(BINDIR)\mktemp.obj: $(LIBDIR)\mktemp.c $(LIBDIR)\mktemp.h
|
|
||||||
$(CC) $(CFLAGS) $(LIBDIR)\mktemp.c
|
|
|
@ -1,122 +0,0 @@
|
||||||
# makefile.wcc Makefile for building with the Watcom and OpenWatcom C/C++ compiler.
|
|
||||||
# Copyright 1996-2011 Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
# Prevent checking for existence of targets after rule has been executed.
|
|
||||||
.NOCHECK
|
|
||||||
|
|
||||||
# This makefile assumes you have wildargv.c in the lib subdirectory.
|
|
||||||
# wildargv.c is not provided in the distribution. You should use
|
|
||||||
# the one from watcom\src\startup\wildargv.c. This file expands
|
|
||||||
# wildcards on the command line. You will also need initarg.h from
|
|
||||||
# your watcom\src\startup directory as well; put it in the tofrodos
|
|
||||||
# lib subdirectory.
|
|
||||||
|
|
||||||
# Define the following if you need
|
|
||||||
#
|
|
||||||
# DEBUG To add debugging information.
|
|
||||||
# If you want fine-tune the amount of debugging info, you
|
|
||||||
# can define CDEBUG to be the compiler option switch and
|
|
||||||
# LDEBUG for the linker.
|
|
||||||
# TARGET To determine the type of target
|
|
||||||
# 32bit if you want a 32 bit DOS executable (using a DOS extender)
|
|
||||||
# 16bit if you want a 16 bit DOS executable
|
|
||||||
# Win32 if you want a Windows 32 bit console executable
|
|
||||||
# The default is to generate a Win32 console executable.
|
|
||||||
|
|
||||||
!ifdef DEBUG
|
|
||||||
!ifndef CDEBUG
|
|
||||||
CDEBUG = -d2
|
|
||||||
!endif
|
|
||||||
!ifndef LDEBUG
|
|
||||||
LDEBUG = d all
|
|
||||||
!endif
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifeq TARGET 32bit
|
|
||||||
CCBIN = wcc386
|
|
||||||
!ifndef TCFLAGS
|
|
||||||
TCFLAGS = -bt=DOS -mf -5r -fp3
|
|
||||||
!endif
|
|
||||||
!ifndef TLFLAGS
|
|
||||||
TLFLAGS = sys dos4g
|
|
||||||
!endif
|
|
||||||
!else
|
|
||||||
!ifeq TARGET 16bit
|
|
||||||
CCBIN = wcc
|
|
||||||
!ifndef TCFLAGS
|
|
||||||
TCFLAGS = -ms -bt=DOS
|
|
||||||
!endif
|
|
||||||
!ifndef TLFLAGS
|
|
||||||
TLFLAGS = sys dos
|
|
||||||
!endif
|
|
||||||
!else # Win32
|
|
||||||
CCBIN = wcc386
|
|
||||||
!ifndef TCFLAGS
|
|
||||||
TCFLAGS = -bt=nt -6r -fp6
|
|
||||||
!endif
|
|
||||||
!ifndef TLFLAGS
|
|
||||||
TLFLAGS = sys nt
|
|
||||||
!endif
|
|
||||||
!endif # if 16bit else Win32
|
|
||||||
!endif # if 32bit else 16bit||Win32
|
|
||||||
|
|
||||||
# programs
|
|
||||||
CC = $(CCBIN)
|
|
||||||
LD = wlink
|
|
||||||
LN = copy
|
|
||||||
RM = del
|
|
||||||
|
|
||||||
# flags
|
|
||||||
CFLAGS = -oxa -wx -fpi -zp1 -zq $(TCFLAGS) $(CINCFLAGS) $(CDEBUG)
|
|
||||||
CINCFLAGS = -i=$(LIBDIR)
|
|
||||||
COUTFLAG = /fo=
|
|
||||||
LDFLAGS = $(TLFLAGS) op q,c,m,el $(LDEBUG)
|
|
||||||
|
|
||||||
# directories
|
|
||||||
LIBDIR = lib
|
|
||||||
SRCDIR = .
|
|
||||||
|
|
||||||
# filenames
|
|
||||||
FROMDOS = fromdos.exe
|
|
||||||
LDRESP = ldresp.rsp
|
|
||||||
TODOS = todos.exe
|
|
||||||
|
|
||||||
# lists of filenames
|
|
||||||
LIBOBJS = $(LIBDIR)\getopt.obj &
|
|
||||||
$(LIBDIR)\mktemp.obj &
|
|
||||||
$(LIBDIR)\wildargv.obj
|
|
||||||
OBJS = emsg.obj &
|
|
||||||
init.obj &
|
|
||||||
tofrodos.obj &
|
|
||||||
utility.obj
|
|
||||||
|
|
||||||
# implicit rules
|
|
||||||
.c: $(SRCDIR);$(LIBDIR)
|
|
||||||
.h: $(SRCDIR);$(LIBDIR)
|
|
||||||
.c.obj: .AUTODEPEND
|
|
||||||
$(CC) $(CFLAGS) $(COUTFLAG)$@ $[@
|
|
||||||
|
|
||||||
# user visible rules
|
|
||||||
all: $(FROMDOS) $(TODOS)
|
|
||||||
%null
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(OBJS) $(LIBOBJS)
|
|
||||||
$(RM) *.map *.err
|
|
||||||
$(RM) $(LDRESP) todos.exe fromdos.exe
|
|
||||||
|
|
||||||
clobber: clean
|
|
||||||
|
|
||||||
# real rules
|
|
||||||
$(FROMDOS): $(OBJS) $(LIBOBJS) $(LDRESP)
|
|
||||||
$(LD) @$(LDRESP)
|
|
||||||
|
|
||||||
$(TODOS): $(FROMDOS)
|
|
||||||
$(LN) $(LNFLAGS) $(FROMDOS) $(TODOS)
|
|
||||||
|
|
||||||
# support rules
|
|
||||||
$(LDRESP): $(__MAKEFILES__)
|
|
||||||
%write $@ $(LDFLAGS)
|
|
||||||
%append $@ name $(FROMDOS)
|
|
||||||
for %i in ($(OBJS)) do @%append $@ file %i
|
|
||||||
for %i in ($(LIBOBJS)) do @%append $@ file %i
|
|
|
@ -1,714 +0,0 @@
|
||||||
/*
|
|
||||||
tofrodos.c Converts text files between DOS and Unix formats.
|
|
||||||
Copyright 1996-2013 Christopher Heng. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this should always be first */
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
/* standard headers */
|
|
||||||
#include <errno.h> /* errno */
|
|
||||||
#include <signal.h> /* signal() */
|
|
||||||
#include <stdio.h> /* FILE functions */
|
|
||||||
#include <stdlib.h> /* EXIT_SUCCESS, mkstemp() in some systems, ltoa() */
|
|
||||||
#include <string.h> /* strrchr(), strlen(), strcpy(), strcat(), strerror() */
|
|
||||||
#include <sys/stat.h> /* stat() */
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__WATCOMC__)
|
|
||||||
#include <sys/utime.h>
|
|
||||||
#else /* everybody else keeps this in the include directory */
|
|
||||||
#if defined(UNIX)
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#include <utime.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* conditionally included headers */
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
#include <fcntl.h> /* O_BINARY */
|
|
||||||
#include <io.h> /* chmod(), setmode(), isatty() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HAVE_GETOPT_H)
|
|
||||||
#include <getopt.h> /* optind, getopt() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HAVE_MKTEMP_H) && defined(MKTEMP_HEADER)
|
|
||||||
#include MKTEMP_HEADER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HAVE_UNISTD_H)
|
|
||||||
#include <unistd.h> /* chmod(), mktemp(), isatty(), chown(), readlink(), mkstemp() in some systems, (getopt()) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* our headers */
|
|
||||||
#include "emsg.h"
|
|
||||||
#include "tofrodos.h"
|
|
||||||
#include "utility.h"
|
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define BAKEXT ".bak" /* backup file extension */
|
|
||||||
#define MKTEMP_TEMPL "XXXXXX"
|
|
||||||
#define NEWBUFSIZ 16384 /* buffer size for the files */
|
|
||||||
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
#define DIRSLASH '\\'
|
|
||||||
#define DIRSLASHSTR "\\"
|
|
||||||
#else
|
|
||||||
#define DIRSLASH '/'
|
|
||||||
#define DIRSLASHSTR "/"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* conditional macros */
|
|
||||||
#if defined(MSDOS)
|
|
||||||
#if !defined(_MAX_DIR) || (_MAX_DIR < 260) /* MAXDIRSIZE */
|
|
||||||
#define MAXDIRSIZE 260
|
|
||||||
#else
|
|
||||||
#define MAXDIRSIZE _MAX_DIR
|
|
||||||
#endif
|
|
||||||
#if !defined(_MAX_NAME) || (_MAX_NAME < 260) /* MAXFILESIZE */
|
|
||||||
#define MAXFILESIZE 260
|
|
||||||
#else
|
|
||||||
#define MAXFILESIZE _MAX_NAME
|
|
||||||
#endif
|
|
||||||
#if !defined(_MAX_PATH) || (_MAX_PATH < 260) /* MAXPATHSIZE */
|
|
||||||
#define MAXPATHSIZE 260
|
|
||||||
#else
|
|
||||||
#define MAXPATHSIZE _MAX_PATH
|
|
||||||
#endif
|
|
||||||
#if !defined(_MAX_DRIVE)
|
|
||||||
#define _MAX_DRIVE 3 /* for the benefit of djgpp */
|
|
||||||
#endif
|
|
||||||
#endif /* if defined(MSDOS) */
|
|
||||||
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
#define INFILEMODE "rb"
|
|
||||||
#define OUTFILEMODE "wb"
|
|
||||||
#else
|
|
||||||
#define INFILEMODE "r"
|
|
||||||
#define OUTFILEMODE "w"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
#define CURRENTDIR ".\\" /* not used in MSDOS though */
|
|
||||||
#else /* Unix-type systems */
|
|
||||||
#define CURRENTDIR "./"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* global variables */
|
|
||||||
int abortonerr ; /* 1 if should abort when there is error in any file */
|
|
||||||
/* in a list of files, 0 carry on (default) */
|
|
||||||
int alwaysconvert ; /* convert all \r\n to \r\r\n when direction */
|
|
||||||
/* is UNIXTODOS, and delete all \r when direction is */
|
|
||||||
/* DOSTOUNIX */
|
|
||||||
int direction = DEFDIRECTION ; /* UNIXTODOS or DOSTOUNIX */
|
|
||||||
int forcewrite ; /* convert even if file is not writeable */
|
|
||||||
char * errorlogfilename ; /* name of error log file, NULL if we're printing to stderr */
|
|
||||||
int preserve ; /* 1 if we are to preserve owner (Unix) and date (all) */
|
|
||||||
char * progname = VERSN_PROGNAME ;/* name of binary (ie, argv[0]) */
|
|
||||||
int overwrite = 1 ; /* 1 = overwrite original file, 0 = make backup */
|
|
||||||
int verbose ;
|
|
||||||
|
|
||||||
/* local variables */
|
|
||||||
static char * infilename = "stdin" ;
|
|
||||||
static FILE * tempfp ;
|
|
||||||
static char * tempfilename ;
|
|
||||||
|
|
||||||
/* local functions */
|
|
||||||
#if !defined(UNIX)
|
|
||||||
static int checkmode ( char * filename, unsigned short * origfilemodep,
|
|
||||||
struct utimbuf * filetimebufp );
|
|
||||||
#else
|
|
||||||
static int checkmode ( char * filename, unsigned short * origfilemodep,
|
|
||||||
struct utimbuf * filetimebufp, uid_t * ownerp, gid_t * groupp );
|
|
||||||
#endif
|
|
||||||
static int convert ( FILE * infp, FILE * outfp );
|
|
||||||
static int openandconvert ( char * filename );
|
|
||||||
#if !defined(UNIX)
|
|
||||||
#define openandconvert_preamble openandconvert
|
|
||||||
#else
|
|
||||||
static int openandconvert_preamble ( char * filename );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
main
|
|
||||||
|
|
||||||
tofrodos converts ASCII text files to/from a DOS CR-LF deliminated
|
|
||||||
form from/to a Unix LF deliminated form.
|
|
||||||
|
|
||||||
Usage: tofrodos [options] [file...]
|
|
||||||
|
|
||||||
Exit codes:
|
|
||||||
EXIT_SUCCESS success (stdlib.h)
|
|
||||||
EXIT_ERROR error (tofrodos.h)
|
|
||||||
*/
|
|
||||||
int main ( int argc, char ** argv )
|
|
||||||
{
|
|
||||||
int err ;
|
|
||||||
|
|
||||||
/* initialise and parse the options */
|
|
||||||
if (init( argv[0] ) || parseargs( argc, argv ))
|
|
||||||
return EXIT_ERROR ;
|
|
||||||
|
|
||||||
/* check if we are to convert from stdin */
|
|
||||||
if (argc == optind) {
|
|
||||||
if (isatty( fileno( stdin ) )) {
|
|
||||||
/* stdin must be redirected else you should supply a */
|
|
||||||
/* filename. */
|
|
||||||
emsg( EMSG_NOFILENAME );
|
|
||||||
return EXIT_ERROR ;
|
|
||||||
}
|
|
||||||
/* otherwise stdin has been redirected */
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
/* need to make sure the input and output files are binary */
|
|
||||||
/* on MSDOS and WIN32 */
|
|
||||||
setmode( fileno( stdin ), O_BINARY );
|
|
||||||
setmode( fileno( stdout ), O_BINARY );
|
|
||||||
#endif
|
|
||||||
return openandconvert( NULL ) ? EXIT_ERROR : EXIT_SUCCESS ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we reach here, we have a (list?) of files to convert */
|
|
||||||
/* (ignore stdin) */
|
|
||||||
err = 0 ;
|
|
||||||
while (optind < argc) {
|
|
||||||
if (verbose)
|
|
||||||
emsg( VERBOSE_CONVERTING, argv[optind] );
|
|
||||||
if ((err = openandconvert_preamble( argv[optind] )) != 0 && abortonerr)
|
|
||||||
return EXIT_ERROR ;
|
|
||||||
optind++ ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return err ? EXIT_ERROR : EXIT_SUCCESS ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
sighandler
|
|
||||||
|
|
||||||
Handles SIGINT and SIGTERM. Prints a message, closes and
|
|
||||||
deletes the temporary files and quits with EXIT_ERROR.
|
|
||||||
|
|
||||||
It never returns (and Watcom C knows it).
|
|
||||||
*/
|
|
||||||
void sighandler ( int sig )
|
|
||||||
{
|
|
||||||
/* restore signal handler, in case we have the old unsafe behaviour */
|
|
||||||
signal( sig, sighandler );
|
|
||||||
|
|
||||||
/* print error message for this only if verbose */
|
|
||||||
if (verbose)
|
|
||||||
emsg( EMSG_SIGNAL );
|
|
||||||
|
|
||||||
/* close the temporary file and delete it */
|
|
||||||
if (tempfp != NULL) {
|
|
||||||
fclose( tempfp );
|
|
||||||
tempfp = NULL ;
|
|
||||||
}
|
|
||||||
if (tempfilename != NULL) {
|
|
||||||
remove( tempfilename );
|
|
||||||
tempfilename = NULL ;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit( EXIT_ERROR );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------- local functions --------------------- */
|
|
||||||
/*
|
|
||||||
checkmode
|
|
||||||
|
|
||||||
Checks that the file we are supposed to convert is indeed
|
|
||||||
writeable. We don't really need for it to be writeable, since
|
|
||||||
we actually open a new file and eventually delete the current
|
|
||||||
file.
|
|
||||||
|
|
||||||
However, if a file is marked not-writeable, we should at least
|
|
||||||
respect the user's choice and abort unless he flags the
|
|
||||||
forcewrite flag.
|
|
||||||
|
|
||||||
At the same time we also save the current mode of the file
|
|
||||||
so that we can set the converted file to the same mode. The
|
|
||||||
value is saved in the variable pointed to by origfilemodep.
|
|
||||||
|
|
||||||
Returns: 0 on success, -1 on error.
|
|
||||||
|
|
||||||
If -1 is returned, it could mean one of few things:
|
|
||||||
1) some component of the path was not valid (directory or the file
|
|
||||||
itself) (DOS/Unix) or search permission was denied (Unix)
|
|
||||||
2) the file is not readable
|
|
||||||
3) the file is not writeable and forcewrite is zero.
|
|
||||||
An error message is displayed on error.
|
|
||||||
*/
|
|
||||||
#if !defined(UNIX)
|
|
||||||
static int checkmode ( char * filename, unsigned short * origfilemodep,
|
|
||||||
struct utimbuf * filetimebufp )
|
|
||||||
#else
|
|
||||||
static int checkmode ( char * filename, unsigned short * origfilemodep,
|
|
||||||
struct utimbuf * filetimebufp, uid_t * ownerp, gid_t * groupp )
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
struct stat statbuf ;
|
|
||||||
|
|
||||||
/* get the file information */
|
|
||||||
if (stat( filename, &statbuf )) {
|
|
||||||
/* couldn't stat the file. */
|
|
||||||
emsg( EMSG_ACCESSFILE, filename );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
/* save the mode */
|
|
||||||
*origfilemodep = statbuf.st_mode ;
|
|
||||||
/* save the file times for restore later */
|
|
||||||
filetimebufp->actime = statbuf.st_atime ;
|
|
||||||
filetimebufp->modtime = statbuf.st_mtime ;
|
|
||||||
#if defined(UNIX)
|
|
||||||
/* save the owner and group id */
|
|
||||||
*ownerp = statbuf.st_uid ;
|
|
||||||
*groupp = statbuf.st_gid ;
|
|
||||||
#endif
|
|
||||||
/* check if file can be read - this is actually redundant for */
|
|
||||||
/* DOS systems. */
|
|
||||||
if (!(statbuf.st_mode & S_IRUSR)) { /* not readable */
|
|
||||||
emsg( EMSG_NOTREADABLE, filename );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
/* check if file can be written to, if forcewrite is 0 */
|
|
||||||
if (!forcewrite && !(statbuf.st_mode & S_IWUSR)) { /* not writeable */
|
|
||||||
emsg( EMSG_NOTWRITEABLE, filename );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
convert
|
|
||||||
|
|
||||||
Does the actual work of converting infp to outfp.
|
|
||||||
|
|
||||||
If direction is DOSTOUNIX, "\r\n" pairs will be converted to
|
|
||||||
'\n'. However, standalone '\r' without a '\n' immediately
|
|
||||||
following will not be eliminated unless alwaysconvert is
|
|
||||||
nonzero.
|
|
||||||
|
|
||||||
If direction is UNIXTODOS, '\n' will be converted to "\r\n".
|
|
||||||
However "\r\n" pairs are not converted to '\r\r\n' unless
|
|
||||||
alwaysconvert is nonzero.
|
|
||||||
|
|
||||||
Returns 0 on success, -1 on error.
|
|
||||||
*/
|
|
||||||
static int convert ( FILE * infp, FILE * outfp )
|
|
||||||
{
|
|
||||||
int prevch ;
|
|
||||||
int c ;
|
|
||||||
|
|
||||||
/* actually it is very simple to do the conversion in DOS/WIN32 */
|
|
||||||
/* because the stdio library does this work automatically for */
|
|
||||||
/* us. But since we want this program to work on Linux as */
|
|
||||||
/* well, a little bit of work stands before us (but only a little). */
|
|
||||||
|
|
||||||
prevch = EOF ;
|
|
||||||
|
|
||||||
if (direction == UNIXTODOS) {
|
|
||||||
/* basically we convert all newlines to "\r\n" unless */
|
|
||||||
/* the file is already in "\r\n" format. The problem here */
|
|
||||||
/* is when you have special situations like a Unix */
|
|
||||||
/* text file with lines that have a '\r' just */
|
|
||||||
/* before a '\n'. These lines will */
|
|
||||||
/* not be converted to "\r\r\n" since the function */
|
|
||||||
/* below assumes the line has already been converted. */
|
|
||||||
/* To force the conversion of all \n to \r\n regardless */
|
|
||||||
/* of preceding characters, set alwaysconvert to 1. */
|
|
||||||
while ( (c = getc( infp )) != EOF ) {
|
|
||||||
if (c == '\n' && (alwaysconvert || prevch != '\r')) {
|
|
||||||
if (putc( '\r', outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
/* always emit the current character */
|
|
||||||
if (putc( c, outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
prevch = c ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (direction == DOSTOUNIX) {
|
|
||||||
if (!alwaysconvert) {
|
|
||||||
/* basically we withhold emitting any '\r' until we */
|
|
||||||
/* are sure that the next character is not a '\n'. */
|
|
||||||
/* If it is not, we emit the '\r', if it is, we */
|
|
||||||
/* only emit the '\n'. */
|
|
||||||
while ( (c = getc( infp )) != EOF ) {
|
|
||||||
if (prevch == '\r') {
|
|
||||||
/* '\r' is a special case because we don't */
|
|
||||||
/* emit a '\r' until the next character */
|
|
||||||
/* has been read */
|
|
||||||
if (c == '\n') { /* a "\r\n" pair */
|
|
||||||
/* discard previous '\r' and */
|
|
||||||
/* just put the '\n' */
|
|
||||||
if (putc( c, outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
else { /* prevch was a standalone '\r' but the current char is not '\n' */
|
|
||||||
/* emit the standalone '\r' */
|
|
||||||
if (putc( '\r', outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
/* emit the current character if */
|
|
||||||
/* it is not a '\r' */
|
|
||||||
if (c != '\r') {
|
|
||||||
if (putc( c, outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else { /* prevch was not '\r' */
|
|
||||||
/* emit current character if it is not */
|
|
||||||
/* a '\r' */
|
|
||||||
if (c != '\r') {
|
|
||||||
if (putc( c, outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prevch = c ;
|
|
||||||
}
|
|
||||||
} /* alwaysconvert == 0 */
|
|
||||||
else { /* eliminate all '\r' */
|
|
||||||
while ((c = getc( infp )) != EOF) {
|
|
||||||
if (c != '\r') {
|
|
||||||
if (putc( c, outfp ) == EOF)
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
/* else skip all carriage returns */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emsg( EMSG_INTERNAL, EINTNL_DIRECTION );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we reach here, either we've reached an EOF or an error */
|
|
||||||
/* occurred. */
|
|
||||||
if (!feof( infp )) { /* error */
|
|
||||||
emsg( EMSG_CONVERT, infilename );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(UNIX)
|
|
||||||
/*
|
|
||||||
openandconvert_preamble
|
|
||||||
|
|
||||||
On a Unix-type system (including Linux and BSD systems), it is
|
|
||||||
possible for a given filename to be merely a symlink. This function
|
|
||||||
obtains the real filename given the symlink, and calls
|
|
||||||
openandconvert() with the real file name. It simply calls openandconvert()
|
|
||||||
if the filename is not a symlink.
|
|
||||||
|
|
||||||
Note: this function only exists on Unix-type systems. On MSDOS and Windows,
|
|
||||||
openandconvert_preamble() is merely a macro that resolves to
|
|
||||||
openandconvert().
|
|
||||||
|
|
||||||
Returns: whatever openandconvert() returns. (0 on success, -1 on
|
|
||||||
error. Error messages will be displayed on error before returning.
|
|
||||||
*/
|
|
||||||
static int openandconvert_preamble ( char * filename )
|
|
||||||
{
|
|
||||||
struct stat statbuf ;
|
|
||||||
char * realfilepath ;
|
|
||||||
int len ;
|
|
||||||
int err ;
|
|
||||||
|
|
||||||
/* get the file information */
|
|
||||||
if (lstat( filename, &statbuf )) {
|
|
||||||
/* couldn't stat the file. */
|
|
||||||
emsg( EMSG_ACCESSFILE, filename );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (S_ISLNK(statbuf.st_mode)) {
|
|
||||||
/* get the real filename for symbolic links */
|
|
||||||
/* Note: the S_ISLNK() macro is supposed to exist in sys/stat.h */
|
|
||||||
/* Early Unices may not have this macro. If it does not exist, you */
|
|
||||||
/* may have to define it yourself, a la S_ISDIR() and family. */
|
|
||||||
/* eg, #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) */
|
|
||||||
/* or something like that. */
|
|
||||||
|
|
||||||
/* for symbolic links, st_size contains the length of the pathname sans terminating null byte */
|
|
||||||
if (statbuf.st_size == 0) {
|
|
||||||
/* There's a report somewhere of a discovery that Mac OS X returns st_size == 0 for "/dev/stdin" when it
|
|
||||||
is a symlink to "fd/0". I'm not sure if it is a valid report, but let's play it safe. */
|
|
||||||
emsg ( EMSG_SYMLINK, filename );
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
realfilepath = xmalloc( statbuf.st_size + 1 );
|
|
||||||
|
|
||||||
if ((len = readlink( filename, realfilepath, statbuf.st_size )) != -1) {
|
|
||||||
|
|
||||||
/* got to null terminate the string - there is always space because */
|
|
||||||
/* we passed readlink() the size of the buffer less 1. */
|
|
||||||
realfilepath[len] = '\0' ;
|
|
||||||
if (verbose) {
|
|
||||||
emsg( VERBOSE_SYMLINKSRC, filename, realfilepath );
|
|
||||||
}
|
|
||||||
err = openandconvert( realfilepath );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emsg( EMSG_SYMLINK, filename );
|
|
||||||
err = -1 ;
|
|
||||||
}
|
|
||||||
free ( realfilepath );
|
|
||||||
return err ;
|
|
||||||
}
|
|
||||||
/* If we reach here, "filename" is not a symbolic link */
|
|
||||||
return openandconvert( filename );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
openandconvert
|
|
||||||
|
|
||||||
Called to open the files and convert the contents. If you want
|
|
||||||
it to convert stdin to stdout, call it with NULL as the filename
|
|
||||||
argument; otherwise pass the function the name of the input file.
|
|
||||||
|
|
||||||
Returns: 0 on success, -1 on error. Error messages will be
|
|
||||||
displayed on error before returning.
|
|
||||||
*/
|
|
||||||
static int openandconvert ( char * filename )
|
|
||||||
{
|
|
||||||
FILE * infp ;
|
|
||||||
FILE * outfp ;
|
|
||||||
int err ;
|
|
||||||
char * bakfilename ;
|
|
||||||
unsigned short origfilemode ; /* file mode of original file */
|
|
||||||
struct utimbuf filetimebuf ;
|
|
||||||
int tempfiledes;
|
|
||||||
#if defined(MSDOS)
|
|
||||||
char drv[_MAX_DRIVE];
|
|
||||||
char dir[MAXDIRSIZE];
|
|
||||||
char fname[MAXFILESIZE];
|
|
||||||
char tempname[MAXPATHSIZE];
|
|
||||||
#else
|
|
||||||
char * s ;
|
|
||||||
char * t ;
|
|
||||||
size_t len ;
|
|
||||||
int replacech ;
|
|
||||||
char c ;
|
|
||||||
#endif
|
|
||||||
#if defined(UNIX)
|
|
||||||
uid_t ownerid ;
|
|
||||||
gid_t groupid ;
|
|
||||||
#endif
|
|
||||||
#if NEWBUFSIZ > BUFSIZ
|
|
||||||
char * inbufptr ;
|
|
||||||
char * outbufptr ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* make sure we initialise */
|
|
||||||
bakfilename = NULL ;
|
|
||||||
err = 0 ;
|
|
||||||
|
|
||||||
if (filename != NULL) { /* stdin is not redirected */
|
|
||||||
|
|
||||||
/* check for appropriate permissions on the file */
|
|
||||||
/* also saves the mode in origfilemode */
|
|
||||||
#if !defined(UNIX)
|
|
||||||
if (checkmode( filename, &origfilemode, &filetimebuf ))
|
|
||||||
return -1 ;
|
|
||||||
#else
|
|
||||||
if (checkmode( filename, &origfilemode, &filetimebuf,
|
|
||||||
&ownerid, &groupid ))
|
|
||||||
return -1 ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* we need to create a temporary and backup filename (if */
|
|
||||||
/* applicable) in the same directory */
|
|
||||||
/* as our file. This is easy to do for DOS since we have the */
|
|
||||||
/* _splitpath(), _makepath() functions. */
|
|
||||||
#if defined(MSDOS)
|
|
||||||
_splitpath( filename, drv, dir, fname, NULL );
|
|
||||||
_makepath( tempname, drv, dir, MKTEMP_TEMPL, NULL );
|
|
||||||
tempfilename = xstrdup( tempname );
|
|
||||||
if (!overwrite) {
|
|
||||||
_makepath( tempname, drv, dir, fname, BAKEXT );
|
|
||||||
if (!strcmp( tempname, filename )) {
|
|
||||||
emsg( EMSG_BAKFILENAME, filename );
|
|
||||||
err = -1 ;
|
|
||||||
goto err_freetempfn ;
|
|
||||||
}
|
|
||||||
bakfilename = xstrdup( tempname );
|
|
||||||
}
|
|
||||||
#else /* not MSDOS - ie, Linux, Windows, anything else */
|
|
||||||
/* check if there is a path prefix */
|
|
||||||
if ((s = strrchr( filename, DIRSLASH )) != NULL) {
|
|
||||||
c = *++s ; /* save the character after the slash */
|
|
||||||
*s = '\0';
|
|
||||||
replacech = 1 ;
|
|
||||||
len = strlen( filename ) ;
|
|
||||||
t = filename ;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
replacech = c = 0 ; /* c is initialized as well to suppress */
|
|
||||||
/* the warning issued by gcc -Wall */
|
|
||||||
len = sizeof(CURRENTDIR) - 1 ;
|
|
||||||
t = CURRENTDIR ;
|
|
||||||
}
|
|
||||||
tempfilename = xmalloc( len + sizeof(MKTEMP_TEMPL) );
|
|
||||||
strcpy( tempfilename, t ); /* add the path leading to filename */
|
|
||||||
strcat( tempfilename, MKTEMP_TEMPL ); /* add the filename */
|
|
||||||
if (replacech)
|
|
||||||
*s = c ;
|
|
||||||
if (!overwrite) {
|
|
||||||
bakfilename = xmalloc( strlen( filename ) + sizeof( BAKEXT ) );
|
|
||||||
strcpy( bakfilename, filename );
|
|
||||||
strcat( bakfilename, BAKEXT ); /* append the extension to existing filename to create name of backup file */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* create the temporary file */
|
|
||||||
if ((tempfiledes = mkstemp( tempfilename )) == -1) {
|
|
||||||
emsg( EMSG_NOTEMPNAME, filename );
|
|
||||||
err = -1 ; /* redundant; defensive */
|
|
||||||
err_freebakfn:
|
|
||||||
if (!overwrite && bakfilename != NULL)
|
|
||||||
free( bakfilename );
|
|
||||||
#if defined(MSDOS)
|
|
||||||
err_freetempfn:
|
|
||||||
#endif
|
|
||||||
free( tempfilename );
|
|
||||||
tempfilename = NULL ;
|
|
||||||
return -1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open the filename as the input file */
|
|
||||||
if ((infp = fopen( filename, INFILEMODE )) == NULL) {
|
|
||||||
emsg( EMSG_OPENFILE, filename );
|
|
||||||
err = -1 ;
|
|
||||||
goto err_freebakfn ;
|
|
||||||
}
|
|
||||||
/* associate the infilename with the filename for error */
|
|
||||||
/* messages */
|
|
||||||
infilename = filename ;
|
|
||||||
|
|
||||||
/* open the temp file as the output file */
|
|
||||||
if ((tempfp = fdopen( tempfiledes, OUTFILEMODE )) == NULL) {
|
|
||||||
close ( tempfiledes );
|
|
||||||
remove ( tempfilename );
|
|
||||||
emsg( EMSG_CREATETEMP, tempfilename, filename );
|
|
||||||
fclose( infp );
|
|
||||||
err = -1 ;
|
|
||||||
goto err_freebakfn ;
|
|
||||||
}
|
|
||||||
outfp = tempfp ;
|
|
||||||
|
|
||||||
} /* if filename != NULL */
|
|
||||||
else { /* filename == NULL, ie stdin is redirected */
|
|
||||||
infp = stdin ;
|
|
||||||
outfp = stdout ;
|
|
||||||
|
|
||||||
/* not needed, but we do this for the record, and for */
|
|
||||||
/* fussy compilers */
|
|
||||||
origfilemode = 0 ;
|
|
||||||
memset( &filetimebuf, 0, sizeof( struct utimbuf ) );
|
|
||||||
|
|
||||||
#if defined(UNIX)
|
|
||||||
ownerid = groupid = 0 ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if NEWBUFSIZ > BUFSIZ
|
|
||||||
/* (don't use xmalloc() because if we can't get what we want, */
|
|
||||||
/* we just don't bother, and go ahead with the minimum) */
|
|
||||||
if ((inbufptr = malloc( NEWBUFSIZ )) != NULL)
|
|
||||||
setvbuf( infp, inbufptr, _IOFBF, NEWBUFSIZ );
|
|
||||||
if ((outbufptr = malloc( NEWBUFSIZ )) != NULL)
|
|
||||||
setvbuf( outfp, outbufptr, _IOFBF, NEWBUFSIZ );
|
|
||||||
#endif
|
|
||||||
/* do the conversion */
|
|
||||||
err = convert( infp, outfp );
|
|
||||||
|
|
||||||
/* close the files */
|
|
||||||
fclose( infp );
|
|
||||||
fclose( outfp );
|
|
||||||
|
|
||||||
if (tempfp != NULL) {
|
|
||||||
/* remove the output file handle from the global to avoid */
|
|
||||||
/* double attempts to close the same file */
|
|
||||||
tempfp = NULL ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if NEWBUFSIZ > BUFSIZ
|
|
||||||
/* got to free buffers we allocated first */
|
|
||||||
if (inbufptr != NULL)
|
|
||||||
free( inbufptr );
|
|
||||||
if (outbufptr != NULL)
|
|
||||||
free( outbufptr );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (filename != NULL) { /* stdin was not redirected */
|
|
||||||
|
|
||||||
if (err) { /* there was an error */
|
|
||||||
/* delete the temp file since we've already created it */
|
|
||||||
remove ( tempfilename );
|
|
||||||
goto err_freebakfn ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!overwrite) {
|
|
||||||
#if defined(MSDOS) || defined(WIN32)
|
|
||||||
/* delete any backup file of the same name first, since a rename() does not delete it automatically */
|
|
||||||
/* on DOS and Windows */
|
|
||||||
chmod( bakfilename, S_IRUSR|S_IWUSR ); /* make it writeable (in case it's not) so that it can be deleted */
|
|
||||||
remove( bakfilename ); /* don't check for error returns since the file may not even exist in the first place */
|
|
||||||
#endif
|
|
||||||
/* rename the original file to the back up name */
|
|
||||||
if (rename( filename, bakfilename )) {
|
|
||||||
emsg( EMSG_RENAMEBAK, filename, bakfilename, strerror( errno ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if defined(MSDOS) || defined(WIN32) /* we need to delete the original file because a rename() operation will not */
|
|
||||||
/* automatically delete it for us on DOS and Windows the way it does on POSIX systems */
|
|
||||||
else { /* if we do not need to back up the original file */
|
|
||||||
chmod( filename, S_IRUSR|S_IWUSR ); /* make it writeable (in case it's not) so that it can be deleted. */
|
|
||||||
remove( filename ); /* delete the original file */
|
|
||||||
/* we don't check for error returns for this, since any error message about its failure will just */
|
|
||||||
/* confuse the user. "What? Why is it deleting my file?" If this fails, the next rename() will fail too */
|
|
||||||
/* since rename() on Windows will not delete the target automatically, and the error message will from the */
|
|
||||||
/* failed rename() will tell the user what happened. */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* rename the temp file to the original file name */
|
|
||||||
if (rename( tempfilename, filename )) {
|
|
||||||
emsg( EMSG_RENAMETMP, tempfilename, filename, strerror( errno ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove the temp file name from the global for our */
|
|
||||||
/* signal handler*/
|
|
||||||
tempfilename = NULL ;
|
|
||||||
|
|
||||||
/* free memory we allocated */
|
|
||||||
if (!overwrite && bakfilename != NULL)
|
|
||||||
free( bakfilename );
|
|
||||||
|
|
||||||
if (preserve) {
|
|
||||||
/* change to the original file time */
|
|
||||||
utime( filename, &filetimebuf );
|
|
||||||
#if defined(UNIX)
|
|
||||||
/* Change the owner to the owner of the original file. */
|
|
||||||
/* We ignore errors since the user might simply want */
|
|
||||||
/* to use -p to set the file time, and not being root, */
|
|
||||||
/* chown() will fail on Linux. However, we issue an error */
|
|
||||||
/* message if the user wants verbosity. */
|
|
||||||
if (chown( filename, ownerid, groupid ) && verbose)
|
|
||||||
emsg( EMSG_CHOWN, filename );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* change the file mode to reflect the original file mode */
|
|
||||||
chmod( filename, origfilemode );
|
|
||||||
|
|
||||||
} /* stdin was not redirected */
|
|
||||||
|
|
||||||
return err ;
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
tofrodos.h Converts text files between DOS and Unix formats.
|
|
||||||
Copyright (c) 1996-2005 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
$Id: tofrodos.h,v 1.2 2005/03/06 05:40:49 chris Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(TOFRODOS_H_INCLUDED)
|
|
||||||
#define TOFRODOS_H_INCLUDED
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define UNIXTODOS 0 /* convert from Unix to DOS format */
|
|
||||||
#define DOSTOUNIX 1 /* convert from DOS to Unix format */
|
|
||||||
|
|
||||||
#define EXIT_ERROR 1 /* exit code on error */
|
|
||||||
#define FROMDOSNAME "fromdos"
|
|
||||||
#define FROMDOSNAME2 "dos2unix"
|
|
||||||
#define TODOSNAME "todos"
|
|
||||||
#define TODOSNAME2 "unix2dos"
|
|
||||||
|
|
||||||
/* conditional macros - depends on system and/or compiler */
|
|
||||||
#if defined(MSDOS) || defined(WIN32) /* MSDOS and WIN32 system */
|
|
||||||
#define DEFDIRECTION UNIXTODOS
|
|
||||||
#else /* all systems other than DOS */
|
|
||||||
#define DEFDIRECTION DOSTOUNIX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* global variables */
|
|
||||||
extern int abortonerr ; /* 1 = abort list of files if error in any */
|
|
||||||
extern int alwaysconvert ; /* convert all \r\n to \r\r\n when direction */
|
|
||||||
/* is UNIXTODOS, and delete all \r when direction is */
|
|
||||||
/* DOSTOUNIX */
|
|
||||||
extern int direction ; /* UNIXTODOS or DOSTOUNIX */
|
|
||||||
extern int forcewrite ; /* convert even if file is not writeable */
|
|
||||||
extern char * errorlogfilename ; /* name of error log file, NULL if we're printing to stderr */
|
|
||||||
extern int overwrite ; /* 1 = overwrite (default), 0 = make backup */
|
|
||||||
extern int preserve ; /* 1 if we are to preserve owner (Unix) and date (all) */
|
|
||||||
extern char * progname ; /* name of binary */
|
|
||||||
extern int verbose ; /* 1 = be noisy, 0 = shut up */
|
|
||||||
|
|
||||||
/* function prototypes */
|
|
||||||
extern int init ( char * firstarg );
|
|
||||||
extern int parseargs ( int argc, char ** argv );
|
|
||||||
#if defined(__WATCOMC__) /* sighandler() never returns */
|
|
||||||
#pragma aux sighandler aborts
|
|
||||||
#endif
|
|
||||||
extern void sighandler ( int sig );
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,68 +0,0 @@
|
||||||
/*
|
|
||||||
utility.c Utility functions.
|
|
||||||
Copyright (c) 1996,1997 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
$Id: utility.c,v 1.3 2005/03/07 13:40:52 chris Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this should always be first */
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
/* standard headers */
|
|
||||||
#include <string.h> /* strdup() */
|
|
||||||
#include <stdlib.h> /* malloc() */
|
|
||||||
|
|
||||||
/* our headers */
|
|
||||||
#include "emsg.h"
|
|
||||||
#include "tofrodos.h"
|
|
||||||
#include "utility.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
errnomem
|
|
||||||
|
|
||||||
Display error message about being out of memory, and exits.
|
|
||||||
It never returns.
|
|
||||||
|
|
||||||
WARNING: It must never return. All code assumes it does not
|
|
||||||
return. Also in Watcom, we define it as a function which does
|
|
||||||
not return (see utility.h) so that the optimiser can jump to
|
|
||||||
this function (instead of calling it).
|
|
||||||
*/
|
|
||||||
void errnomem ( int exitcode )
|
|
||||||
{
|
|
||||||
emsg( EMSG_NOMEM );
|
|
||||||
exit( exitcode );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
xmalloc
|
|
||||||
|
|
||||||
Does the same thing as malloc() except that it never returns
|
|
||||||
a NULL pointer. It aborts with an error message on running
|
|
||||||
out of memory.
|
|
||||||
*/
|
|
||||||
void * xmalloc ( size_t len )
|
|
||||||
{
|
|
||||||
void * ptr ;
|
|
||||||
|
|
||||||
if ((ptr = malloc( len )) == NULL)
|
|
||||||
errnomem( EXIT_ERROR );
|
|
||||||
return ptr ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
xstrdup
|
|
||||||
|
|
||||||
Same as strdup(). Only, it never returns a NULL pointer.
|
|
||||||
If memory could not be allocated, it exits with an error
|
|
||||||
message.
|
|
||||||
*/
|
|
||||||
char * xstrdup ( const char * s )
|
|
||||||
{
|
|
||||||
char * t ;
|
|
||||||
|
|
||||||
if ((t = strdup( s )) == NULL)
|
|
||||||
errnomem( EXIT_ERROR );
|
|
||||||
return t ;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
utility.h Utility functions.
|
|
||||||
Copyright (c) 1996,1997 by Christopher Heng. All rights reserved.
|
|
||||||
|
|
||||||
$Id: utility.h,v 1.1 2004/10/01 12:33:39 chris Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(UTILITY_H_INCLUDED)
|
|
||||||
#define UTILITY_H_INCLUDED
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* function declarations */
|
|
||||||
#if defined(__WATCOMC__) /* errnomem() never returns */
|
|
||||||
#pragma aux errnomem aborts
|
|
||||||
#endif
|
|
||||||
extern void errnomem ( int exitcode );
|
|
||||||
extern void * xmalloc ( size_t len );
|
|
||||||
extern char * xstrdup( const char * s );
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,16 +0,0 @@
|
||||||
/*
|
|
||||||
version.h Version number header.
|
|
||||||
Copyright 1996-2013 Christopher Heng. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(VERSION_H_INCLUDED)
|
|
||||||
#define VERSION_H_INCLUDED
|
|
||||||
|
|
||||||
/* macros */
|
|
||||||
#define VERSN_MAJOR 1
|
|
||||||
#define VERSN_MINOR 7
|
|
||||||
#define VERSN_PATCH 13
|
|
||||||
|
|
||||||
#define VERSN_PROGNAME "tofrodos"
|
|
||||||
|
|
||||||
#endif
|
|
Binary file not shown.
|
@ -1,182 +0,0 @@
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
||||||
<head>
|
|
||||||
<!-- Copyright 1996-2013 Christopher Heng. All rights reserved. -->
|
|
||||||
<title>tofrodos - Converts text files between MSDOS and Unix file formats</title>
|
|
||||||
<style type="text/css">
|
|
||||||
h1, h2, p { font-family: Arial, Helvetica, sans-serif ; }
|
|
||||||
dt {
|
|
||||||
font-family: Arial, Helvetica, sans-serif ;
|
|
||||||
font-weight: bold ;
|
|
||||||
}
|
|
||||||
dd {
|
|
||||||
font-family: Arial, Helvetica, sans-serif ;
|
|
||||||
}
|
|
||||||
span.programname {
|
|
||||||
font-weight: bold ;
|
|
||||||
}
|
|
||||||
span.optionchar {
|
|
||||||
font-weight: bold ;
|
|
||||||
}
|
|
||||||
span.filename {
|
|
||||||
font-family: "Courier New", Courier, monospace ;
|
|
||||||
}
|
|
||||||
p.copyright {
|
|
||||||
font-family: Arial, Helvetica, sans-serif ;
|
|
||||||
font-size: 90% ;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1>Tofrodos - Converts text files between MSDOS and Unix file formats</h1>
|
|
||||||
|
|
||||||
<h2>Synopsis</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<span class="programname">fromdos</span> [options] [<span class="filename">file...</span>]<br />
|
|
||||||
<span class="programname">todos</span> [options] [<span class="filename">file...</span>]<br />
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Description</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
DOS text files traditionally have carriage return and line feed pairs
|
|
||||||
as their newline characters while Unix text files have the line feed
|
|
||||||
as their newline character. <span class="programname">fromdos</span>
|
|
||||||
converts ASCII and Unicode UTF-8 text files from the DOS format to the Unix format, while
|
|
||||||
<span class="programname">todos</span>
|
|
||||||
converts them from the Unix format to the DOS format.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The programs accept multiple filenames and wildcards as their arguments.
|
|
||||||
You may also use them in a pipe.
|
|
||||||
If either program finds its input redirected, it will process stdin
|
|
||||||
and place the output on stdout.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Options</h2>
|
|
||||||
|
|
||||||
<dl title="List of options available for Tofrodos">
|
|
||||||
<dt>-a</dt>
|
|
||||||
<dd>
|
|
||||||
This option is deprecated. Do not use it unless you know what you're doing. By default,
|
|
||||||
Tofrodos does the expected thing for text files. That is, when converting from
|
|
||||||
DOS to Unix, it will remove carriage returns only if they are followed by line feeds.
|
|
||||||
When converting from Unix to DOS, it will add carriage returns only if the linefeeds
|
|
||||||
are not already preceeded by carriage returns. When Tofrodos is run on a normal text file that
|
|
||||||
has already been converted, the resulting file should be identical to the original. However,
|
|
||||||
if you use this option, the program will always remove carriage returns in the DOS to Unix mode
|
|
||||||
and always add carriage returns in the Unix to DOS mode even if it is not appropriate.
|
|
||||||
</dd>
|
|
||||||
<dt>-b</dt>
|
|
||||||
<dd>
|
|
||||||
Make a backup of original file. The original file is renamed
|
|
||||||
with a <span class="filename">.bak</span> extension appended to the original
|
|
||||||
filename, silently replacing any existing file of that name. For example,
|
|
||||||
"<span class="filename">filename.ext</span>" becomes
|
|
||||||
"<span class="filename">filename.ext.bak</span>" replacing any existing file
|
|
||||||
having the name "<span class="filename">filename.ext.bak</span>". Important: the program behaves
|
|
||||||
differently if it is compiled for DOS (as compared to being compiled for Windows, Linux,
|
|
||||||
Mac OS X or other systems). In view of the filename restrictions present on DOS, the DOS executable
|
|
||||||
will strip the original file extension, if any, from the file
|
|
||||||
before appending the <span class="filename">.bak</span> extension. For example,
|
|
||||||
"<span class="filename">filename.ext</span>" becomes "<span class="filename">filename.bak</span>".
|
|
||||||
</dd>
|
|
||||||
<dt>-d</dt>
|
|
||||||
<dd>
|
|
||||||
Convert from DOS to Unix. This forces the program to convert the file in
|
|
||||||
a particular direction. By default, if the program is named
|
|
||||||
<span class="programname">fromdos</span> or <span class="programname">dos2unix</span>
|
|
||||||
it will assume that the input file is in a DOS format and convert it to
|
|
||||||
a Unix format. If the program is named <span class="programname">todos</span> or
|
|
||||||
<span class="programname">unix2dos</span> it will assume that the input file is in a Unix format and convert it to
|
|
||||||
a DOS format. Using the <span class="optionchar">-d</span> option forces the program to convert from a DOS
|
|
||||||
format to a Unix format regardless of how the program is named. Likewise, using the
|
|
||||||
<span class="optionchar">-u</span> option forces the program to convert from a Unix format to a DOS format
|
|
||||||
regardless of the name of the program.
|
|
||||||
</dd>
|
|
||||||
<dt>-e</dt>
|
|
||||||
<dd>
|
|
||||||
Abort processing on any error in any file. Normally, the program will
|
|
||||||
simply skip to process the next file on the command line when it encounters
|
|
||||||
any errors. This option causes it to abort on errors.
|
|
||||||
</dd>
|
|
||||||
<dt>-f</dt>
|
|
||||||
<dd>
|
|
||||||
Force: convert even if the file is not writeable (read-only). By default,
|
|
||||||
if the program finds that the file does not have write permission, it will not process
|
|
||||||
that file. This option forces the conversion even if the file is read-only.
|
|
||||||
</dd>
|
|
||||||
<dt>-h</dt>
|
|
||||||
<dd>
|
|
||||||
Display a short help screen on the program usage and quit.
|
|
||||||
</dd>
|
|
||||||
<dt>-l <logfile></dt>
|
|
||||||
<dd>
|
|
||||||
Log error messages to <logfile>. Note that if your command line has an
|
|
||||||
error, such as when you specify an unknown option, the error message for the
|
|
||||||
command line option error will be issued to stderr instead and not logged.
|
|
||||||
</dd>
|
|
||||||
<dt>-o</dt>
|
|
||||||
<dd>
|
|
||||||
Overwrite the original file (no backup). This is the default.
|
|
||||||
</dd>
|
|
||||||
<dt>-p</dt>
|
|
||||||
<dd>
|
|
||||||
Preserve file ownership and time on Unix-type systems (like Linux). On Windows and MSDOS, it only
|
|
||||||
preserves the file time. Note that on many Unix-type systems, including Linux, the file
|
|
||||||
ownership will only be preserved if the program is run as root, otherwise it
|
|
||||||
will just set the file time and silently fail the change of file
|
|
||||||
ownership. On such systems, if you want a warning message when the file ownership
|
|
||||||
cannot be changed, use <span class="optionchar">-v</span> (the verbose flag) as well.
|
|
||||||
</dd>
|
|
||||||
<dt>-u</dt>
|
|
||||||
<dd>
|
|
||||||
Convert from Unix to DOS. See the <span class="optionchar">-d</span> option above for more information.
|
|
||||||
</dd>
|
|
||||||
<dt>-v</dt>
|
|
||||||
<dd>
|
|
||||||
Verbose.
|
|
||||||
</dd>
|
|
||||||
<dt>-V</dt>
|
|
||||||
<dd>
|
|
||||||
Show version message and quit.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2>Exit Code</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Tofrodos terminates with an exit code of 0 on success and 1 on error.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
If the program is invoked with multiple files on the command line, the default behaviour is to skip to the next
|
|
||||||
file in the list if an error is encountered with any file. In such a case, the exit code returned will the
|
|
||||||
status of the last file processed (ie, 0 on success, 1 on failure). If this is not desirable, use the
|
|
||||||
<span class="optionchar">-e</span> option, which will force the program to abort immediately with the appropriate exit
|
|
||||||
code on encountering any error.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Author</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The program and its documentation are copyrighted © 1996-2013 by
|
|
||||||
Christopher Heng. All rights reserved. They are distributed under
|
|
||||||
the terms of the GNU General Public License Version 2.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The latest version of Tofrodos can be obtained from
|
|
||||||
<a href="http://www.thefreecountry.com/tofrodos/index.shtml" target="_top">http://www.thefreecountry.com/tofrodos/index.shtml</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<p class="copyright">
|
|
||||||
Copyright © 1996-2013 Christopher Heng. All rights reserved.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,23 +0,0 @@
|
||||||
Begin4
|
|
||||||
Title: tofrodos
|
|
||||||
Version: 1.7.13
|
|
||||||
Entered-date: 2013-10-25
|
|
||||||
Description: DOS text files traditionally have CR/LF (carriage return
|
|
||||||
and line feed) pairs as their new line delimiters while
|
|
||||||
Unix text files traditionally have LFs (line feeds) to
|
|
||||||
terminate each line.
|
|
||||||
tofrodos comprises two programs, "fromdos" and "todos",
|
|
||||||
which convert ASCII and Unicode UTF-8 text files to and from
|
|
||||||
these formats.
|
|
||||||
Keywords: todos, fromdos, unix2dos, dos2unix, text file, line feed,
|
|
||||||
linefeed, newline, carriage return, CR, LF, conversion,
|
|
||||||
convert, tofrodos, dostounix, unixtodos, dtou, utod, msdos,
|
|
||||||
dos, DOS
|
|
||||||
Author: Christopher Heng
|
|
||||||
Maintained-by: Christopher Heng
|
|
||||||
Primary-site: http://www.thefreecountry.com/tofrodos/index.shtml
|
|
||||||
Alternate-site:
|
|
||||||
Original-site:
|
|
||||||
Platforms: Linux, Windows, Mac OS X, FreeBSD, OpenBSD, MSDOS, FreeDOS, Unix
|
|
||||||
Copying-policy: GPL
|
|
||||||
End
|
|
Loading…
Reference in a new issue