Generate __attribute__(deprecated) for deprecated APIs.

We allow also a custom deprecation message.

Change-Id: I297bed611c7fbbb34d41e7edd796557c9afe50da
diff --git a/api/Specification.cpp b/api/Specification.cpp
index a82fd1b..362aef2 100644
--- a/api/Specification.cpp
+++ b/api/Specification.cpp
@@ -225,7 +225,7 @@
 }
 
 Definition::Definition(const std::string& name)
-    : mName(name), mDeprecated(false), mHidden(false), mFinalVersion(-1) {
+    : mName(name), mDeprecatedApiLevel(0), mHidden(false), mFinalVersion(-1) {
 }
 
 void Definition::updateFinalVersion(const VersionInfo& info) {
@@ -247,8 +247,16 @@
         mHidden = true;
     }
     if (scanner->findOptionalTag("deprecated:")) {
-        mDeprecated = true;
-        mDeprecatedMessage = scanner->getValue();
+        string value = scanner->getValue();
+        size_t pComma = value.find(", ");
+        if (pComma != string::npos) {
+            mDeprecatedMessage = value.substr(pComma + 2);
+            value.erase(pComma);
+        }
+        sscanf(value.c_str(), "%i", &mDeprecatedApiLevel);
+        if (mDeprecatedApiLevel <= 0) {
+            scanner->error() << "deprecated entries should have a level > 0\n";
+        }
     }
     if (firstOccurence) {
         if (scanner->findTag("summary:")) {
@@ -380,9 +388,6 @@
             spec->mFields.push_back(s);
             spec->mFieldComments.push_back(comment);
         }
-        if (scanner->findOptionalTag("attrib:")) {
-            spec->mAttrib = scanner->getValue();
-        }
     }
     if (scanner->findOptionalTag("enum:")) {
         spec->mKind = ENUM;
@@ -395,6 +400,9 @@
             spec->mValueComments.push_back(comment);
         }
     }
+    if (scanner->findOptionalTag("attrib:")) {
+        spec->mAttribute = scanner->getValue();
+    }
     type->scanDocumentationTags(scanner, created, specFile);
 
     scanner->findTag("end:");