From 9e332b0c2bd64fe9a056a6d6a8951d16efc80ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Fri, 19 Oct 2018 11:36:15 +0200 Subject: [PATCH] [apps] Create and use StorageFunction::BaseNameCompliant --- apps/graph/base.de.i18n | 1 + apps/graph/base.en.i18n | 1 + apps/graph/base.es.i18n | 1 + apps/graph/base.fr.i18n | 1 + apps/graph/base.pt.i18n | 1 + apps/graph/list/storage_list_controller.cpp | 4 ++-- apps/shared/storage_cartesian_function.h | 1 - apps/shared/storage_function.cpp | 18 ++++++++++++++++++ apps/shared/storage_function.h | 1 + 9 files changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/graph/base.de.i18n b/apps/graph/base.de.i18n index 7d807eb92..e2c98ce08 100644 --- a/apps/graph/base.de.i18n +++ b/apps/graph/base.de.i18n @@ -19,3 +19,4 @@ NoZeroFound = "Keine Nullstelle gefunden" NoIntersectionFound = "Kein Schnittpunkt gefunden" DerivativeFunctionColumn = "Spalte der Ableitungsfunktion" HideDerivativeColumn = "Ableitungsfunktion ausblenden" +AllowedCharactersAZaz09 = "Erlaubte Zeichen: A-Z, a-z, 0-9, _" diff --git a/apps/graph/base.en.i18n b/apps/graph/base.en.i18n index 68097c93a..9c65251df 100644 --- a/apps/graph/base.en.i18n +++ b/apps/graph/base.en.i18n @@ -19,3 +19,4 @@ NoZeroFound = "No zero found" NoIntersectionFound = "No intersection found" DerivativeFunctionColumn = "Derivative function column" HideDerivativeColumn = "Hide the derivative function" +AllowedCharactersAZaz09 = "Allowed characters: A-Z, a-z, 0-9, _" diff --git a/apps/graph/base.es.i18n b/apps/graph/base.es.i18n index 6e582fe43..9d3c4d2ed 100644 --- a/apps/graph/base.es.i18n +++ b/apps/graph/base.es.i18n @@ -19,3 +19,4 @@ NoZeroFound = "Ninguna raiz encontrada" NoIntersectionFound = "Ninguna intersección encontrada" DerivativeFunctionColumn = "Columna de la derivada" HideDerivativeColumn = "Ocultar la derivada" +AllowedCharactersAZaz09 = "Caracteres permitidos : A-Z, a-z, 0-9, _" diff --git a/apps/graph/base.fr.i18n b/apps/graph/base.fr.i18n index a29d97f07..a5fb461a9 100644 --- a/apps/graph/base.fr.i18n +++ b/apps/graph/base.fr.i18n @@ -19,3 +19,4 @@ NoZeroFound = "Aucun zero trouve" NoIntersectionFound = "Aucune intersection trouvée" DerivativeFunctionColumn = "Colonne de la fonction derivee" HideDerivativeColumn = "Masquer la fonction derivee" +AllowedCharactersAZaz09 = "Caractères autorisés : A-Z, a-z, 0-9, _" diff --git a/apps/graph/base.pt.i18n b/apps/graph/base.pt.i18n index 395c16942..4917fa369 100644 --- a/apps/graph/base.pt.i18n +++ b/apps/graph/base.pt.i18n @@ -19,3 +19,4 @@ NoZeroFound = "Nenhuma raiz encontrada" NoIntersectionFound = "Nenhuma interseção encontrada" DerivativeFunctionColumn = "Coluna da funcao derivada" HideDerivativeColumn = "Esconder funcao derivada" +AllowedCharactersAZaz09 = "Caracteres permitidos : A-Z, a-z, 0-9, _" diff --git a/apps/graph/list/storage_list_controller.cpp b/apps/graph/list/storage_list_controller.cpp index 142e2a905..98b731b80 100644 --- a/apps/graph/list/storage_list_controller.cpp +++ b/apps/graph/list/storage_list_controller.cpp @@ -51,7 +51,7 @@ bool StorageListController::textFieldDidFinishEditing(TextField * textField, con } // Set the name - Ion::Storage::Record::ErrorStatus error = StorageCartesianFunction::baseNameCompliant(baseName) ? modelStore()->recordAtIndex(m_selectableTableView.selectedRow()).setBaseNameWithExtension(baseName, GlobalContext::funcExtension /*TODO store elsewhere?*/) : Ion::Storage::Record::ErrorStatus::NonCompliantName; + Ion::Storage::Record::ErrorStatus error = StorageFunction::BaseNameCompliant(baseName) ? modelStore()->recordAtIndex(m_selectableTableView.selectedRow()).setBaseNameWithExtension(baseName, GlobalContext::funcExtension /*TODO store elsewhere?*/) : Ion::Storage::Record::ErrorStatus::NonCompliantName; // Handle any error if (error == Ion::Storage::Record::ErrorStatus::None) { @@ -69,7 +69,7 @@ bool StorageListController::textFieldDidFinishEditing(TextField * textField, con } else if (error == Ion::Storage::Record::ErrorStatus::NameTaken) { app()->displayWarning(I18n::Message::NameTaken); } else if (error == Ion::Storage::Record::ErrorStatus::NonCompliantName) { - app()->displayWarning(I18n::Message::NonCompliantName); + app()->displayWarning(I18n::Message::AllowedCharactersAZaz09); } else { assert(error == Ion::Storage::Record::ErrorStatus::NotEnoughSpaceAvailable); app()->displayWarning(I18n::Message::NameTooLong); diff --git a/apps/shared/storage_cartesian_function.h b/apps/shared/storage_cartesian_function.h index 041a63fb4..f3d06adbe 100644 --- a/apps/shared/storage_cartesian_function.h +++ b/apps/shared/storage_cartesian_function.h @@ -14,7 +14,6 @@ public: StorageCartesianFunction(Ion::Storage::Record record = Record()) : StorageFunction(record) {} - static bool baseNameCompliant(const char * baseName) { return true; } // TODO TODO TODO bool displayDerivative() const; void setDisplayDerivative(bool display); int derivativeNameWithArgument(char * buffer, size_t bufferSize, char arg); diff --git a/apps/shared/storage_function.cpp b/apps/shared/storage_function.cpp index 391ed6129..f56d96913 100644 --- a/apps/shared/storage_function.cpp +++ b/apps/shared/storage_function.cpp @@ -10,6 +10,24 @@ namespace Shared { char StorageFunction::k_parenthesedArgument[]("(x)"); +bool StorageFunction::BaseNameCompliant(const char * baseName) { + if (baseName[0] == 0 || (baseName[0] >= '0' && baseName[0] <= '9')) { + // The name cannot be empty nor start with a number + return false; + } + const char * currentChar = baseName; + while (*currentChar != 0) { + if (!((*currentChar >= 'A' && *currentChar <= 'Z') + || (*currentChar >= 'a' && *currentChar <= 'z') + || (*currentChar >= '0' && *currentChar <= '9') + || *currentChar == '_')) { + return false; + } + currentChar++; + } + return true; +} + uint32_t StorageFunction::checksum() { assert(!isNull()); return checksum(); diff --git a/apps/shared/storage_function.h b/apps/shared/storage_function.h index 306206411..fe04fbe7b 100644 --- a/apps/shared/storage_function.h +++ b/apps/shared/storage_function.h @@ -10,6 +10,7 @@ class StorageFunction : public StorageExpressionModel { public: constexpr static int k_parenthesedArgumentLength = 3; constexpr static int k_maxNameWithArgumentSize = Poincare::SymbolAbstract::k_maxNameSize + k_parenthesedArgumentLength; /* Function name and null-terminating char + "(x)" */; + static bool BaseNameCompliant(const char * baseName); // Constructors StorageFunction(Ion::Storage::Record record) : StorageExpressionModel(record){}