Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/mummer-3.23/src/tigr/tigrinc.cc @ 69:33d812a61356
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 17:55:14 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/mummer-3.23/src/tigr/tigrinc.cc Tue Mar 18 17:55:14 2025 -0400 @@ -0,0 +1,415 @@ +#include "tigrinc.hh" + + +FILE * File_Open (const char * Filename, const char * Mode) + +/* Open Filename in Mode and return a pointer to its control +* block. If fail, print a message and exit. */ + + { + FILE * fp; + + fp = fopen (Filename, Mode); + if (fp == NULL) + { + fprintf (stderr, "ERROR: Could not open file %s \n", Filename); + exit (EXIT_FAILURE); + } + + return fp; + } + + + +void * Safe_calloc (size_t N, size_t Len) + +/* Allocate and return a pointer to an array of N elements of +* Len bytes each. All set to 0. Exit if fail. */ + + { + void * P; + + P = calloc (N, Len); + if (P == NULL) + { + fprintf (stderr, + "ERROR: calloc failed, there is not enough memory\n"); + exit (EXIT_FAILURE); + } + + return P; + } + + + +void * Safe_malloc (size_t Len) + +/* Allocate and return a pointer to Len bytes of memory. +* Exit if fail. */ + + { + void * P; + + P = malloc (Len); + if (P == NULL) + { + fprintf (stderr, + "ERROR: malloc failed, there is not enough memory\n"); + exit (EXIT_FAILURE); + } + + return P; + } + + + +void * Safe_realloc (void * Q, size_t Len) + +/* Reallocate memory for Q to Len bytes and return a +* pointer to the new memory. Exit if fail. */ + + { + void * P; + + P = realloc (Q, Len); + if (P == NULL) + { + fprintf (stderr, + "ERROR: realloc failed, there is not enough memory\n"); + exit (EXIT_FAILURE); + } + + return P; + } + + + +char Complement (char Ch) + +/* Returns the DNA complement of Ch . */ + + { + switch (tolower (Ch)) + { + case 'a' : + return 't'; + case 'c' : + return 'g'; + case 'g' : + return 'c'; + case 't' : + return 'a'; + case 'r' : // a or g + return 'y'; + case 'y' : // c or t + return 'r'; + case 's' : // c or g + return 's'; + case 'w' : // a or t + return 'w'; + case 'm' : // a or c + return 'k'; + case 'k' : // g or t + return 'm'; + case 'b' : // c, g or t + return 'v'; + case 'd' : // a, g or t + return 'h'; + case 'h' : // a, c or t + return 'd'; + case 'v' : // a, c or g + return 'b'; + default : // anything + return tolower (Ch); + } + } + + +bool CompareIUPAC (char x, char y) +{ + x = tolower(x); + y = tolower(y); + + if ( x == 'n' || x == 'x' || y == 'n' || y == 'x' ) + return true; + + switch ( x ) + { + case 'a' : + switch ( y ) + { + case 'a': + case 'r': + case 'w': + case 'm': + case 'd': + case 'h': + case 'v': + return true; + } + return false; + + case 'c' : + switch ( y ) + { + case 'c': + case 'y': + case 's': + case 'm': + case 'b': + case 'h': + case 'v': + return true; + } + return false; + + case 'g' : + switch ( y ) + { + case 'g': + case 'r': + case 's': + case 'k': + case 'b': + case 'd': + case 'v': + return true; + } + return false; + + case 't' : + switch ( y ) + { + case 't': + case 'y': + case 'w': + case 'k': + case 'b': + case 'd': + case 'h': + return true; + } + return false; + + case 'r' : // a or g + switch ( y ) + { + case 'r': + case 'a': + case 'g': + case 'd': + case 'v': + return true; + } + return false; + + case 'y' : // c or t + switch ( y ) + { + case 'y': + case 'c': + case 't': + case 'b': + case 'h': + return true; + } + return false; + + case 's' : // c or g + switch ( y ) + { + case 's': + case 'c': + case 'g': + case 'b': + case 'v': + return true; + } + return false; + + case 'w' : // a or t + switch ( y ) + { + case 'w': + case 'a': + case 't': + case 'd': + case 'h': + return true; + } + return false; + + case 'm' : // a or c + switch ( y ) + { + case 'm': + case 'a': + case 'c': + case 'h': + case 'v': + return true; + } + return false; + + case 'k' : // g or t + switch ( y ) + { + case 'k': + case 'g': + case 't': + case 'b': + case 'd': + return true; + } + return false; + + case 'b' : // c, g or t + switch ( y ) + { + case 'b': + case 'c': + case 'g': + case 't': + return true; + } + return false; + + case 'd' : // a, g or t + switch ( y ) + { + case 'd': + case 'a': + case 'g': + case 't': + return true; + } + return false; + + case 'h' : // a, c or t + switch ( y ) + { + case 'h': + case 'a': + case 'c': + case 't': + return true; + } + return false; + + case 'v' : // a, c or g + switch ( y ) + { + case 'v': + case 'a': + case 'c': + case 'g': + return true; + } + return false; + } + return false; +} + + +int Read_String (FILE * fp, char * & T, long int & Size, char Name [], + int Partial) + +/* Read next string from fp (assuming FASTA format) into T [1 ..] +* which has Size characters. Allocate extra memory if needed +* and adjust Size accordingly. Return TRUE if successful, FALSE +* otherwise (e.g., EOF). Partial indicates if first line has +* numbers indicating a subrange of characters to read. +*/ + + { + char * P, Line [MAX_LINE]; + long int Len, Lo, Hi; + int Ch, Ct; + + while ((Ch = fgetc (fp)) != EOF && Ch != '>') + ; + + if (Ch == EOF) + return FALSE; + + fgets (Line, MAX_LINE, fp); + Len = strlen (Line); + assert (Len > 0 && Line [Len - 1] == '\n'); + P = strtok (Line, " \t\n"); + if (P != NULL) + strcpy (Name, P); + else + Name [0] = '\0'; + Lo = 0; Hi = LONG_MAX; + if (Partial) + { + P = strtok (NULL, " \t\n"); + if (P != NULL) + { + Lo = strtol (P, NULL, 10); + P = strtok (NULL, " \t\n"); + if (P != NULL) + Hi = strtol (P, NULL, 10); + } + assert (Lo <= Hi); + } + + Ct = 0; + T [0] = '\0'; + Len = 1; + while ((Ch = fgetc (fp)) != EOF && Ch != '>') + { + if (isspace (Ch)) + continue; + + Ct ++; + if (Ct < Lo || Ct > Hi) + continue; + + if (Len >= Size) + { + Size += INCR_SIZE; + T = (char *) Safe_realloc (T, Size); + } + Ch = tolower (Ch); + + if (! isalpha (Ch) && Ch != '*') + { + fprintf (stderr, "Unexpected character `%c\' in string %s\n", + Ch, Name); + Ch = 'x'; + } + + T [Len ++] = Ch; + } + + T [Len] = '\0'; + if (Ch == '>') + ungetc (Ch, fp); + + return TRUE; + } + + + +void Reverse_Complement + (char S [], long int Lo, long int Hi) + +// Convert substring S [Lo .. Hi] to its Watson-Crick reverse +// complement + + { + char Ch; + + while (Lo <= Hi) + { + Ch = S [Hi]; + S [Hi] = Complement (S [Lo]); + S [Lo] = Complement (Ch); + Lo ++; + Hi --; + } + + return; + } +