/*
**	$VER: DLGStripFD 1.0 (11.10.95) Copyright (C) 1995 by Bernardo Innocenti
**
**	This source code is provided "AS-IS", without warranties of any kind and
**	it is subject to change without notice.  All usage is at your own risk.
**	No liability or responsibility is assumed by its author.
**
**	Use 4 chars wide TABs to read this source
**	Compile me with SAS/C 6.56 or better
**
*/


#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>

#include <pragmas/exec_sysbase_pragmas.h>
#include <pragmas/dos_pragmas.h>

#include <ctype.h>
#include <string.h>



#define PATHNAME_MAX 256



extern struct Library *DOSBase;
extern struct Library *SysBase;



static UBYTE VersionID[] =
	"$VER: DLGStripFD 1.0 (11.9.95) Copyright (C) 1995 by Bernardo Innocenti";



struct FDNode
{
	struct FDNode *fd_Next;
	ULONG fd_Size;
	UBYTE fd_Name[0];
};



ULONG __main (void)
{
	struct AnchorPath *ap;
	struct RDArgs *rdargs;
	ULONG err, len, lines, actual;
	STRPTR from = "#?.fd";
	BPTR fh;
	UBYTE *fd, *descr, *arcp;
	struct FDNode *FDList = NULL, *fdnode;


	if (ap = AllocMem (sizeof (struct AnchorPath) + PATHNAME_MAX, MEMF_CLEAR))
	{
		ap->ap_BreakBits	= SIGBREAKF_CTRL_C;
		ap->ap_Strlen		= PATHNAME_MAX;

		if (rdargs = ReadArgs ("FROM", (LONG *)&from, NULL))
		{
			err = MatchFirst (from, ap);
			FreeArgs (rdargs);
		}
		else err = IoErr();


		/* Build a list of all .fd files to process */

		while (!err)
		{
			if (fdnode = AllocVec (sizeof (struct FDNode) + strlen (ap->ap_Buf) + 1, MEMF_ANY))
			{
				fdnode->fd_Next = FDList;
				FDList = fdnode;
				fdnode->fd_Size = ap->ap_Info.fib_Size;
				strcpy (fdnode->fd_Name, ap->ap_Buf);

				err = MatchNext (ap);
			}
			else err = ERROR_NO_FREE_STORE;
		}

		MatchEnd (ap);
		FreeMem (ap, sizeof (struct AnchorPath) + PATHNAME_MAX);

		if (err == ERROR_NO_MORE_ENTRIES) err = 0;
	}
	else err = ERROR_NO_FREE_STORE;


	fdnode = FDList;

	while (!err && fdnode)
	{
		Printf ("Processing: %s...\n", fdnode->fd_Name);

		if (fdnode->fd_Size)
		{
			if (fd = AllocVec (fdnode->fd_Size + 1, MEMF_ANY))
			{
				if (fh = Open (fdnode->fd_Name, MODE_OLDFILE))
				{
					actual = Read (fh, fd, fdnode->fd_Size);
					err = IoErr();
					Close (fh);

					/* Force NULL termination */
					fd[fdnode->fd_Size] = '\0';

					if ((actual == fdnode->fd_Size) && (!err))
					{
						if (fh = Open (fdnode->fd_Name, MODE_NEWFILE))
						{
							if (FWrite (fh, fd, 0x64, 1) == 1)
							{
								descr = fd + 0x64;

								/* Strip "Short:" header */

								if (!strnicmp ("Short: ", descr, 7))
								{
									/* Skip blank spaces*/

									for (descr += 7; *descr; descr++)
										if (!isspace (*descr)) break;

									/* Calculate short description lenght */
									for (len = 0; descr[len]; len++)
										if (descr[len] == '\n') break;

									/* Write short description */
									if (FWrite (fh, descr, len, 1) != 1)
									{
										PutStr ("Write error!\n");
										err = IoErr();
										break;
									}

									descr += len - 1;

									/* Now skip rest of header */
									while (*descr)
									{
										/* Stop on double-blank line */
										if ((*descr == '\n') && (*(descr + 1) == '\n'))
											break;

										descr++;
									}

									/* Kill "Archive contents" part */
									if (arcp = strstr (descr, "Archive contents"))
									{
										while (arcp > descr)
										{
											if (*arcp == '\n')
											{
												*arcp = '\0';
												break;
											}
											arcp--;
										}
									}
								}
								else PutStr ("Not a standard Aminet readme!\n");


								/* Append rest of description (max 15 lines) */

								for (lines = 0; lines < 15; lines++)
								{
									if (!(*descr)) break;

									for (len = 0; descr[len]; len++)
										if (descr[len] == '\n')
										{
											len++;
											break;
										}

									if (FWrite (fh, descr, len, 1) != 1)
									{
										PutStr ("Write error!\n");
										err = IoErr();
										break;
									}

									descr += len;
								}
							}
							else err = IoErr();

							Close (fh);
						}
						else err = IoErr();
					}
				}
				else err = IoErr();

				FreeVec (fd);
			}
			else err = ERROR_NO_FREE_STORE;
		}

		fdnode = fdnode->fd_Next;

	}	/* End while (!err && fdnode) */


	/* Free list */

	while (fdnode = FDList)
	{
		FDList = fdnode->fd_Next;
		FreeVec (fdnode);
	}

	if (err)
	{
		PrintFault (err, "DLGStripFD");
		return RETURN_FAIL;
	}

	return RETURN_OK;
}
