summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorpixel <pixel>2003-03-18 16:00:37 +0000
committerpixel <pixel>2003-03-18 16:00:37 +0000
commitaf3debf2153eac52fec1844593d09191af23ce4d (patch)
tree2ec551de1c3206f2ca321184db0bc4aabdc208a6 /lib
parent4331fdd18a60deea4951c54f2575abed0864ca83 (diff)
Gettext
Diffstat (limited to 'lib')
-rw-r--r--lib/Action.cc1
-rw-r--r--lib/Buffer.cc1
-rw-r--r--lib/Confirm.cc1
-rw-r--r--lib/CopyJob.cc2
-rw-r--r--lib/Form.cc1
-rw-r--r--lib/GMPString.cc1
-rw-r--r--lib/Handle.cc26
-rw-r--r--lib/HttpServ.cc15
-rw-r--r--lib/IRC.cc1
-rw-r--r--lib/Input.cc35
-rw-r--r--lib/Main.cc5
-rw-r--r--lib/OutPipe.cc2
-rw-r--r--lib/String.cc11
-rw-r--r--lib/checkargs.c166
14 files changed, 138 insertions, 130 deletions
diff --git a/lib/Action.cc b/lib/Action.cc
index e5825b9..1b560ff 100644
--- a/lib/Action.cc
+++ b/lib/Action.cc
@@ -4,6 +4,7 @@
#include "BString.h"
#include "Action.h"
#include "HttpServ.h"
+#include "gettext.h"
Action * Action::start = 0;
diff --git a/lib/Buffer.cc b/lib/Buffer.cc
index db8b3ee..6dcfa6e 100644
--- a/lib/Buffer.cc
+++ b/lib/Buffer.cc
@@ -4,6 +4,7 @@
#endif
#include "Buffer.h"
#include "generic.h"
+#include "gettext.h"
Buffer::Buffer() : Handle(-1), buffer(0), zero(0), realsiz(0), bufsiz(0), ptr(0) { }
diff --git a/lib/Confirm.cc b/lib/Confirm.cc
index 18e56e6..64a623f 100644
--- a/lib/Confirm.cc
+++ b/lib/Confirm.cc
@@ -5,6 +5,7 @@
#include "Confirm.h"
#include "Buffer.h"
#include "CopyJob.h"
+#include "gettext.h"
Confirm::Confirm(const String & t, const String & m, const String & U, Action * y, Action * n) :
Action(U), tit(t), msg(m), NYes(y), NNo(n) { }
diff --git a/lib/CopyJob.cc b/lib/CopyJob.cc
index 2554654..fc2a0ca 100644
--- a/lib/CopyJob.cc
+++ b/lib/CopyJob.cc
@@ -1,8 +1,8 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include "gettext.h"
#include "CopyJob.h"
+#include "gettext.h"
CopyJob::CopyJob(Handle * as, Handle * ad, ssize_t asiz, bool ads, bool add, int ashape) : s(as), d(ad), ds(ads), dd(add), siz(asiz), cursiz(0), r(0), w(0), tw(0), shape(ashape) {
struct timezone tz;
diff --git a/lib/Form.cc b/lib/Form.cc
index fedfc3e..e0e5073 100644
--- a/lib/Form.cc
+++ b/lib/Form.cc
@@ -5,6 +5,7 @@
#include "HttpServ.h"
#include "Buffer.h"
#include "CopyJob.h"
+#include "gettext.h"
Form::Form(const String & titre, const String & url, const String & inv, String * names, String * invs,
String * defaults, String ** lists, String ** descs, int nb, Action * na) :
diff --git a/lib/GMPString.cc b/lib/GMPString.cc
index 5b2d1c6..ee4debb 100644
--- a/lib/GMPString.cc
+++ b/lib/GMPString.cc
@@ -4,6 +4,7 @@
#ifdef HAVE_GMP
#include <gmpxx.h>
#include "GMPString.h"
+#include "gettext.h"
GMPString::GMPString(const GMPString & s) : str(s.str) {
}
diff --git a/lib/Handle.cc b/lib/Handle.cc
index 255eacd..de4114e 100644
--- a/lib/Handle.cc
+++ b/lib/Handle.cc
@@ -40,7 +40,7 @@ enum {
Handle::Handle(const Handle & nh) : itell(0), h(nh.h >= 0 ? dup(nh.h) : nh.h), closed(nh.closed), nonblock(nh.closed), zfile(0), z(0)
{
#ifdef DEBUG
- std::cerr << "Duplication of handle " << nh.h << " to " << h << std::endl;
+ std::cerr << _("Duplication of handle ") << nh.h << _(" to ") << h << std::endl;
#endif
if ((h >= 0) && (nh.z)) {
SetZ(nh.z);
@@ -49,7 +49,7 @@ Handle::Handle(const Handle & nh) : itell(0), h(nh.h >= 0 ? dup(nh.h) : nh.h), c
Handle::~Handle() {
#ifdef DEBUG
- std::cerr << "Destroying handle " << h << std::endl;
+ std::cerr << _("Destroying handle ") << h << std::endl;
#endif
close();
}
@@ -57,7 +57,7 @@ Handle::~Handle() {
Handle::Handle(int nh) : h(nh), closed(false), nonblock(false), zfile(0), z(0)
{
#ifdef DEBUG
- std::cerr << "Initialising handle " << h << std::endl;
+ std::cerr << _("Initialising handle ") << h << std::endl;
#endif
}
@@ -92,7 +92,7 @@ ssize_t Handle::write(const void *cbuf, size_t count) throw (GeneralException) {
full = true;
if (nonblock) {
#ifdef DEBUG
- std::cerr << "write: throwing IOAgain for handle " << GetName() << std::endl;
+ std::cerr << _("write: throwing IOAgain for handle ") << GetName() << std::endl;
#endif
throw IOAgain();
} else {
@@ -121,7 +121,7 @@ ssize_t Handle::read(void *buf, size_t count) throw (GeneralException) {
ssize_t r;
#ifdef FULLDEBUG
- std::cerr << "read: reading " << count << " bytes from handle " << GetHandle() << std::endl;
+ std::cerr << _("read: reading ") << count << _(" bytes from handle ") << GetHandle() << std::endl;
#endif
errno = 0;
@@ -131,7 +131,7 @@ ssize_t Handle::read(void *buf, size_t count) throw (GeneralException) {
// problème lié au fait qu'il n'y a plus d'octets.
if (nonblock) {
#ifdef DEBUG
- std::cerr << "read: throwing IOAgain for handle " << GetName() << std::endl;
+ std::cerr << _("read: throwing IOAgain for handle ") << GetName() << std::endl;
#endif
throw IOAgain();
}
@@ -223,11 +223,11 @@ void Handle::close() throw (GeneralException) {
}
} else if (z) {
#ifdef DEBUG
- std::cerr << "Performing gzclose on handle " << h << std::endl;
+ std::cerr << _("Performing gzclose on handle ") << h << std::endl;
#endif
int err = gzclose(zfile);
#ifdef DEBUG
- std::cerr << "gzclose returned " << err << std::endl;
+ std::cerr << _("gzclose returned ") << err << std::endl;
#endif
if (err) {
if (err == Z_ERRNO) {
@@ -286,7 +286,7 @@ void Handle::SetZ(int az) throw (GeneralException) {
}
if (az >= 10) {
#ifdef DEBUG
- std::cerr << "Setting up zstream using inflate/deflate...\n";
+ std::cerr << _("Setting up zstream using inflate/deflate...\n");
#endif
int err;
zstrm.zalloc = Z_NULL;
@@ -318,7 +318,7 @@ void Handle::SetZ(int az) throw (GeneralException) {
format[index++] = (char) (az + '0');
format[index] = 0;
#ifdef FULLDEBUG
- std::cerr << "Performing gzdopen on handle " << h << " with mode \"" << format << "\"\n";
+ std::cerr << _("Performing gzdopen on handle ") << h << _(" with mode \"") << format << "\"\n";
#endif
if (!(zfile = gzdopen(h, format))) {
throw GeneralException(_("Was not able to gzdopen."));
@@ -331,7 +331,7 @@ ssize_t Handle::uwrite(const void * buf, size_t count) throw (GeneralException)
if (z >= 10) {
} else if (z) {
#ifdef FULLDEBUG
- std::cerr << "Performing gzwrite of " << count << " byte for handle " << h << std::endl;
+ std::cerr << _("Performing gzwrite of ") << count << _(" byte(s) for handle ") << h << std::endl;
#endif
#ifdef HAVE_WD_ZLIB
int err = gzwrite(zfile, buf, count);
@@ -358,7 +358,7 @@ ssize_t Handle::uread(void * buf, size_t count) {
if (z >= 10) {
} if (z) {
#ifdef DEBUG
- std::cerr << "Performing gzread of " << count << " byte for handle " << h << std::endl;
+ std::cerr << _("Performing gzread of ") << count << _(" byte(s) for handle ") << h << std::endl;
#endif
int err = gzread(zfile, buf, count);
if (err == -1) {
@@ -393,7 +393,7 @@ off_t Handle::seek(off_t offset, int whence) throw(GeneralException) {
if (z) {
return itell = gzseek(zfile, offset, whence);
} else {
- throw IOGeneral("Handle " + GetName() + " can't seek");
+ throw IOGeneral(_("Handle ") + GetName() + _(" can't seek"));
}
}
diff --git a/lib/HttpServ.cc b/lib/HttpServ.cc
index 2c79de7..a4101a7 100644
--- a/lib/HttpServ.cc
+++ b/lib/HttpServ.cc
@@ -8,6 +8,7 @@
#include "ReadJob.h"
#include "CopyJob.h"
#include "Task.h"
+#include "gettext.h"
String endhl = "\r\n", endnl = "\n";
@@ -44,7 +45,7 @@ ProcessRequest::ProcessRequest(Action * ap, const Socket & as, const String & an
}
String ProcessRequest::GetName() {
- return "Processing HTTP request";
+ return _("Processing HTTP request");
}
int ProcessRequest::Do() throw(GeneralException) {
@@ -138,7 +139,7 @@ int ProcessRequest::Do() throw(GeneralException) {
if (domain == "/bin") bad = false;
if (domain == "/") bad = false;
if (bad) {
- std::cerr << "Error: bad domain.\n";
+ std::cerr << _("Error: bad domain.\n");
}
} else {
// L'url sans domaine ni fichier est valide. (cela arrive sur certains navigateurs...)
@@ -172,11 +173,11 @@ int ProcessRequest::Do() throw(GeneralException) {
SendHeads(&b, GetMime(file), String("Accept-Ranges: bytes") + endhl + "Content-Length: " + (unsigned long long int) i->GetSize() + endhl, i->GetModif());
i->SetNonBlock();
a = new CopyJob(i, &s);
- std::cerr << "File found, dumping.\n";
+ std::cerr << _("File found, dumping.\n");
}
catch (IOGeneral e) {
ShowError(&b);
- std::cerr << "File not found, error showed.\n";
+ std::cerr << _("File not found, error showed.\n");
}
}
}
@@ -276,7 +277,7 @@ bool ProcessRequest::ParseUri(String & file, String & domain, String & gvars, Ha
ssize_t sppos;
*s >> t;
- std::cerr << "Read Request (1): " << t << std::endl;
+ std::cerr << _("Read Request (1): ") << t << std::endl;
int IPos = t.strchr('?');
@@ -437,13 +438,13 @@ HttpServ::HttpServ(Action * ap, int port, const String & nname) throw (GeneralEx
r = Listener.SetLocal("", port);
if (!r) {
- throw GeneralException("Initialisation of the Mini HTTP-Server failed: can't bind");
+ throw GeneralException(_("Initialisation of the Mini HTTP-Server failed: can't bind"));
}
r = Listener.Listen();
if (!r) {
- throw GeneralException("Initialisation of the Mini HTTP-Server failed: can't listen");
+ throw GeneralException(_("Initialisation of the Mini HTTP-Server failed: can't listen"));
}
Listener.SetNonBlock();
diff --git a/lib/IRC.cc b/lib/IRC.cc
index f29b2c1..54f26f1 100644
--- a/lib/IRC.cc
+++ b/lib/IRC.cc
@@ -4,6 +4,7 @@
#include "BString.h"
#include "IRC.h"
#include "HttpServ.h"
+#include "gettext.h"
ircmsg_t ircmsgs[MSG_COUNT] =
diff --git a/lib/Input.cc b/lib/Input.cc
index 9697913..8ce13cf 100644
--- a/lib/Input.cc
+++ b/lib/Input.cc
@@ -70,7 +70,7 @@ Input::Input(const String & no) throw (GeneralException) :
n(no) {
#ifdef DEBUG
- fprintf(stderr, "Opening file %s, Input at %p\n", no.to_charp(), this);
+ fprintf(stderr, _("Opening file %s, Input at %p\n"), no.to_charp(), this);
#endif
if (GetHandle() < 0) {
@@ -91,7 +91,7 @@ Input::Input(const String & no) throw (GeneralException) :
}
} else {
#ifdef DEBUG
- std::cerr << "Opening file in archive, position " << results.ptr << std::endl;
+ std::cerr << _("Opening file in archive, position ") << results.ptr << std::endl;
#endif
size = results.size;
seek(results.ptr, SEEK_SET);
@@ -151,14 +151,14 @@ off_t Input::seek(off_t offset, int whence) throw (GeneralException) {
int Input::wrapopen(const String & fname, openresults_t * results) {
#ifdef DEBUG
- std::cerr << "Wrap-opening " << fname << std::endl;
+ std::cerr << _("Wrap-opening ") << fname << std::endl;
#endif
if (fname[0] != '/') {
bool t;
t = Archive::inarchive(fname);
if (t) {
#ifdef DEBUG
- std::cerr << "Trying to open the file in archive, since it seems to be here\n";
+ std::cerr << _("Trying to open the file in archive, since it seems to be here\n");
#endif
return Archive::open(fname, results);
}
@@ -200,7 +200,7 @@ Archive::Archive(const String & fname, int atype) throw (GeneralException) :
case ARCHIVE_BUILTIN:
archive.read(buffer, 4);
if (*((Uint32 *)buffer) != BUILTIN_SIG)
- throw GeneralException("Archive: not in built-in format.");
+ throw GeneralException(_("Archive: not in built-in format."));
while (p) {
archive.read(buffer, 1);
len = *buffer;
@@ -211,7 +211,7 @@ Archive::Archive(const String & fname, int atype) throw (GeneralException) :
size = archive.readU32();
archive.read(buffer, 1);
#ifdef DEBUG
- std::cerr << "Adding file `" << ifname << "' to node `" << p->name << "'\n";
+ std::cerr << _("Adding file `") << ifname << _("' to node `") << p->name << "'\n";
#endif
t = new FileTree(ifname, size, buffer[0], p);
if (buffer[0])
@@ -223,7 +223,7 @@ Archive::Archive(const String & fname, int atype) throw (GeneralException) :
filetree.compute_ptrs(archive.tell());
break;
default:
- throw GeneralException("Archive: unsupported archive format.");
+ throw GeneralException(_("Archive: unsupported archive format."));
}
next = header;
@@ -247,11 +247,11 @@ bool Archive::inarchive(const String & fname) {
Archive * p;
for (p = header; p; p = p->next) {
#ifdef DEBUG
- std::cerr << "Looking for file `" << fname << "' in archive " << p->name << std::endl;
+ std::cerr << _("Looking for file `") << fname << _("' in archive ") << p->name << std::endl;
#endif
if (p->inarchivein(fname)) {
#ifdef DEBUG
- std::cerr << "File `" << fname << "' found in archive " << p->name << std::endl;
+ std::cerr << _("File `") << fname << _("' found in archive ") << p->name << std::endl;
#endif
return true;
}
@@ -268,7 +268,7 @@ int Archive::open(const String & fname, Input::openresults_t * results) throw (G
if (t)
return p->openin(fname, results);
}
- throw IOGeneral("File `" + fname + "' not found in archive collection.");
+ throw IOGeneral(_("File `") + fname + _("' not found in archive collection."));
}
bool Archive::inarchivein(const String & fname) {
@@ -287,8 +287,7 @@ bool Archive::inarchivein(const String & fname) {
name = "";
}
#ifdef DEBUG
- std::cerr << "inarchivein: reste = `" << reste << "' - name = `" << name << "'\n";
- std::cerr << "Checking against node `" << p->name << "'\n";
+ std::cerr << _("Checking against node `") << p->name << "'\n";
#endif
while (p) {
if (p->name == reste) {
@@ -332,10 +331,10 @@ int Archive::openin(const String & fname, Input::openresults_t * results) throw
}
if (!p)
- throw IOGeneral("File `" + fname + "' not in archive " + this->name);
+ throw IOGeneral(_("File `") + fname + _("' not in archive ") + this->name);
if (p->Child())
- throw IOGeneral("File `" + fname + "' in archive " + this->name + " is a directory - can't open.");
+ throw IOGeneral(_("File `") + fname + _("' in archive ") + this->name + _(" is a directory - can't open."));
results->name = p->name;
results->ptr = p->ptr;
@@ -354,7 +353,7 @@ Archive::FileTree::FileTree(const String & fname, size_t fsize, int ftype, Archi
prev = p;
} else {
#ifdef DEBUG
- std::cerr << "Adding `" << fname << "' as first child of node `" << father->name << "'\n";
+ std::cerr << _("Adding `") << fname << _("' as first child of node `") << father->name << "'\n";
#endif
father->child = this;
}
@@ -386,11 +385,11 @@ int Archive::FileTree::compute_ptrs(size_t cptr) {
ptr = cptr;
#ifdef DEBUG
- std::cerr << "Computed pointer for `" << name << "' = " << ptr << std::endl;
+ std::cerr << _("Computed pointer for `") << name << "' = " << ptr << std::endl;
if (child)
- std::cerr << "Node has child\n";
+ std::cerr << _("Node has child\n");
else
- std::cerr << "Node is " << size << " bytes large.\n";
+ std::cerr << _("Node is ") << size << _(" bytes large.\n");
#endif
if (child) {
diff --git a/lib/Main.cc b/lib/Main.cc
index 5571689..992f73c 100644
--- a/lib/Main.cc
+++ b/lib/Main.cc
@@ -3,6 +3,7 @@
#endif
#include "Main.h"
#include "generic.h"
+#include "gettext.h"
Main::Main() : setted(false) {}
@@ -29,11 +30,11 @@ int Main::truemain(Main * Application, int argc, char ** argv, char ** enve) {
r = e.GetCode();
}
catch (GeneralException e) {
- Base::printm(M_ERROR, "The application caused an exception: %s\n", e.GetMsg());
+ Base::printm(M_ERROR, _("The application caused an exception: %s\n"), e.GetMsg());
return -1;
}
catch (...) {
- Base::printm(M_ERROR, "The application caused an unknow exception\n");
+ Base::printm(M_ERROR, _("The application caused an unknow exception\n"));
return -1;
}
return r;
diff --git a/lib/OutPipe.cc b/lib/OutPipe.cc
index a5404d6..c8d979c 100644
--- a/lib/OutPipe.cc
+++ b/lib/OutPipe.cc
@@ -37,5 +37,5 @@ bool OutPipe::CanRead() {
}
String OutPipe::GetName() {
- return (String("Output pipe to stdin (") + (hooked ? "" : _("not ")) + _("hooked)"));
+ return (String(_("Output pipe to stdin (")) + (hooked ? "" : _("not ")) + _("hooked)"));
}
diff --git a/lib/String.cc b/lib/String.cc
index 22a9efb..53ecb83 100644
--- a/lib/String.cc
+++ b/lib/String.cc
@@ -10,6 +10,7 @@
#endif
#include "BString.h"
#include "Exceptions.h"
+#include "gettext.h"
char ** gruikptr;
@@ -22,13 +23,13 @@ char String::t[BUFSIZ + 1];
String::String(const String & s) : str(Base::strdup(s.str)), siz(s.siz) {
#ifdef DEBUG
- fprintf(stderr, "Duplicating string `%s', from %p to %p, from this %p to this %p\n", str, s.str, str, s, this);
+ fprintf(stderr, _("Duplicating string `%s', from %p to %p, from this %p to this %p\n"), str, s.str, str, s, this);
#endif
}
String::String(char c) : siz(1) {
#ifdef DEBUG
- fprintf(stderr, "Creating a string with `%c' at %p, this = %p\n", c, str, this);
+ fprintf(stderr, _("Creating a string with `%c' at %p, this = %p\n"), c, str, this);
#endif
#ifndef HAVE_ASPRINTF
char * t = (char *) malloc(2);
@@ -44,13 +45,13 @@ String::String(const char * s) : str(Base::strdup(s)), siz(::strlen(str)) {
gruikptr = &str;
}
#ifdef DEBUG
- fprintf(stderr, "Creating a string with `%s' at %p from %p, this = %p\n", str, str, s, this);
+ fprintf(stderr, _("Creating a string with `%s' at %p from %p, this = %p\n"), str, str, s, this);
#endif
}
String::String(int hs, char * s) : str(Base::strdup(s ? s : "")), siz(hs) {
#ifdef DEBUG
- fprintf(stderr, "Fast-Creating a string with `%s' at %p from %p, this = %p\n", str, str, s, this);
+ fprintf(stderr, _("Fast-Creating a string with `%s' at %p from %p, this = %p\n"), str, str, s, this);
#endif
}
@@ -111,7 +112,7 @@ String::String(double d) {
String::~String() {
#ifdef DEBUG
- fprintf(stderr, "Destroying string @ %p, freeing %p.\n", this, str);
+ fprintf(stderr, _("Destroying string @ %p, freeing %p.\n"), this, str);
#endif
free(str);
}
diff --git a/lib/checkargs.c b/lib/checkargs.c
index e1c97be..4fee446 100644
--- a/lib/checkargs.c
+++ b/lib/checkargs.c
@@ -1,85 +1,85 @@
-/* datedif - calculates the difference in days between two dates
- * Copyright (C) 2000 Micael Widell contact: xeniac@linux.nu
- *
- * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
+/* datedif - calculates the difference in days between two dates
+ * Copyright (C) 2000 Micael Widell contact: xeniac@linux.nu
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
#include <stdlib.h>
#include <string.h>
-
-int isDateArgument(char* dateString) {
-
- const int MONTHS[] = {31,0,31,30,31,30,31,31,30,31,30,31};
- int i, day, month, year;
- char buffer[5];
-
- /* 'today' is a valid date */
- if (strcmp(dateString, "today") == 0)
- return 1;
-
- /* Numeric dates must be eight characters long */
- if (8 != strlen(dateString))
- return 0;
-
- /* Check that the date is entirely formed of numbers */
- for (i = 0; i < 8; i++) {
- if (dateString[i] < '0' || dateString[i] > '9')
- return 0;
- }
-
- /* Check that the date exists */
- memset(buffer, 0, 5);
- strncpy(buffer, dateString + 6, 2);
- day = atoi(buffer);
- strncpy(buffer, dateString + 4, 2);
- month = atoi(buffer);
- month -= 1;
- strncpy(buffer, dateString, 4);
- year = atoi(buffer);
-
- /* Validate month */
- if (month < 0 || month > 11)
- return 0;
-
- /* Validating dates is simple when the date does not fall into February */
- if (1 != month) {
- if (day < 1 || day > MONTHS[month])
- return 0;
- } else {
- int feb = 28;
-
- /* Februarys are a bit tougher issue */
- if (0 == year % 4) {
- if (0 == year % 100) {
- if (0 == year % 400) {
- feb = 29;
- } else {
- feb = 28;
- }
- } else {
- feb = 29;
- }
- }
- if (day < 1 || day > feb)
- return 0;
- }
-
- /* Avoid user from using dates before 16000301, since those will result in
- incorrect output */
- if(16000301 > atoi(dateString))
- return 0;
-
- return 1;
-}
+
+int isDateArgument(char* dateString) {
+
+ const int MONTHS[] = {31,0,31,30,31,30,31,31,30,31,30,31};
+ int i, day, month, year;
+ char buffer[5];
+
+ /* 'today' is a valid date */
+ if (strcmp(dateString, "today") == 0)
+ return 1;
+
+ /* Numeric dates must be eight characters long */
+ if (8 != strlen(dateString))
+ return 0;
+
+ /* Check that the date is entirely formed of numbers */
+ for (i = 0; i < 8; i++) {
+ if (dateString[i] < '0' || dateString[i] > '9')
+ return 0;
+ }
+
+ /* Check that the date exists */
+ memset(buffer, 0, 5);
+ strncpy(buffer, dateString + 6, 2);
+ day = atoi(buffer);
+ strncpy(buffer, dateString + 4, 2);
+ month = atoi(buffer);
+ month -= 1;
+ strncpy(buffer, dateString, 4);
+ year = atoi(buffer);
+
+ /* Validate month */
+ if (month < 0 || month > 11)
+ return 0;
+
+ /* Validating dates is simple when the date does not fall into February */
+ if (1 != month) {
+ if (day < 1 || day > MONTHS[month])
+ return 0;
+ } else {
+ int feb = 28;
+
+ /* Februarys are a bit tougher issue */
+ if (0 == year % 4) {
+ if (0 == year % 100) {
+ if (0 == year % 400) {
+ feb = 29;
+ } else {
+ feb = 28;
+ }
+ } else {
+ feb = 29;
+ }
+ }
+ if (day < 1 || day > feb)
+ return 0;
+ }
+
+ /* Avoid user from using dates before 16000301, since those will result in
+ incorrect output */
+ if(16000301 > atoi(dateString))
+ return 0;
+
+ return 1;
+}