int Melder_stringMatchesCriterion (const wchar_t *value, int which_kMelder_string, const wchar_t *criterion) { if (value == NULL) { value = L""; /* Regard null strings as empty strings, as is usual in Praat. */ } if (criterion == NULL) { criterion = L""; /* Regard null strings as empty strings, as is usual in Praat. */ } if (which_kMelder_string <= kMelder_string_NOT_EQUAL_TO) { int matchPositiveCriterion = wcsequ (value, criterion); return (which_kMelder_string == kMelder_string_EQUAL_TO) == matchPositiveCriterion; } if (which_kMelder_string <= kMelder_string_DOES_NOT_CONTAIN) { int matchPositiveCriterion = wcsstr (value, criterion) != NULL; return (which_kMelder_string == kMelder_string_CONTAINS) == matchPositiveCriterion; } if (which_kMelder_string <= kMelder_string_DOES_NOT_START_WITH) { int matchPositiveCriterion = wcsnequ (value, criterion, wcslen (criterion)); return (which_kMelder_string == kMelder_string_STARTS_WITH) == matchPositiveCriterion; } if (which_kMelder_string <= kMelder_string_DOES_NOT_END_WITH) { int criterionLength = wcslen (criterion), valueLength = wcslen (value); int matchPositiveCriterion = criterionLength <= valueLength && wcsequ (value + valueLength - criterionLength, criterion); return (which_kMelder_string == kMelder_string_ENDS_WITH) == matchPositiveCriterion; } if (which_kMelder_string == kMelder_string_MATCH_REGEXP) { wchar_t *place = NULL, *errorMessage; regexp *compiled_regexp = CompileRE (criterion, & errorMessage, 0); if (compiled_regexp == NULL) return FALSE; // BUG: what about removing errorMessage? if (ExecRE (compiled_regexp, NULL, value, NULL, 0, '\0', '\0', NULL, NULL, NULL)) place = compiled_regexp -> startp [0]; free (compiled_regexp); return place != NULL; } return 0; /* Should not occur. */ }
static void saveHistory (HyperPage me, const wchar_t *title) { if (! title) return; /* * The page title will be saved at the top. Go there. */ while (my historyPointer < 19 && my history [my historyPointer]. page) my historyPointer ++; /* * If the page title to be saved is already at the top, ignore it. */ if (my history [my historyPointer]. page) { if (wcsequ (my history [my historyPointer]. page, title)) return; } else if (my historyPointer > 0 && wcsequ (my history [my historyPointer - 1]. page, title)) { my historyPointer --; return; } /* * If the history buffer is full, shift it. */ if (my historyPointer == 19 && my history [my historyPointer]. page) { int i; Melder_free (my history [0]. page); for (i = 0; i < 19; i ++) my history [i] = my history [i + 1]; } /* * Add the page title to the top of the history list. */ my history [my historyPointer]. page = Melder_wcsdup_f (title); }
Data_Description Data_Description_findNumberUse (Data_Description structDescription, const wchar_t *string) { for (Data_Description desc = structDescription; desc -> name; desc ++) { if (desc -> max1 && wcsequ (desc -> max1, string)) return desc; if (desc -> max2 && wcsequ (desc -> max2, string)) return desc; } if (structDescription [0]. type == inheritwa) { Data_Description parentDescription = ((Data) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description (); if (parentDescription) return Data_Description_findNumberUse (parentDescription, string); } return NULL; }
Distributions Strings_to_Distributions (Strings me) { try { autoDistributions thee = Distributions_create (my numberOfStrings, 1); long idist = 0; for (long i = 1; i <= my numberOfStrings; i ++) { wchar *string = my strings [i]; long where = 0; long j = 1; for (; j <= idist; j ++) if (wcsequ (thy rowLabels [j], string)) { where = j; break; } if (where) { thy data [j] [1] += 1.0; } else { thy rowLabels [++ idist] = Melder_wcsdup (string); thy data [idist] [1] = 1.0; } } thy numberOfRows = idist; TableOfReal_sortByLabel (thee.peek(), 1, 0); return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": distribution not computed."); } }
Data_Description Data_Description_findMatch (Data_Description structDescription, const wchar_t *name) { for (Data_Description desc = structDescription; desc -> name; desc ++) if (wcsequ (name, desc -> name)) return desc; if (structDescription [0]. type == inheritwa) { Data_Description parentDescription = ((Data) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description (); if (parentDescription) return Data_Description_findMatch (parentDescription, name); } return NULL; /* Not found. */ }
void ButtonEditor::draw () { Graphics_clearWs (_g); switch (_show) { case 1: for (long i = 1, n = praat_getNumberOfMenuCommands (); i <= n; i ++) { praat_Command cmd = praat_getMenuCommand (i); if (wcsequ (cmd -> window, L"Objects")) drawMenuCommand (praat_getMenuCommand (i), i); } break; case 2: for (long i = 1, n = praat_getNumberOfMenuCommands (); i <= n; i ++) { praat_Command cmd = praat_getMenuCommand (i); if (wcsequ (cmd -> window, L"Picture")) drawMenuCommand (praat_getMenuCommand (i), i); } break; case 3: for (long i = 1, n = praat_getNumberOfMenuCommands (); i <= n; i ++) { praat_Command cmd = praat_getMenuCommand (i); if (! wcsequ (cmd -> window, L"Objects") && ! wcsequ (cmd -> window, L"Picture")) drawMenuCommand (praat_getMenuCommand (i), i); } break; case 4: for (long i = 1, n = praat_getNumberOfActions (); i <= n; i ++) { praat_Command cmd = praat_getAction (i); const wchar_t *klas = ((Data_Table) cmd -> class1) -> _className; if (wcscmp (klas, L"N") < 0) drawAction (praat_getAction (i), i); } break; case 5: for (long i = 1, n = praat_getNumberOfActions (); i <= n; i ++) { praat_Command cmd = praat_getAction (i); const wchar_t *klas = ((Data_Table) cmd -> class1) -> _className; if (wcscmp (klas, L"N") >= 0) drawAction (praat_getAction (i), i); } break; } }
static long lookUpMatchingAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, ClassInfo class4, const wchar_t *title) { /* * An action command is fully specified by its environment (the selected classes) and its title. * Precondition: * class1, class2, and class3 must be in sorted order. */ for (long i = 1; i <= theNumberOfActions; i ++) if (class1 == theActions [i]. class1 && class2 == theActions [i]. class2 && class3 == theActions [i]. class3 && class4 == theActions [i]. class4 && title && theActions [i]. title && wcsequ (theActions [i]. title, title)) return i; return 0; /* Not found. */ }
void IntervalTier_cutIntervals_minimumDuration (IntervalTier me, const wchar_t *label, double minimumDuration) { long i = 1; while (i <= my intervals -> size) { TextInterval ti = (TextInterval) my intervals -> item[i]; if ( (label == 0 || (ti -> text != 0 && wcsequ (ti -> text, label))) && ti -> xmax - ti -> xmin < minimumDuration) { IntervalTier_cutInterval (me, i, 0); } else { i++; } } }
/* Because Thing has no parent, we cannot use the macro `class_methods': */ static void _Thing_initialize (void *table); struct structThing_Table theStructThing = { _Thing_initialize, L"Thing", NULL, sizeof (struct structThing) }; Thing_Table classThing = & theStructThing; static void _Thing_initialize (void *table) { Thing_Table us = (structThing_Table*)table; us -> destroy = destroy; us -> info = info; us -> nameChanged = nameChanged; } const wchar_t * Thing_className (I) { iam (Thing); return our _className; } Any _Thing_new (void *table) { Thing_Table us = (structThing_Table*)table; Thing me = (Thing) _Melder_calloc_e (1, us -> _size); if (! me) return Melder_errorp ("(Thing_new:) Out of memory."); theTotalNumberOfThings += 1; my methods = us; my name = NULL; if (! us -> destroy) /* Table not initialized? */ us -> _initialize (us); if (Melder_debug == 39) Melder_casual ("created %ls", my methods -> _className); return me; } static int numberOfReadableClasses = 0; static void *readableClasses [1 + 1000]; static void _Thing_addOneReadableClass (Thing_Table readableClass) { if (++ numberOfReadableClasses > 1000) Melder_fatal ("(Thing_recognizeClassesByName:) Too many (1001) readable classes."); readableClasses [numberOfReadableClasses] = readableClass; readableClass -> sequentialUniqueIdOfReadableClass = numberOfReadableClasses; } void Thing_recognizeClassesByName (void *readableClass, ...) { va_list arg; void *klas; if (readableClass == NULL) return; va_start (arg, readableClass); _Thing_addOneReadableClass ((Thing_Table) readableClass); while ((klas = va_arg (arg, void*)) != NULL) { _Thing_addOneReadableClass ((Thing_Table) klas); } va_end (arg); } long Thing_listReadableClasses (void) { Melder_clearInfo (); MelderInfo_open (); for (long iclass = 1; iclass <= numberOfReadableClasses; iclass ++) { Thing_Table klas = (structThing_Table*)readableClasses [iclass]; MelderInfo_writeLine3 (Melder_integer (klas -> sequentialUniqueIdOfReadableClass), L"\t", klas -> _className); } MelderInfo_close (); return numberOfReadableClasses; } static int numberOfAliases = 0; static struct { void *readableClass; const wchar_t *otherName; } aliases [1 + 100]; void Thing_recognizeClassByOtherName (void *readableClass, const wchar_t *otherName) { aliases [++ numberOfAliases]. readableClass = readableClass; aliases [numberOfAliases]. otherName = otherName; } long Thing_version; /* Global variable! */ void *Thing_classFromClassName (const wchar_t *klas) { int i; wchar_t *space; static wchar_t buffer [1+100]; wcsncpy (buffer, klas ? klas : L"", 100); space = wcschr (buffer, ' '); if (space) { *space = '\0'; /* Strip version number. */ Thing_version = wcstol (space + 1, NULL, 10); } else { Thing_version = 0; } /* * First try the class names that were registered with Thing_recognizeClassesByName. */ for (i = 1; i <= numberOfReadableClasses; i ++) { Thing_Table table = (structThing_Table*)readableClasses [i]; if (wcsequ (buffer, table -> _className)) { if (! table -> destroy) /* Table not initialized? */ table -> _initialize (table); return table; } } /* * Then try the aliases that were registered with Thing_recognizeClassByOtherName. */ for (i = 1; i <= numberOfAliases; i ++) { if (wcsequ (buffer, aliases [i]. otherName)) { Thing_Table table = (structThing_Table*)aliases [i]. readableClass; if (! table -> destroy) /* Table not initialized? */ table -> _initialize (table); return table; } } return Melder_errorp3 (L"(Thing_classFromClassName:) Class \"", buffer, L"\" not recognized."); }
void IntervalTier_cutIntervalsOnLabelMatch (IntervalTier me, const wchar_t *label) { long i = 1; while (i < my intervals -> size) { TextInterval ti = (TextInterval) my intervals -> item[i]; TextInterval tip1 = (TextInterval) my intervals -> item[i + 1]; if ( (label == 0 || (ti -> text != 0 && wcsequ (ti -> text, label))) && (Melder_wcscmp (ti -> text, tip1 -> text) == 0)) { IntervalTier_cutInterval (me, i, 1); } else { i++; } } }
END static void cb_ERPWindow_publication (Editor editor, void *closure, Data publication) { (void) editor; (void) closure; /* * Keep the gate for error handling. */ try { praat_new (publication, NULL); praat_updateSelection (); if (Thing_member (publication, classSpectrum) && wcsequ (Thing_getName (publication), L"slice")) { int IOBJECT; LOOP { iam (Spectrum); autoSpectrumEditor editor2 = SpectrumEditor_create (ID_AND_FULL_NAME, me); praat_installEditor (editor2.transfer(), IOBJECT); } } } catch (MelderError) { Melder_flushError (NULL); } }
static double searchToken (ManPages me, long ipage, wchar_t *token) { double goodness = 0.0; ManPage page = (ManPage) my pages -> item [ipage]; struct structManPage_Paragraph *par = & page -> paragraphs [0]; if (! token [0]) return 1.0; /* * Try to find a match in the title, case insensitively. */ static MelderString buffer = { 0 }; MelderString_copy (& buffer, page -> title); for (wchar_t *p = & buffer.string [0]; *p != '\0'; p ++) *p = tolower (*p); if (wcsstr (buffer.string, token)) { goodness += 300.0; /* Lots of points for a match in the title! */ if (wcsequ (buffer.string, token)) goodness += 10000.0; /* Even more points for an exact match! */ } /* * Try to find a match in the paragraphs, case-insensitively. */ while (par -> type) { if (par -> text) { wchar_t *ptoken; MelderString_copy (& buffer, par -> text); for (wchar_t *p = & buffer.string [0]; *p != '\0'; p ++) *p = tolower (*p); ptoken = wcsstr (buffer.string, token); if (ptoken) { goodness += 10.0; /* Ten points for every paragraph with a match! */ if (wcsstr (ptoken + wcslen (token), token)) { goodness += 1.0; /* One point for every second occurrence in a paragraph! */ } } } par ++; } return goodness; }
int ButtonEditor::goToPage (const wchar_t *title) { if (! title || ! title [0]) return 0; if (wcsequ (title, L"Buttons")) return 1; switch (title [0]) { case 'a': { /* Toggle visibility of action.*/ long i = wcstol (& title [1], NULL, 10); praat_Command action = praat_getAction (i); if (! action) return 0; if (action -> hidden) praat_showAction (action -> class1, action -> class2, action -> class3, action -> title); else praat_hideAction (action -> class1, action -> class2, action -> class3, action -> title); } break; case 'm': { /* Toggle visibility of menu command. */ long i = wcstol (& title [1], NULL, 10); praat_Command menuCommand = praat_getMenuCommand (i); if (! menuCommand) return 0; if (menuCommand -> hidden) praat_showMenuCommand (menuCommand -> window, menuCommand -> menu, menuCommand -> title); else praat_hideMenuCommand (menuCommand -> window, menuCommand -> menu, menuCommand -> title); } break; case 'e': { /* Execute action. */ long i = wcstol (& title [1], NULL, 10); praat_Command action = praat_getAction (i); if (! action || ! action -> callback) return 0; if (action -> title) { UiForm::history.write (L"\n"); UiForm::history.write (action -> title); } if (action -> script) { if (! DO_RunTheScriptFromAnyAddedMenuCommand (NULL, action -> script, NULL, NULL, false, NULL)) Melder_flushError ("Command not executed."); } else { if (! action -> callback (NULL, NULL, NULL, NULL, false, NULL)) Melder_flushError ("Command not executed."); } praat_updateSelection (); } break; case 'p': { /* Perform menu command. */ long i = wcstol (& title [1], NULL, 10); praat_Command menuCommand = praat_getMenuCommand (i); if (! menuCommand || ! menuCommand -> callback) return 0; if (menuCommand -> title) { UiForm::history.write (L"\n"); UiForm::history.write (menuCommand -> title); } if (menuCommand -> script) { if (! DO_RunTheScriptFromAnyAddedMenuCommand (NULL, menuCommand -> script, NULL, NULL, false, NULL)) Melder_flushError ("Command not executed."); } else { if (! menuCommand -> callback (NULL, NULL, NULL, NULL, false, NULL)) Melder_flushError ("Command not executed."); } praat_updateSelection (); } break; default: break; } return 0; }
static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int type) { #if USE_STAT /* * Initialize. */ DIR *d = NULL; try { autoMelderString filePath, searchDirectory, left, right; /* * Parse the path. * Example: in /Users/paul/sounds/h*.wav", * the search directory is "/Users/paul/sounds", * the left environment is "h", and the right environment is ".wav". */ MelderString_copy (& searchDirectory, path); wchar_t *asterisk = wcsrchr (searchDirectory. string, '*'); if (asterisk != NULL) { *asterisk = '\0'; searchDirectory. length = asterisk - searchDirectory. string; // probably superfluous, but correct wchar_t *lastSlash = wcsrchr (searchDirectory. string, Melder_DIRECTORY_SEPARATOR); if (lastSlash != NULL) { *lastSlash = '\0'; // This fixes searchDirectory. searchDirectory. length = lastSlash - searchDirectory. string; // probably superfluous, but correct MelderString_copy (& left, lastSlash + 1); } else { MelderString_copy (& left, searchDirectory. string); // quickly save... MelderString_empty (& searchDirectory); // ...before destruction } MelderString_copy (& right, asterisk + 1); } char buffer8 [1+kMelder_MAXPATH]; Melder_wcsTo8bitFileRepresentation_inline (searchDirectory. string, buffer8); d = opendir (buffer8 [0] ? buffer8 : "."); if (d == NULL) Melder_throw ("Cannot open directory ", searchDirectory. string, "."); //Melder_casual ("opened"); autoStrings me = Thing_new (Strings); my strings = NUMvector <wchar_t *> (1, 1000000); struct dirent *entry; while ((entry = readdir (d)) != NULL) { MelderString_copy (& filePath, searchDirectory. string [0] ? searchDirectory. string : L"."); MelderString_appendCharacter (& filePath, Melder_DIRECTORY_SEPARATOR); wchar_t bufferW [1+kMelder_MAXPATH]; Melder_8bitFileRepresentationToWcs_inline (entry -> d_name, bufferW); MelderString_append (& filePath, bufferW); //Melder_casual ("read %s", filePath. string); Melder_wcsTo8bitFileRepresentation_inline (filePath. string, buffer8); struct stat stats; if (stat (buffer8, & stats) != 0) { Melder_throw ("Cannot look at file ", filePath. string, "."); //stats. st_mode = -1L; } //Melder_casual ("statted %s", filePath. string); //Melder_casual ("file %s mode %s", filePath. string, Melder_integer (stats. st_mode / 4096)); if ((type == Strings_createAsFileOrDirectoryList_TYPE_FILE && S_ISREG (stats. st_mode)) || (type == Strings_createAsFileOrDirectoryList_TYPE_DIRECTORY && S_ISDIR (stats. st_mode))) { Melder_8bitFileRepresentationToWcs_inline (entry -> d_name, bufferW); unsigned long length = wcslen (bufferW); if (bufferW [0] != '.' && (left. length == 0 || wcsnequ (bufferW, left. string, left. length)) && (right. length == 0 || (length >= right. length && wcsequ (bufferW + (length - right. length), right. string)))) { my strings [++ my numberOfStrings] = Melder_wcsdup (bufferW); } } } closedir (d); Strings_sort (me.peek()); return me.transfer(); } catch (MelderError) { if (d) closedir (d); // "finally" throw; } #elif defined (_WIN32) try { wchar_t searchPath [1+kMelder_MAXPATH]; int len = wcslen (path), hasAsterisk = wcschr (path, '*') != NULL, endsInSeparator = len != 0 && path [len - 1] == '\\'; autoStrings me = Thing_new (Strings); my strings = NUMvector <wchar_t *> (1, 1000000); swprintf (searchPath, 1+kMelder_MAXPATH, L"%ls%ls%ls", path, hasAsterisk || endsInSeparator ? L"" : L"\\", hasAsterisk ? L"" : L"*"); WIN32_FIND_DATAW findData; HANDLE searchHandle = FindFirstFileW (searchPath, & findData); if (searchHandle != INVALID_HANDLE_VALUE) { do { if ((type == Strings_createAsFileOrDirectoryList_TYPE_FILE && (findData. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) || (type == Strings_createAsFileOrDirectoryList_TYPE_DIRECTORY && (findData. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)) { if (findData. cFileName [0] != '.') { my strings [++ my numberOfStrings] = Melder_wcsdup (findData. cFileName); } } } while (FindNextFileW (searchHandle, & findData)); FindClose (searchHandle); } Strings_sort (me.peek()); return me.transfer(); } catch (MelderError) { throw; } #endif }
long TableOfReal_columnLabelToIndex (TableOfReal me, const wchar_t *label) { for (long icol = 1; icol <= my numberOfColumns; icol ++) if (my columnLabels [icol] && wcsequ (my columnLabels [icol], label)) return icol; return 0; }
int HyperPage_any (I, const wchar_t *text, enum kGraphics_font font, int size, int style, double minFooterDistance, double x, double secondIndent, double topSpacing, double bottomSpacing, unsigned long method) { iam (HyperPage); double heightGuess; if (my rightMargin == 0) return 0; // Melder_assert (my rightMargin != 0); heightGuess = size * (1.2/72) * ((long) size * wcslen (text) / (int) (my rightMargin * 150)); if (! my printing) { Graphics_Link *paragraphLinks; int numberOfParagraphLinks, ilink; if (my entryHint && (method & HyperPage_USE_ENTRY_HINT) && wcsequ (text, my entryHint)) { my entryPosition = my d_y; } my d_y -= ( my previousBottomSpacing > topSpacing ? my previousBottomSpacing : topSpacing ) * size / 12.0; my d_y -= size * (1.2/72); my d_x = x; if (/* my d_y > PAGE_HEIGHT + 2.0 + heightGuess || */ my d_y < PAGE_HEIGHT - SCREEN_HEIGHT) { my d_y -= heightGuess; } else { Graphics_setFont (my g, font); Graphics_setFontSize (my g, size); Graphics_setWrapWidth (my g, my rightMargin - x - 0.1); Graphics_setSecondIndent (my g, secondIndent); Graphics_setFontStyle (my g, style); Graphics_text (my g, my d_x, my d_y, text); numberOfParagraphLinks = Graphics_getLinks (& paragraphLinks); if (my links) for (ilink = 1; ilink <= numberOfParagraphLinks; ilink ++) { HyperLink link = HyperLink_create (paragraphLinks [ilink]. name, paragraphLinks [ilink]. x1, paragraphLinks [ilink]. x2, paragraphLinks [ilink]. y1, paragraphLinks [ilink]. y2); Collection_addItem (my links, link); } if (method & HyperPage_ADD_BORDER) { Graphics_setLineWidth (my g, 2); Graphics_line (my g, 0.0, my d_y, my rightMargin, my d_y); Graphics_setLineWidth (my g, 1); } /* * The text may have wrapped. * Ask the Graphics manager by how much, and update our text position accordingly. */ my d_y = Graphics_inqTextY (my g); } } else { Graphics_setFont (my ps, font); Graphics_setFontSize (my ps, size); my d_y -= my d_y == PAPER_TOP - TOP_MARGIN ? 0 : ( my previousBottomSpacing > topSpacing ? my previousBottomSpacing : topSpacing ) * size / 12.0; my d_y -= size * (1.2/72); if (my d_y < PAPER_BOTTOM + BOTTOM_MARGIN + minFooterDistance + size * (1.2/72) * (wcslen (text) / (6.0 * 10))) { Graphics_nextSheetOfPaper (my ps); if (my d_printingPageNumber) my d_printingPageNumber ++; HyperPage_initSheetOfPaper (me); Graphics_setFont (my ps, font); Graphics_setFontSize (my ps, size); my d_y -= size * (1.2/72); } my d_x = 0.7 + x; Graphics_setWrapWidth (my ps, 6.0 - x); Graphics_setSecondIndent (my ps, secondIndent); Graphics_setFontStyle (my ps, style); Graphics_text (my ps, my d_x, my d_y, text); if (method & HyperPage_ADD_BORDER) { Graphics_setLineWidth (my ps, 3); /*Graphics_line (my ps, 0.7, my d_y, 6.7, my d_y);*/ Graphics_line (my ps, 0.7, my d_y + size * (1.2/72) + 0.07, 6.7, my d_y + size * (1.2/72) + 0.07); Graphics_setLineWidth (my ps, 1); } my d_y = Graphics_inqTextY (my ps); } my previousBottomSpacing = bottomSpacing; return 1; }
Speaker Speaker_create (wchar_t *kindOfSpeaker, int numberOfVocalCordMasses) { Speaker me = Thing_new (Speaker); /* Supralaryngeal dimensions are taken from P. Mermelstein (1973): */ /* "Articulatory model for the study of speech production", */ /* Journal of the Acoustical Society of America 53,1070 - 1082. */ /* That was a male speaker, so we need scaling for other speakers: */ double scaling; if (! me) return NULL; if (wcsequ (kindOfSpeaker, L"Male")) my relativeSize = 1.1; else if (wcsequ (kindOfSpeaker, L"Child")) my relativeSize = 0.7; else my relativeSize = 1.0; scaling = my relativeSize; /* Laryngeal system. Data for male speaker from Ishizaka and Flanagan. */ if (wcsequ (kindOfSpeaker, L"Female")) { my lowerCord.thickness = 1.4e-3; /* dx, in metres */ my upperCord.thickness = 0.7e-3; my cord.length = 10e-3; my lowerCord.mass = 0.02e-3; /* kilograms */ my upperCord.mass = 0.01e-3; my lowerCord.k1 = 10; /* Newtons per metre */ my upperCord.k1 = 4; } else if (wcsequ (kindOfSpeaker, L"Male")) { my lowerCord.thickness = 2.0e-3; /* dx, in metres */ my upperCord.thickness = 1.0e-3; my cord.length = 18e-3; my lowerCord.mass = 0.1e-3; /* kilograms */ my upperCord.mass = 0.05e-3; my lowerCord.k1 = 12; /* Newtons per metre */ my upperCord.k1 = 4; } else /* "Child" */ { my lowerCord.thickness = 0.7e-3; /* dx, in metres */ my upperCord.thickness = 0.3e-3; my cord.length = 6e-3; my lowerCord.mass = 0.003e-3; /* kilograms */ my upperCord.mass = 0.002e-3; my lowerCord.k1 = 6; /* Newtons per metre */ my upperCord.k1 = 2; } my cord.numberOfMasses = numberOfVocalCordMasses; if (numberOfVocalCordMasses == 1) { my lowerCord.thickness += my upperCord.thickness; my lowerCord.mass += my upperCord.mass; my lowerCord.k1 += my upperCord.k1; } /* Supralaryngeal system. Data from Mermelstein. */ my velum.x = -0.031 * scaling; my velum.y = 0.023 * scaling; my velum.a = atan2 (my velum.y, my velum.x); my palate.radius = sqrt (my velum.x * my velum.x + my velum.y * my velum.y); my tip.length = 0.034 * scaling; my neutralBodyDistance = 0.086 * scaling; my alveoli.x = 0.024 * scaling; my alveoli.y = 0.0302 * scaling; my alveoli.a = atan2 (my alveoli.y, my alveoli.x); my teethCavity.dx1 = -0.009 * scaling; my teethCavity.dx2 = -0.004 * scaling; my teethCavity.dy = -0.011 * scaling; my lowerTeeth.a = -0.30; /* radians */ my lowerTeeth.r = 0.113 * scaling; /* metres */ my upperTeeth.x = 0.036 * scaling; my upperTeeth.y = 0.026 * scaling; my lowerLip.dx = 0.010 * scaling; my lowerLip.dy = -0.004 * scaling; my upperLip.dx = 0.010 * scaling; my upperLip.dy = 0.004 * scaling; my nose.Dx = 0.007 * scaling; my nose.Dz = 0.014 * scaling; my nose.weq [0] = 0.018 * scaling; my nose.weq [1] = 0.016 * scaling; my nose.weq [2] = 0.014 * scaling; my nose.weq [3] = 0.020 * scaling; my nose.weq [4] = 0.023 * scaling; my nose.weq [5] = 0.020 * scaling; my nose.weq [6] = 0.035 * scaling; my nose.weq [7] = 0.035 * scaling; my nose.weq [8] = 0.030 * scaling; my nose.weq [9] = 0.022 * scaling; my nose.weq [10] = 0.016 * scaling; my nose.weq [11] = 0.010 * scaling; my nose.weq [12] = 0.012 * scaling; my nose.weq [13] = 0.013 * scaling; return me; }
void structManual :: v_draw () { ManPages manPages = (ManPages) data; ManPage page; ManPage_Paragraph paragraph; #if motif Graphics_clearWs (g); #endif if (path == SEARCH_PAGE) { HyperPage_pageTitle (this, L"Best matches"); HyperPage_intro (this, L"The best matches to your query seem to be:"); for (int i = 1; i <= numberOfMatches; i ++) { wchar link [300]; page = (ManPage) manPages -> pages -> item [matches [i]]; swprintf (link, 300, L"\\bu @@%ls", page -> title); HyperPage_listItem (this, link); } return; } page = (ManPage) manPages -> pages -> item [path]; if (! paragraphs) return; HyperPage_pageTitle (this, page -> title); for (paragraph = & page -> paragraphs [0]; paragraph -> type != 0; paragraph ++) { switch (paragraph -> type) { case kManPage_type_INTRO: HyperPage_intro (this, paragraph -> text); break; case kManPage_type_ENTRY: HyperPage_entry (this, paragraph -> text); break; case kManPage_type_NORMAL: HyperPage_paragraph (this, paragraph -> text); break; case kManPage_type_LIST_ITEM: HyperPage_listItem (this, paragraph -> text); break; case kManPage_type_TAG: HyperPage_listTag (this, paragraph -> text); break; case kManPage_type_DEFINITION: HyperPage_definition (this, paragraph -> text); break; case kManPage_type_CODE: HyperPage_code (this, paragraph -> text); break; case kManPage_type_PROTOTYPE: HyperPage_prototype (this, paragraph -> text); break; case kManPage_type_FORMULA: HyperPage_formula (this, paragraph -> text); break; case kManPage_type_PICTURE: HyperPage_picture (this, paragraph -> width, paragraph -> height, paragraph -> draw); break; case kManPage_type_SCRIPT: HyperPage_script (this, paragraph -> width, paragraph -> height, paragraph -> text); break; case kManPage_type_LIST_ITEM1: HyperPage_listItem1 (this, paragraph -> text); break; case kManPage_type_LIST_ITEM2: HyperPage_listItem2 (this, paragraph -> text); break; case kManPage_type_LIST_ITEM3: HyperPage_listItem3 (this, paragraph -> text); break; case kManPage_type_TAG1: HyperPage_listTag1 (this, paragraph -> text); break; case kManPage_type_TAG2: HyperPage_listTag2 (this, paragraph -> text); break; case kManPage_type_TAG3: HyperPage_listTag3 (this, paragraph -> text); break; case kManPage_type_DEFINITION1: HyperPage_definition1 (this, paragraph -> text); break; case kManPage_type_DEFINITION2: HyperPage_definition2 (this, paragraph -> text); break; case kManPage_type_DEFINITION3: HyperPage_definition3 (this, paragraph -> text); break; case kManPage_type_CODE1: HyperPage_code1 (this, paragraph -> text); break; case kManPage_type_CODE2: HyperPage_code2 (this, paragraph -> text); break; case kManPage_type_CODE3: HyperPage_code3 (this, paragraph -> text); break; case kManPage_type_CODE4: HyperPage_code4 (this, paragraph -> text); break; case kManPage_type_CODE5: HyperPage_code5 (this, paragraph -> text); break; default: break; } } if (ManPages_uniqueLinksHither (manPages, path)) { long ilink, jlink, lastParagraph = 0; int goAhead = TRUE; while (page -> paragraphs [lastParagraph]. type != 0) lastParagraph ++; if (lastParagraph > 0) { const wchar *text = page -> paragraphs [lastParagraph - 1]. text; if (text == NULL || text [0] == '\0' || text [wcslen (text) - 1] != ':') { if (printing && suppressLinksHither) goAhead = FALSE; else HyperPage_entry (this, L"Links to this page"); } } if (goAhead) for (ilink = 1; ilink <= page -> nlinksHither; ilink ++) { long link = page -> linksHither [ilink]; int alreadyShown = FALSE; for (jlink = 1; jlink <= page -> nlinksThither; jlink ++) if (page -> linksThither [jlink] == link) alreadyShown = TRUE; if (! alreadyShown) { const wchar *title = ((ManPage) manPages -> pages -> item [page -> linksHither [ilink]]) -> title; wchar linkText [304]; swprintf (linkText, 304, L"@@%ls@", title); HyperPage_listItem (this, linkText); } } } if (! printing && page -> date) { wchar signature [100]; long date = page -> date; int imonth = date % 10000 / 100; if (imonth < 0 || imonth > 12) imonth = 0; swprintf (signature, 100, L"\\co %ls, %ld %ls %ld", wcsequ (page -> author, L"ppgb") ? L"Paul Boersma" : wcsequ (page -> author, L"djmw") ? L"David Weenink" : page -> author, date % 100, month [imonth], date / 10000); HyperPage_any (this, L"", font, fontSize, 0, 0.0, 0.0, 0.0, 0.1, 0.1, HyperPage_ADD_BORDER); HyperPage_any (this, signature, font, fontSize, Graphics_ITALIC, 0.0, 0.03, 0.0, 0.1, 0.0, 0); } }
long TableOfReal_rowLabelToIndex (TableOfReal me, const wchar_t *label) { for (long irow = 1; irow <= my numberOfRows; irow ++) if (my rowLabels [irow] && wcsequ (my rowLabels [irow], label)) return irow; return 0; }