]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - misc.c
Surround process protection with an #ifndef UNPROTECT
[PuTTY.git] / misc.c
diff --git a/misc.c b/misc.c
index f3a0eeddbe3d33a3e81de95a3d84c0d2454024eb..0ce3d366824c24c472922eb681dbf1e12412aa4f 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -175,7 +175,7 @@ int main(void)
     return fails != 0 ? 1 : 0;
 }
 /* Stubs to stop the rest of this module causing compile failures. */
-void modalfatalbox(char *fmt, ...) {}
+void modalfatalbox(const char *fmt, ...) {}
 int conf_get_int(Conf *conf, int primary) { return 0; }
 char *conf_get_str(Conf *conf, int primary) { return NULL; }
 #endif /* TEST_HOST_STRFOO */
@@ -460,7 +460,7 @@ char *fgetline(FILE *fp)
     int size = 512, len = 0;
     while (fgets(ret + len, size - len, fp)) {
        len += strlen(ret + len);
-       if (ret[len-1] == '\n')
+       if (len > 0 && ret[len-1] == '\n')
            break;                     /* got a newline, we're done */
        size = len + 512;
        ret = sresize(ret, size, char);
@@ -473,11 +473,29 @@ char *fgetline(FILE *fp)
     return ret;
 }
 
+/*
+ * Perl-style 'chomp', for a line we just read with fgetline. Unlike
+ * Perl chomp, however, we're deliberately forgiving of strange
+ * line-ending conventions. Also we forgive NULL on input, so you can
+ * just write 'line = chomp(fgetline(fp));' and not bother checking
+ * for NULL until afterwards.
+ */
+char *chomp(char *str)
+{
+    if (str) {
+        int len = strlen(str);
+        while (len > 0 && (str[len-1] == '\r' || str[len-1] == '\n'))
+            len--;
+        str[len] = '\0';
+    }
+    return str;
+}
+
 /* ----------------------------------------------------------------------
  * Core base64 encoding and decoding routines.
  */
 
-void base64_encode_atom(unsigned char *data, int n, char *out)
+void base64_encode_atom(const unsigned char *data, int n, char *out)
 {
     static const char base64_chars[] =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -501,7 +519,7 @@ void base64_encode_atom(unsigned char *data, int n, char *out)
        out[3] = '=';
 }
 
-int base64_decode_atom(char *atom, unsigned char *out)
+int base64_decode_atom(const char *atom, unsigned char *out)
 {
     int vals[4];
     int i, v, len;
@@ -737,7 +755,7 @@ void *safemalloc(size_t n, size_t size)
 #else
        strcpy(str, "Out of memory!");
 #endif
-       modalfatalbox(str);
+       modalfatalbox("%s", str);
     }
 #ifdef MALLOC_LOG
     if (fp)
@@ -779,7 +797,7 @@ void *saferealloc(void *ptr, size_t n, size_t size)
 #else
        strcpy(str, "Out of memory!");
 #endif
-       modalfatalbox(str);
+       modalfatalbox("%s", str);
     }
 #ifdef MALLOC_LOG
     if (fp)
@@ -812,7 +830,7 @@ void safefree(void *ptr)
  */
 
 #ifdef DEBUG
-extern void dputs(char *);             /* defined in per-platform *misc.c */
+extern void dputs(const char *); /* defined in per-platform *misc.c */
 
 void debug_printf(const char *fmt, ...)
 {
@@ -835,7 +853,7 @@ void debug_memdump(const void *buf, int len, int L)
     if (L) {
        int delta;
        debug_printf("\t%d (0x%x) bytes:\n", len, len);
-       delta = 15 & (unsigned long int) p;
+       delta = 15 & (uintptr_t)p;
        p -= delta;
        len += delta;
     }
@@ -1046,7 +1064,7 @@ int match_ssh_id(int stringlen, const void *string, const char *id)
 void *get_ssh_string(int *datalen, const void **data, int *stringlen)
 {
     void *ret;
-    int len;
+    unsigned int len;
 
     if (*datalen < 4)
         return NULL;
@@ -1069,3 +1087,14 @@ int get_ssh_uint32(int *datalen, const void **data, unsigned *ret)
     *data = (const char *)*data + 4;
     return TRUE;
 }
+
+int strstartswith(const char *s, const char *t)
+{
+    return !memcmp(s, t, strlen(t));
+}
+
+int strendswith(const char *s, const char *t)
+{
+    size_t slen = strlen(s), tlen = strlen(t);
+    return slen >= tlen && !strcmp(s + (slen - tlen), t);
+}